标题:
STM32做从设备,循环读取主设备发送的数据,偶尔出错
[打印本页]
作者:
yuchengze
时间:
2016-12-22 21:18
标题:
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);
}
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0