SPI传输异常:数据不匹配与RX缓冲区满问题排查求助
SPI主机发送数据不匹配问题排查求助
我正在使用SPI传输数据,数据定义为uint8_t data[5] = {0xa,0xb,0xc,0xd,0xe};,但通过逻辑分析仪观察到输出数据不匹配,不清楚问题根源,现将代码及配置附上,请求协助排查。
自定义SPI发送函数
void SPI_Transmit (uint8_t *data, int size) { SPI1->CR1 |= (1<<6); int i=0; while (i<size) { while (!((SPI1->SR)&(1<<1))) {}; // 等待TXE置位,表示发送缓冲区为空 SPI1->DR = data[i]; // 将数据加载到数据寄存器 i++; } // 通过读取DR和SR清除溢出标志 while (!((SPI1->SR)&(1<<1))) {}; // 等待TXE置位,表示发送缓冲区为空 while (((SPI1->SR)&(1<<7))) {}; // 等待BSY复位,表示SPI通信已结束 while (((SPI1->SR)&(1<<0))) { uint8_t temp = SPI1->DR; }; uint8_t temp1 = SPI1->SR; SPI1->CR1 &= ~(1<<6); }
我在传输时等待TX空标志置位及忙标志复位,传输完成后发现RX缓冲区(RXFIFO)已满且RX非空标志置位,因此需要读取数据寄存器直至RXNE复位。
我理解SPI通过寄存器移位通信,每发送一个数据就会对应接收一个数据,但我的通信为主机仅发送模式,仅使用MOSI引脚未使用MISO。我不解为何RX缓冲区仍有数据,即使未连接从设备测试时也是如此,状态寄存器显示RXNE=1、FRLVL=11。
按上述逻辑编写SPI发送函数后传输数据,逻辑分析仪显示数据不匹配,波特率为625.0KBits/s,采样率为2MS/s。
SPI初始化配置
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_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } }

内容的提问来源于stack exchange,提问作者Karthikeyan Krishnanandan
相关产品推荐
相关产品推荐

