|
马老师您好,
最近在做SPI的多机通信的程序,一块M16(主),6块M48,刚开始弄一个M16,一个M48的程序,中断接收,发送,发现主机发送给从机的数据很正常,每次都对,但是主机接收到的从机的数据就是老是不稳定,有时正确有时错误,一直找不到原因,所以想请教您一下。
SPDR写入数据后开始启动数据传输,移位完毕后,主从机都会产生中断,此时读出收到的从机的数据,然后再存入下一个要发送的数据,这样处理不对吗?
部分程序如下:
一个m16,一个m48部分程序,每5秒启动一次数据交换。
主机::::
void spi_init(void)
{
unsigned char temp;
DDRB |= (1<<DDR_SCK)|(1<<DDR_MOSI);
DDRB &=~(1<<DDR_MISO);
PORT_SPI |= (1<<DDR_MISO);
SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); //SMSB,允许SPI中断,极PI允许,主机模式,性方式01,1/16系统时钟速率
SPSR = 0x00;
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
}
#pragma interrupt_handler spi_stc_isr:iv_SPI_STC
void spi_stc_isr(void)
{
SPI_rx_buff= SPDR; //从ISP口读出收到的字节
NOP();NOP();NOP();NOP();
SPI_rx_buff=0;
if(t<9) {SPDR=0x8f;t++;}
else {CS1;t=0;}
}
#pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA//1s中断
void timer1_compa_isr(void)
{
//compare occured TCNT1=OCR1A
if(c_c<249)c_c++;
else c_c=0;
if(c_c%5==0)
}
从机:::
void spi_init(void)
{
unsigned char temp;
DDR_SPI &=~((1<<DDR_SCK)|(1<<DDR_MOSI));
DDR_SPI |= (1<<DDR_MISO);
SPCR = (1<<SPIE)|(1<<SPE)|(1<<CPOL)|(1<<CPHA);
SPSR = 0x00;
temp = SPSR;
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
}
#pragma interrupt_handler spi_stc_isr:iv_SPI_STC
void spi_stc_isr(void)
{
SPI_rx_buff = SPDR; //从ISP口读出收到的字节
SPDR = 0xaa;
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|