打印

mega8 SPI通讯, 郁闷中~~~哪位高手帮我看看...

[复制链接]
2377|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhy_radio|  楼主 | 2008-4-14 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己写的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置位,证明从机程序应该没问题。但为什么还是不能接收到数据呢?

各位高手帮我看看是什么问题? 先谢谢了!!!

相关帖子

沙发
armecos| | 2008-4-14 22:19 | 只看该作者

下面文档里有SPI设计注意事项,你可以对照查一下

使用特权

评论回复
板凳
lhy_radio|  楼主 | 2008-4-14 22:22 | 只看该作者

谢谢LS,先看看.....

使用特权

评论回复
地板
lhy_radio|  楼主 | 2008-4-14 22:31 | 只看该作者

armecos给的SPI驱动程序东西有些看不懂啊......

我用的是两个mega8,在Proteus中仿真。结果就是不对.....
还是谢谢armecos了......
再研究研究.......

使用特权

评论回复
5
农民讲习所| | 2008-4-15 09:07 | 只看该作者

丢掉Proteus

Proteus玩玩可以,但不能当真。

使用特权

评论回复
6
lhy_radio|  楼主 | 2008-4-15 18:37 | 只看该作者

农民讲习所的意思是有可能Proteus仿真出错?

前几天我写了一个驱动LCD1602的程序也是,在Proteus中仿真一切正常
实际接上硬件电路之后1602却怎么也不亮......
后来才发现1602那个调节对比度的端口是必须要接一个可调电阻的,而在Proteus中我是直接把它接地的......


难道真的是Proteus仿真出错了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

162

帖子

1

粉丝