SPI全双工通信主机数据接收错误

2019-07-14 16:24发布

[tr]我采用stm F103 作为SPI的主机,stm F303作为从机,两者进行SPI通信,主机向从机发送一组数据,从机同时也向主机发送一组数据,从机和主机都是采用的中断方式,但是每次的结果,从机里面接收的数据都是正确的,主机接收的却是错误的。举个例子来说,主机发送5个数据给从机,从机也发送5个数据给主机,从机能够完全接收主机的5个数据,但主机只能接收从机的前3个数据。如主机发送a[5]={0x01,0x02,0x03,0x04,0x05},从机发送数据b[10]={0x21,0x22,0x23,0x24,0x25},通信完成以后,从机的接收数据是完全对的,而主机的接收数据则为a_receive[5]={0x00,0x00,0x21,0x22,0x23};下面贴出我的程序,恳请大牛们过来指点下,不胜感激!
            从机的主函数                                    


                   
  • int main(void)
  • {
  •   /* System clocks configuration ---------------------------------------------*/
  •   RCC_Configuration();
  •   /* NVIC configuration ------------------------------------------------------*/
  •   NVIC_Configuration();
  •   /* GPIO configuration ------------------------------------------------------*/
  •   GPIO_Configuration();
  •   SPI_Config();
  • //         /* Enable the Rx buffer not empty interrupt */
  •    SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
  •   /* Enable SPI2 */
  •   SPI_Cmd(SPI2, ENABLE);
  •   while(1)
  •   {
  •   }
  • }

            
            复制代码
            从机的中断函数                                    


                   
  • void SPI2_IRQHandler(void)
  • {
  •         if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) != RESET)
  •           {
  •             /* Send SPI2 data */
  •             SPI2_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData16(SPI2);
  •     /* Disable SPI1 TXE interrupt */
  •            if (Rx_Idx == BufferSize)
  •            {
  •              SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);
  •             }
  •           }
  •   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
  •      /* Send SPI1 data */
  •     SPI_I2S_SendData16(SPI2, SPI2_Buffer_Tx[Tx_Idx++]);
  • }
            
            复制代码
            主机的主函数                                    


                   
  • int main(void)
  • {
  •   /* System clocks configuration ---------------------------------------------*/
  •   RCC_Configuration();
  •   /* NVIC configuration ------------------------------------------------------*/
  •   NVIC_Configuration();
  •   /* GPIO configuration ------------------------------------------------------*/
  •   GPIO_Configuration();
  •   SPI_Config();
  •   /* Enable SPI2 */
  •           SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, ENABLE);
  •           SPI_Cmd(SPI2, ENABLE);
  •   while(1)
  •   {
  •   }
  • }
            
            复制代码
            主机的中断函数                                    


                   
  • void SPI2_IRQHandler(void)
  • {
  •   if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) != RESET);
  •   {
  •     /* Send SPI1 data */
  •     SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx++]);
  •     /* Disable SPI1 TXE interrupt */
  •      if (Tx_Idx == BufferSize)
  •      {
  •        SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, DISABLE);
  •      }
  •   }
  •         while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  •     /* Send SPI1 data */
  •      SPI2_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI2);
  • }
            
            复制代码
            
[/tr]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
szzjfyp
2019-07-15 22:32
qwert147 发表于 2018-11-1 17:53
显然你的从机发送数据的流程有错误。
从机是接收SCK的,你从机RXNE中断的时候,实际上发送数据已经也同步完成了。所以你第一个RXNE中断来的时候,实际上已经发出数据了,而在之前你要发送的数据还没有送往发送缓冲区呢,导致SPI自动发出了00数据。
应该是这样的,从机将要发送的数据首先打到发送缓冲区,填满需要2次写,因 ...

第二次写数据的时候不会被立刻发送出去吗

一周热门 更多>