[STM32] 求助,spi做从设备时,接受处理程序,只能处理第一个字节...

[复制链接]
1800|8
 楼主| any012 发表于 2016-5-18 11:52 | 显示全部楼层 |阅读模式
spi, TE, DSP, ce, se
本帖最后由 any012 于 2016-5-18 11:56 编辑

主设备连续发送4个16位的数据,第一个是0x3a05,于是想用这个数据来作为帧首判断,结果想在SPI中断里将串口接收到的数组发送出来,总是不成功。
于是精简了下函数,只发送spi2Num这个数,结果总是1...

  1. void SPI2_IRQHandler(void)
  2. {
  3.     u8 spi2Num, i;
  4.     u16 spi2Temp;
  5.     spi2Temp = SPI_I2S_ReceiveData(SPI2);
  6.     if(spi2Num == 0)
  7.     {
  8.         if(spi2Temp == 0x3a05)
  9.         {
  10.             spi2Num = 1;
  11.         }
  12.     }
  13.     else
  14.     {
  15.         spi2Num++;
  16.         if(spi2Num > 5)
  17.             spi2Num = 0;
  18.     }
  19.     printf("\r\nspi2Num: %d", spi2Num);
  20. }



aozima 发表于 2016-5-18 14:20 | 显示全部楼层
SPI从机通讯建议以CS为帧,而不要靠数据内容。
 楼主| any012 发表于 2016-5-18 14:27 | 显示全部楼层
aozima 发表于 2016-5-18 14:20
SPI从机通讯建议以CS为帧,而不要靠数据内容。

谢谢。
目前已经知道这一步问题的原因了。
是没有把spi2Num设为全局变量。
 楼主| any012 发表于 2016-5-18 14:30 | 显示全部楼层
然后又有新问题了,主机发送过来的5个16位数据,帧首是0x3a05,我修改程序后,串口把接受的数组发送过来,结果全是0x3a05。

修改后的程序:
  1. void SPI2_IRQHandler(void)
  2. {
  3.         static u16 spi2Recive[5];
  4.         static u8 spi2Num;
  5.         u8 i;
  6.         u16 spi2Temp;
  7.         spi2Temp = SPI_I2S_ReceiveData(SPI2);
  8.         if(spi2Num == 0)
  9.         {
  10.                 if(spi2Temp == 0x3a05)
  11.                 {
  12.                         spi2Num = 1;
  13.                         spi2Recive[0] = spi2Temp;
  14. //                        SPI_I2S_SendData(SPI2, spi2Temp);
  15. //                        printf("\r\nthe first data is: %x", spi2Temp);
  16.                 }
  17.         }
  18.         else
  19.         {
  20.                 spi2Recive[spi2Num] = spi2Temp;
  21.                 spi2Num++;
  22.                 if(spi2Num > 5)
  23.                 {
  24.                         spi2Num = 0;
  25.                         for(i = 0; i < 5; i++)
  26.                                 printf("\r\nspi2recive[%d]: %x", i, spi2Recive[i]);
  27. //                        SPI_I2S_SendData(SPI2, 0x3a05);
  28.                 }
  29.         }
  30. //        printf("\r\nspirecive: %x", spi2Temp);
  31.         printf("\r\nspi2Num: %d", spi2Num);
  32. }


串口法伤过来的数据:
spi2recive[0]: 3a05
spi2recive[1]: 3a05
spi2recive[2]: 3a05
spi2recive[3]: 3a05
spi2recive[4]: 3a05
spi2Num: 0
 楼主| any012 发表于 2016-5-18 14:33 | 显示全部楼层
感觉SPI中断函数只能处理第一个16位数据。
 楼主| any012 发表于 2016-5-18 14:47 | 显示全部楼层
是不是中断函数做的事太多了,除了帧首,其他的数据SPI中断没有响应过来?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
aozima 发表于 2016-5-18 14:55 | 显示全部楼层
SPI从机端建议使用DMA,以CS释放作为通信结束检查。
 楼主| any012 发表于 2016-5-18 15:12 | 显示全部楼层
aozima 发表于 2016-5-18 14:55
SPI从机端建议使用DMA,以CS释放作为通信结束检查。

谢谢您的建议。
还没用过DMA呢,抽空试试。
 楼主| any012 发表于 2016-5-19 11:43 | 显示全部楼层
精简中断处理函数后正常了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部