STM32F103 SPI连续接收数据
1、概述
使用STM32F103 SPI中断连续接收较多数据,出现数据丢失的问题,把问题与解决措施做下记录。
2、问题描述
使用单片机测试板STM32F103 SPI作为从机接收较多数据(16bit),主机设置如下:

从机STM32F103 SPI RXNE中断接收如下:
点击查看代码
uint16_t spi_recv_data[100];
__IO uint16_t UART1_SendBuf_WriteIndex = 0; //写指针
__IO uint16_t UART1_SendBuf_ReadIndex = 0; //读指针
void SPI1_IRQHandler(void)
{
if (SPI_I2S_GetITStatus(SPI_1,SPI_I2S_IT_RXNE) == SET)//中断标志确认
{
SPI_I2S_ClearITPendingBit(SPI_1,SPI_I2S_IT_RXNE);//清中断标志
SPI_I2S_ITConfig(SPI_1, SPI_I2S_IT_RXNE, DISABLE);//关闭中断
spi_recv_data[UART1_SendBuf_WriteIndex++] = SPI_I2S_ReceiveData(SPI_1);//读取数据并放入缓存
if ( UART1_SendBuf_WriteIndex >= 100)
{
UART1_SendBuf_WriteIndex = 0;
}
SPI_I2S_ITConfig(SPI_1, SPI_I2S_IT_RXNE, ENABLE );//开启中断
}
}
点击查看代码
uint16_t spi_recv_data[100];
__IO uint16_t UART1_SendBuf_WriteIndex = 0; //写指针
__IO uint16_t UART1_SendBuf_ReadIndex = 0; //读指针
void SPI1_IRQHandler(void)
{
//if (SPI_I2S_GetITStatus(SPI_1,SPI_I2S_IT_RXNE) == SET)//中断标志确认
{
//SPI_I2S_ClearITPendingBit(SPI_1,SPI_I2S_IT_RXNE);//清中断标志
//SPI_I2S_ITConfig(SPI_1, SPI_I2S_IT_RXNE, DISABLE);//关闭中断
spi_recv_data[UART1_SendBuf_WriteIndex++] = SPI_I2S_ReceiveData(SPI_1);//读取数据并放入缓存
if ( UART1_SendBuf_WriteIndex >= 100)
{
UART1_SendBuf_WriteIndex = 0;
}
//SPI_I2S_ITConfig(SPI_1, SPI_I2S_IT_RXNE, ENABLE );//开启中断
}
}
中断标志确认函数SPI_I2S_GetITStatus(SPI_1,SPI_I2S_IT_RXNE) == SET内容较多、CPU时间较长,可用寄存器操作替换SPI1->SR & 0x01) == (uint16_t)SET.
清中断标志函数SPI_I2S_ClearITPendingBit(SPI_1,SPI_I2S_IT_RXNE)用在此处不当,该函数作用为Clears the SPIx CRC Error (CRCERR) interrupt pending bit.
RXNE标志清除的方法见参考手册说明,读取接收缓冲区的数据也就清除了RXNE标志位。


关闭、开启中断函数用在此处,也是错误的。
浙公网安备 33010602011771号