spi做从设备时,接受处理程序,只能处理第一个字节...
本帖最后由 any012 于 2016-5-18 11:57 编辑主设备连续发送4个16位的数据,第一个是0x3a05,于是想用这个数据来作为帧首判断,结果想在SPI中断里将串口接收到的数组发送出来,总是不成功。
于是精简了下函数,只发送spi2Num这个数,结果总是1...
void SPI2_IRQHandler(void)
{
u8 spi2Num, i;
u16 spi2Temp;
spi2Temp = SPI_I2S_ReceiveData(SPI2);
if(spi2Num == 0)
{
if(spi2Temp == 0x3a05)
{
spi2Num = 1;
}
}
else
{
spi2Num++;
if(spi2Num > 5)
spi2Num = 0;
}
printf("\r\nspi2Num: %d", spi2Num);
}
spi2num又没定义成static,所以每次进入SPI2_IRQHandler,spi2num就从0开始 支持楼上的,能出来一已经算幸运了... 感谢楼上两位,我真该挨敲。 本帖最后由 any012 于 2016-5-18 14:31 编辑
再请教下,将spi2Num改成全局变量后,可以打印出spi2Recive[]数组了,但结果全是0x3a05.我用示波器观察了波形,主设备发送过来的数据只有第一个是0x3a05.
修改后的程序:
void SPI2_IRQHandler(void)
{
static u16 spi2Recive;
static u8 spi2Num;
u8 i;
u16 spi2Temp;
spi2Temp = SPI_I2S_ReceiveData(SPI2);
if(spi2Num == 0)
{
if(spi2Temp == 0x3a05)
{
spi2Num = 1;
spi2Recive = spi2Temp;
// SPI_I2S_SendData(SPI2, spi2Temp);
// printf("\r\nthe first data is: %x", spi2Temp);
}
}
else
{
spi2Recive = spi2Temp;
spi2Num++;
if(spi2Num > 5)
{
spi2Num = 0;
for(i = 0; i < 5; i++)
printf("\r\nspi2recive[%d]: %x", i, spi2Recive);
// SPI_I2S_SendData(SPI2, 0x3a05);
}
}
// printf("\r\nspirecive: %x", spi2Temp);
printf("\r\nspi2Num: %d", spi2Num);
}
串口输出结果:
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2Num: 0 感觉SPI中断函数只能处理第一个16位数据。 是不是中断函数做的事太多了,除了帧首,其他的数据SPI中断没有响应过来?
可能发生OVR 将SPI中断处理函数精简后正常了。 本帖最后由 any012 于 2016-5-19 14:04 编辑
编辑,回复错帖子了。
页:
[1]