主设备发送的是: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中断部分:
主函数:
|
在接收完帧首以后的中断处理里,就是else语句,需要将SPI发送语句放在紧靠else语句的位置。
这样的话,原来想只用spi2RecvNum这个变量控制接收和发送的数据位,现在不那么好实现了,于是又加了个变量spi2SendNum。
[mw_shl_code=c,true]void SPI2_IRQHandler(void)
{
static u8 n;
static u16 spi2Temp;
spi2Temp = SPI_I2S_ReceiveData(SPI2);
if(spi2RecvOk == 0)
{
if(spi2RecvNum == 0)
{
if((spi2Temp & 0xff00)== 0x3a00)
{
SPI_I2S_SendData(SPI2, spi2SendBuff[1]);
spi2RecvBuff[0] = spi2Temp;
spi2RecvNum = 1;
spi2SendNum = 2;
}
}
else
{
SPI_I2S_SendData(SPI2, spi2SendBuff[spi2SendNum]);
spi2RecvBuff[spi2RecvNum] = spi2Temp;
spi2RecvNum++;
if(spi2RecvNum > 4)
spi2RecvOk = 1;
spi2SendNum += 1;
spi2SendNum %= 5;
}
}
}[/mw_shl_code]