举报
举报
针对STM32F4作为SPI从机时数据异常及状态寄存器(SR)出现0xC0、0xC1、0x80的问题,以下是逐步解决方案:
状态值分析:
0xC0(11000000): BYS=1 + OVR=10xC1(11000001): BYS=1 + OVR=1 + RXNE=10x80(10000000): BYS=1// 示例SPI从机配置代码(SPI2)
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Slave; // 从机模式
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // 与主机一致
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // 与主机一致
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // 与主机一致
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // 硬件NSS或软件NSS
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; // 从机模式下此参数无效
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; // 与主机一致
SPI_Init(SPI2, &SPI_InitStruct);解决:
// 启用SPI接收中断
SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
NVIC_EnableIRQ(SPI2_IRQn);// 中断服务程序
void SPI2_IRQHandler(void) {
if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET) {
uint8_t data = SPI_I2S_ReceiveData(SPI2); // 读取数据清除RXNE
// 处理数据...
}
}
- **方法2**:使用DMA自动传输数据。
```c
// 配置DMA接收(SPI2_RX)
DMA_Cmd(DMA1_Stream3, DISABLE);
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_Channel = DMA_Channel_0;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rx_buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Stream3, &DMA_InitStruct);
DMA_Cmd(DMA1_Stream3, ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);if (SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_OVR) == SET) {
// 清除OVR标志:先读DR,再读SR
volatile uint8_t temp = SPI2->DR;
temp = SPI2->SR;
(void)temp; // 防止编译器优化
}SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_SSOutputCmd(SPI2, ENABLE); // 使能软件NSS控制SPI2->SR的值,分析错误触发条件。通过以上步骤,应能解决SPI从机数据异常及状态寄存器错误的问题。
举报
更多回帖