|
本帖最后由 any012 于 2016-5-28 09:52 编辑 用STM32做SPI从设备,接受用的中断,每接收一次数据,将要发送的数据放到发送寄存器里。 第一张是SCL和MOSI的波形图。
第二张是SCL和MISO的波形。
可以看到我的STM32从设备发送到第二和第三个数据是一样的。其实是不一样的,第一个发送的数是正确的,第二个数发送了两遍,然后发送第三、第四个数。想第五个数被吃掉了... 以下为SPI中断函数。
|
微信公众号
手机版
以下为串口打印出来的数据.上电后,前两秒数据是正确的.然后就出错了.好像接受了第一帧的数据后,判断为帧首,然后可能由于某种原因该帧的余下部分没有接收,然后接收到下一帧信息,由于接收数组的第一个位置已被放置数据,那么就从第二个位置开始放置接收到的数据.这样帧首就重复接收了两次,帧尾没被放到接收数组里.
不过按说接收超过5个数据后,会将spi2Num清零的,重新从接收数组的第一个数据开始存放数据.但问题是,以后每次出现的都是重复两个帧首...
这就不理解了.
1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 10a
spi2recvBuff[2]: 100
spi2recvBuff[3]: 0
spi2recvBuff[4]: 9d76
spi2Recive[4]: 9d76
crc: 9d76
CRC校验Ok.
spi2SendBuff[0]: 3a05
spi2SendBuff[1]: 10a
spi2SendBuff[2]: 100
spi2SendBuff[3]: 5556
spi2SendBuff[4]: 289
发送结束
******************************************************
1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 10a
spi2recvBuff[2]: 100
spi2recvBuff[3]: 0
spi2recvBuff[4]: 9d76
spi2Recive[4]: 9d76
crc: 9d76
CRC校验Ok.
spi2SendBuff[0]: 3a05
spi2SendBuff[1]: 10a
spi2SendBuff[2]: 100
spi2SendBuff[3]: 5557
spi2SendBuff[4]: 9288
发送结束
******************************************************
1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 3a05
spi2recvBuff[2]: 10a
spi2recvBuff[3]: 100
spi2recvBuff[4]: 0
spi2Recive[4]: 0
crc: bf51
CRC校验失败.
******************************************************
1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 3a05
spi2recvBuff[2]: 10a
spi2recvBuff[3]: 100
spi2recvBuff[4]: 0
spi2Recive[4]: 0
crc: bf51
CRC校验失败.
在接收完帧首以后的中断处理里,就是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]