我自己写的SPI主机/从机程序,为什么就是不能接收到正确的数据呢~~~~~~ ----自己搞了好久就是不行,不知道哪里出了问题....
以下是我写的主机程序: DDRB |= (1<<PB2) | (1<<PB3) |(1<<PB5);//SS,MOSI,SCK设置为输出 PORTB &= ~(1<<PB2);//SS清零 SPCR = (1<<SPE) | (1<<MSTR) |(1<<SPR0) | (1<<SPR1);//主机,使能SPI
SPDR = 0xff;//发送数据FF do { ; }while(!(SPSR & (1<<SPIF)));//等待数据发送结束 PORTB |= (1<<PB2);//SS置位
以下是我写的从机程序: unsigned char PortStatus; DDRB = (1<<PB4);//MISO设置为输出 SPCR = (1<<SPE);//SPI使能 SPDR = 0x4f; while(!(SPSR & (1<<SPIF)))//等待数据接收完毕 { ; } PortStatus = SPDR; if(PortStatus == 0xFF) { LCDPut("OK!");//LCD显示数据接收成功 } else { LCDPut("Error!");//LCD显示数据接收错误 }
我在Proteus中仿真,结果就是不对。 从机一直在没接收到数据----因为LCD什么都不显示,而去掉while(!(SPSR & (1<<SPIF)))一行后显示“Error”
我的分析: 1)开始我觉得可能是主机发送频率高,从机来不及响应,后来改了分频还是不行。 2)我把从机判断传输结束标志(以前是检测SPIF位)改为检测SS引脚(因为主机数据发送结束后SS引脚被拉高)是否被置位,LCD还是显示“Error”。此时如果把if(PortStatus == 0xFF)中“FF”改为“00”,则显示“OK!” 3)我用AVR Studio仿真,分别把主机程序和从机程序调入。发现主机发送数据时序正常,从机接收数据也正常----自己手动把SCK置位或清零,可以使SPIF置位,证明从机程序应该没问题。但为什么还是不能接收到数据呢?
各位高手帮我看看是什么问题? 先谢谢了!!! |