STM32做从设备,循环读取主设备发送的数据,偶尔出错
- UID
- 1062083
- 性别
- 男
|
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);
- }
- }
- }
|
|
|
|
|
|