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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版