Doci 发表于 2013-5-7 17:07:30

马老师,想请教您一下关于SPI多机通信的问题啊。。。。。

马老师您好,
   最近在做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;
}


machao 发表于 2013-5-8 19:22:14

抱歉,我基本上不会去改那些烂的不得了的代码。建议你先买本我的教材,先真正把一对一的SPI通信传递搞清楚。
页: [1]
查看完整版本: 马老师,想请教您一下关于SPI多机通信的问题啊。。。。。