首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32做从设备,循环读取主设备发送的数据,偶尔出错

STM32做从设备,循环读取主设备发送的数据,偶尔出错

本帖最后由 yuchengze 于 2016-12-27 12:10 编辑

主设备发送的是:0x3a05,0x010a,0x0100,0x0000,0x9d76
现在用stm32做为spi的从设备,用到的资源有,定时器,串口1,spi2,dma;
定时器用来做1s基准,每1秒开启一次spi2中断使能,中断函数里判断帧首,帧首正确后接收5个16位数据,然后置个标志位。主函数里等待这个标志位被置位,然后关断中断,并将接收到的数据通过串口发送出来。
DMA是用来不停的将另组5个16位数据通过SPI2发送出去(SPI2接收主设备数据时同时将自身的数据发送出去)。

现在的现象是,
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 3a05
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。

几次中会有一次,连续读取到两个3a05。
不知道是什么原因造成的,忘朋友们指教。

------------------------------------------------------------

SPI2中断部分:
  • void SPI2_IRQHandler(void)
  • {
  •         static u8 spi2Num;
  •         u16 spi2Temp;
  •         spi2Temp = SPI_I2S_ReceiveData(SPI2);
  •         if(spi2Num == 0)
  •         {
  •                 if(spi2Temp == 0x3a05)
  •                 {
  •                         spi2RecivBuff[0] = spi2Temp;
  •                         spi2Num = 1;
  •                 }
  •         }
  •         else
  •         {
  •                 spi2RecivBuff[spi2Num] = spi2Temp;
  •                 if(spi2Num++ > 4)
  •                 {
  •                         spi2Num = 0;
  •                         spi2RecivOk = 1;
  •                 }
  •         }
  • }

复制代码

主函数:
  • int main(void)
  • {
  •         Init();
  •         TIM_Cmd(TIM3, ENABLE);                                                        //¿ªÆô¶¨Ê±Æ÷
  •         while(1)
  •         {
  •                 if(flag_1ms)
  •                 {
  •                         flag_1ms = 0;
  •                         printf("\r\n1s¶¨Ê±µ½¡£");
  •                         SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
  •                         while(spi2RecivOk == 0);
  •                         spi2RecivOk = 0;
  •                         for(i = 0; i < 5; i++)
  •                                 printf("\r\nspirecive[%d]: %x", i, spi2RecivBuff);
  •                         SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, DISABLE);
  •                 }
  •         }
  • }
返回列表