你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
any012 提问时间:2016-5-18 11:53 /
悬赏3ST金币已解决
本帖最后由 any012 于 2016-5-18 11:57 编辑

主设备连续发送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. }
复制代码


最佳答案

查看完整内容

spi2num又没定义成static,所以每次进入SPI2_IRQHandler,spi2num就从0开始
收藏 评论9 发布时间:2016-5-18 11:53

举报

9个回答
sting 回答时间:2016-5-18 11:53:38
spi2num又没定义成static,所以每次进入SPI2_IRQHandler,spi2num就从0开始
power568 回答时间:2016-5-18 13:41:09
支持楼上的,能出来一已经算幸运了...
any012 回答时间:2016-5-18 14:12:20
感谢楼上两位,我真该挨敲。
any012 回答时间:2016-5-18 14:26:22
本帖最后由 any012 于 2016-5-18 14:31 编辑

再请教下,将spi2Num改成全局变量后,可以打印出spi2Recive[]数组了,但结果全是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:51
感觉SPI中断函数只能处理第一个16位数据。
any012 回答时间:2016-5-18 14:46:58
是不是中断函数做的事太多了,除了帧首,其他的数据SPI中断没有响应过来?

0.png

sting 回答时间:2016-5-19 11:21:50
可能发生OVR
any012 回答时间:2016-5-19 11:41:55
将SPI中断处理函数精简后正常了。
any012 回答时间:2016-5-19 14:03:18
本帖最后由 any012 于 2016-5-19 14:04 编辑

编辑,回复错帖子了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版