主机SPI发送一组数 比如A[]={"123456"}; 从机SPI接受用中断接受,每次数据都能完全发送出去,可是中断接受只能接收到12,其他的数据接收不到,初学者求解答 SPI主机发送函数如下 /****** void SPI_Send_char(SPI_TypeDef* SPIx,uint16_t ch) 发送一个字符函数 ******/ void SPI_Send_char(SPI_TypeDef* SPIx,uint32_t ch) { if(SPIx==SPI1) { SPI_I2S_SendData(SPI1,ch); while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)!=SET); } if(SPIx==SPI2) { SPI_I2S_SendData(SPI2,ch); } if(SPIx==SPI3) { SPI_I2S_SendData(SPI3,ch); while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)!=SET); } } /**** SPI_SendString(SPI_TypeDef* SPIx, uint32_t *String) 发送字符穿函数 ******/ void SPI_SendString(SPI_TypeDef* SPIx, int8_t *String) { while(*String) { SPI_Send_char(SPIx,*String); String++; } } /***** SPI_SendString_Lenth(SPI_TypeDef* SPIx, uint32_t *String,uint16_t len) 发送一定长度的字符串 *******/ void SPI_SendString_Lenth(SPI_TypeDef* SPIx, int8_t *String,uint16_t len) { uint16_t i=0; for(i=0;i<len;i++) { SPI1_End_Reindex%=SPI1_Buf_Lenth; SPI_Send_char(SPIx,*(String+SPI1_End_Reindex)); } } 从机SPI中断接受函数 void SPI1_IRQHandler() { if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE) !=RESET) { SPI1_Start_Reindex%=SPI1_Buf_Lenth; SPI1_Buf[SPI1_Start_Reindex]=SPI_I2S_ReceiveData(SPI1); SPI1_Start_Reindex++; } //if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)!=RESET) //{ // SPI_SendString_Lenth(SPI1,SPI1_Buf,SPI1_Recieve_Lenth); // SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,DISABLE); //SPI发送中断不使能 //} } |
上面的代码,信息量太少。
----------------------------------------------------------------
建议:
首先,检查SPI的初始化代码,请确认SPI的初始化是否有问题!
其次,CS引脚配置的是硬件控制还是软件控制,用示波器观察各功能引脚的波形,定位问题点阶段/位置。最后,再进行逐步分析、排查。
例如,发送端发送的字节数是否正确?是没发出去,还是接收端没动作?然后再一个一个的解决问题。
评分
查看全部评分
谢谢 这个问题解决了 出现了另外一个问题
从机收到数据后 给从机返回固定的数据主机接受会错位,比如从机收到数据给主机发送0x5555,则主机收到的有时候正确 有时候错误位0xAAAA