
为什么调用一次HAL_SPI_TransmitReceive函数会发送4组CLK? 如图: //以下是初始化函数 void bsp_cmd_spi_init(void) { HAL_SPI_DeInit(&hspi1); // bsp_cmd_spi_gpio_init(); hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; //选择主机模式 hspi1.Init.Direction = SPI_DIRECTION_2LINES; //两线接收和发送 hspi1.Init.DataSize = SPI_DATASIZE_16BIT; //数据长度16BIT hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //CLK空闲状态为高 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; //在CLK的第二个跳变沿数据被采样 hspi1.Init.NSS = SPI_NSS_SOFT; //NSS信号由软件管理 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; //波特率4分频,84/4 = 21MHz hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; //数据传输从MSB位还是LSB位开始 hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //不使用TI模式 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //不使用CRC计算 hspi1.Init.CRCPolynomial = 0x0; //CRC多项式选择 hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; //不启用NSSP信号 hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; //NSS极性 hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; //FIFO阈值 hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; //发送CRC初始化模式 hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; //接收CRC初始化模式 hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; //主模式下插入NSS信号和第一帧数据之间的延时(时钟周期数) hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; //主模式下插入两个数据帧之间的延时(时钟周期数) hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; //主接收器模式下控制连续SPI传输以及自动管理,以避免超限情况 hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; //控制备用功能GPIO状态 hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; //转换MISO/MOSI备用功能 if (HAL_SPI_Init(&hspi1) != HAL_OK) { while(1); } } |
请教SPI用LL读取的问题
STM32H7使用HAL库如何控制外置USB HS PHY进入低功耗
请问如何在下载程序时保护flash中的用户数据不被覆盖?
H723ZG开发板的下载口可以使用串口功能吗
nanoEdgeAI部署在keil5出现的问题
stm32H755BIT6 TIM1中断问题
用cubemx配置好串口后,再配置一个adc输入就会卡在HardFault_Handler里不动了。
STM32H743使用DSP进行矩阵求逆计算出现的问题
STM32H750 定时器配置
求STM32H503或STMH723 SPI-DMA参考例程
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x0;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_ENABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
测试代码如下,使用跟你一样的API函数。
while (1)
{
uint16_t txtmp = 0xAAAA;
HAL_SPI_TransmitReceive(&hspi1,(uint8_t *)&txtmp, (uint8_t *)spiDataRx,1, 0xaaa);
}
每次发1帧16位数据,输出很规矩。你检查下,看看是否哪里误会了。
谢谢回复,搞了两天了没找到问题,不知什么原因,我把库换成最新的也是一样,没有用HAL_SPI_TransmitReceive函数,直接操作寄存器也是一样的!不过我发现一个规律:连续调HAL_SPI_TransmitReceive,CLK组数是调用次数+3,比如掉用5次CLK就是8组!
[md]哦, 我找时间再看看,能否复现你的情形。
==>后来,我这边又验证了一遍,没发现你说的问题,内存数据我放TCM还是其他RAM都问题,也尝试Cache的开关。不知你哪里出的问题。