|
求助;SPI不能完整正确接收数据包,请求高手们帮忙分析。小弟不胜感激!!
[复制链接]
如题:这个问题愁死我了,一个星期都没有解决。
问题描述:我用的单片机是AVR的ATMEGA88,ICCAVR编译器。单片机和ARM通过SPI接口通信。单片机作为主机。单片机通过定时器启动时钟,接收ARM发送过来的数据包。数据包的第一个字节表示数据包的长度。
现在的问题是:我只能确定正确接收第一个字节,其他字节不能正确接收。
我把SPI中断程序贴出来,轻各位高手看看我的思路是不是有问题?
#pragma interrupt_handler spi_int:18
void spi_int()//在SPI主模式下的
{
unsigned char temp;
CLI(); //关中断,防止接收时间过长,造成定时器中断。
receive_data1=SPDR; //接收数据
spi_ok=0; //SPI口空闲
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
if((receive_data1!=0)&&(spi_buffer==0)&&(receive_data1!=0xFF)&&(receive_data1!=127))
//如果接收缓冲区空,且接收到的数据合法,则认为是数据包的第一个字节
{
spi_rx_buffer[0]=receive_data1; //存储数据包的长度
spi_buffer=1; //置接收缓冲区非空
first_data=1;
SPDR=0xFF; //启动时钟,进行下一次数据传输
spi_ok=1; //置SPI忙
++count;
}
else
if((spi_buffer==1)&&(rx_index
{
spi_rx_buffer[++rx_index]=receive_data1;
// receive_data++;
if(rx_index
{
SPDR=0xFF;
spi_ok=1;
}
++count;
}
SEI();
// delay_us(16);
}
|
|