打印

I2C总线通信时为什么收不到应答信号

[复制链接]
2895|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elecqht|  楼主 | 2007-4-25 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

   由于本人第一次利用单片机进行项目设计,在许多方面都是菜鸟,而且公司里没有一个懂单片机编程的工程师,所以我既进行单片机外围硬件电路的设计又进行软件程序的编写。现在遇到一件非常困惑的问题,苦于公司无人指导,故特来此请教各位高手。
   问题大致如下:
   MCU与高频头开始串行通信时有一个START的开始信号,然后送被控器(高频头)的地址到总线,然后再送一个控制字数据后,无法收到被控器的ACK应答信号,程序执行到
WAITACKW:    MOV    C,SDA
                          JC    WAITASCW 
无法继续下去[见所附程序],在这我能确定被控器的地址无误。

   硬件环境如下:
   1、我用的MCU是AT89S51,目的是为实现利用MCU与被控器进行I2C总线串行通信。
   2、定义P3.0与P3.1为SCL与SDA两条总线,MCU的SCL与SDA直接与被控器直连,之间无其他电阻电容元件,然后在两条总线上分别外接4.7K上拉电阻后与+5V连接。
   3、晶振频率为11.0952MHZ

目前我分析此问题如下:
   1、是否为时序问题或时间延时的问题
   2、硬件部分即上拉电阻阻值不对

并有几点疑问:
   1、可否用P3口定义SCL与SDA
   2、如何确定上拉电阻阻值
   3、利用I2C总线进行串行通信前是否需要进行SCON,PCON等寄存器的初始化

附上部分程序代码:

WRITE_TUNER:    ACALL    START          ;开始信号
;---------------
        MOV    A,ADBW         ;送被控器地址
        ACALL    SENDDATE
        ACALL    ACKW
;---------------
        MOV    A,DB1          ;送控制字1
        ACALL    SENDDATE
        ACALL    ACKW    
;---------------
        MOV    A,DB2          ;送控制字2
        ACALL    SENDDATE
        ACALL    ACKW
;---------------
        MOV    A,CB           ;送控制字3
        ACALL    SENDDATE
        ACALL    ACKW
;---------------
        MOV    A,PB           ;送控制字4
        ACALL    SENDDATE
        ACALL    ACKW
;---------------
        ACALL    STOP           ;停止传送
        RET

SENDDATE:    MOV    R2,#8          ;送数据
LOOPW:        RLC     A        
                     MOV    SDA,C
                     ACALL    DELAY
                     SETB    SCL
                     ACALL    DELAY
                    CLR     SCL
                    ACALL    DELAY
                    DJNZ    R2,LOOPW
                    CLR     SDA
                    RET

ACKW:            ACALL    DELAY            /*写被控器时等待ACK信号*/
                       SETB    SDA        
                       ACALL    DELAY
                       SETB    SCL
                       ACALL    DELAY
WAITACKW:    MOV    C,SDA
                      JC    WAITASCW 
                      CLR    SCL
                      CLR    SDA
                      RET

START:        SETB    SCL                /*启动信号*/
                   SETB    SDA
                   ACALL    DELAY
                   CLR     SDA
                   ACALL    DELAY
                  CLR     SCL
                  RET

STOP:        CLR     SCL                /*停止信号*/
                  CLR     SDA
                  ACALL    DELAY
                  SETB    SCL
                  ACALL    DELAY
                  SETB    SDA
                  ACALL    DELAY
                   RET

DELAY:        NOP
                   NOP
                   NOP
                   NOP
                   NOP
                   NOP
                   NOP
                   NOP
                   RET

相关帖子

沙发
yxbo159| | 2007-4-25 16:04 | 只看该作者

现在网上I2C的程序多的不行,直接去下载一个,试下就好了

使用特权

评论回复
板凳
elecqht|  楼主 | 2007-4-25 16:53 | 只看该作者

我已经参考许多I2C的程序了

但就是不知道为什么用到这上面就是不行,当然不排除是硬件连接等其他问题

使用特权

评论回复
地板
elecqht|  楼主 | 2007-4-26 08:09 | 只看该作者

怎么没人呢

难道没人懂吗

使用特权

评论回复
5
zhlking| | 2007-4-26 08:39 | 只看该作者

回复:elecqht

我才用过I/O口模拟I2C,多半是你的时序出了问题,模拟I2C时不用初始化SCON寄存器,上拉电阻是用103的就可以了!
顺便问一句你怎么知道你没有收到应答信号呢?

使用特权

评论回复
6
elecqht|  楼主 | 2007-4-26 09:16 | 只看该作者

回复:zhlking

多半是你的时序出了问题
-----------------------------
我已附上I2C总线通信相关程序,我已经参考许多I2C的程序了,感觉时序没问题啊,可否帮我参考下.谢谢!

顺便问一句你怎么知道你没有收到应答信号呢?
-------------------------------------------
因为程序执行到
WAITACKW:    MOV    C,SDA
             JC    WAITASCW 
无法继续下去,此作用为等待ACK应答信号,当无法收到ACK信号将无限循环下去.

使用特权

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

本版积分规则

14

主题

44

帖子

0

粉丝