该项目中,主芯片为AT91SAM9261,从芯片为PIC16F883。主从芯片通过SPI通讯。
运行环境为,主芯片运行在SPI主模式,单片机运行在SPI从模式;主芯片产生频率为1MHz的时钟,向单片机发送命令及接收返回信息;从芯片运行于SPI从模式,当有时钟产生时启动数据接收,发送,单片机运行频率为8MHz。
调试中出现的问题是,单片机能够接收到ARM的命令,但回传给ARM主芯片的数据不完整,会出现丢字节现象。
问题的原因:首先将主程序简化为一个while(1)循环,在这个循环里只处理一个事件,就是不停查询SPI状态,并向主芯片ARM返回信息,在这种情况下主芯片仍然接收不到完整的返回数据,表现为隔一两个字节会丢掉一两个字节数据,此时怀疑是主芯片发送的时钟时间间隔太短所致。
进一步验证,将ARM与单片机之间的电阻去掉,设置单片机为SPI主模式。选择SPI运行时钟=Fosc/4,此时Fosc设置为片内晶振时钟频率8MHz,那么SPI的运行时钟就是2M,通过示波器观察此时CKL频率确实为2M,两个字节之间的时间间隔为4.5微秒,约为八个时钟,数据发送时间与数据准备时间大约相等。
将SPI运行时钟调整置Fosc/16=0.5MHz,再观察发现此时两个字节之间的时间间隔(SPI数据准备时间)为5纳秒,由此发现时钟频率对SPI数据准备时间即两字节时间间隔影响不大,大约为5微秒。
所以当单片机为从SPI模式时,接收到主芯片1M的时钟开始工作时,发送两个字节数据之间的准备时间也应不小于5微秒才可以,而事实上,主芯片两个字节之间的间隔为三个时钟周期,为3个微秒,在此时间内下一个发送数据还没有准备好,所以就会出现丢字节的现象。最终,将ARM主芯片SPI时钟降为500KHz,两字节之间时间间隔设为20um,问题解决。
总结:在SPI传输过程中,发送数据有一定的准备时间,当SPI做从时,主芯片提供的时钟一定要满足从芯片的要求,频率不能过高,超过从芯片的运行速率,两字节的时间间隔也要大于从芯片的数据准备时间,否则在从芯片的数据还没准备好时就去读SPI时就会丢掉数据。
阅读(1268) | 评论(0) | 转发(0) |