打印

关于模拟I2C程序的一点问题

[复制链接]
2754|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
comeon_000|  楼主 | 2007-8-29 20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段模拟I2C的程序,用S51测24C64和PCF8563的地址都有反映,惟独PCF8574没有反映.用PLC935的I2C口测PCF8574能通,表明地址无错. 
不知道问题出在哪里了,是PCF8574的时序比较特殊吗?
我的程序如下,希望有经验的朋友指点指点.
ACK    BIT    10H
SLA    DATA    50H
SUBA    DATA    51H
NUMBYTE    DATA    52H
SDA    BIT    P3.5
SCL    BIT    P3.4
MTD    EQU    30H
MRD    EQU    40H
PCF8574    EQU    4AH


    ORG    0000H
    AJMP    MAIN
    ORG    0080H
MAIN:    MOV    R4,#0F0H
    DJNZ    R4,$

WRPCF8574:

;往8574写00H
IWRBYTE:
        MOV    A,#4AH
IWBLOOP:
    LCALL    START
    LCALL    WRBYTE
    LCALL    CACK
    JB    ACK,RETWRB
        MOV     A,#00H
    LCALL    WRBYTE
    LCALL    CACK
    LCALL    STOP
    RET
RETWRB:
    POP    A
    LCALL    STOP
;        LCALL   WRONG


    SJMP    $
WRONG:
        SJMP    $

;I2C总线开始
START:
    SETB    SDA
           NOP
        NOP
    SETB    SCL
        NOP
    NOP
    NOP
    NOP
    NOP
        NOP
    CLR    SDA
        NOP
    NOP
    NOP
    NOP
    NOP
        NOP
    CLR    SCL
    RET
;I2C总线结束
STOP:
    CLR    SDA
        NOP
    SETB    SCL
        NOP
    NOP
    NOP
    NOP
    NOP
    SETB    SDA
        NOP
    NOP
    NOP
    NOP
    RET
;I2C从机应答
CACK:

    SETB    SDA
        NOP
        NOP
    SETB    SCL
    NOP
    NOP
    CLR    ACK
    JNB    SDA,CEND
    SETB    ACK
CEND:
    NOP
    CLR    SCL
    RET

;写1B数据
WRBYTE:
    MOV    R0,#08H
WLP:
    RLC    A
    JC    WR1
    CLR    SDA
        SJMP    SENT

WR1:
    SETB    SDA
    NOP
SENT:
    NOP
    SETB    SCL
    NOP
    NOP
    NOP
    NOP
    NOP
    CLR    SCL
    DJNZ    R0,WLP
    NOP
    NOP
    RET

        END

 

相关帖子

沙发
comeon_000|  楼主 | 2007-8-29 21:24 | 只看该作者

顶一下 朋友们请多给提提意见 谢谢

顶一下 朋友们请多给提提意见 谢谢

使用特权

评论回复
板凳
comeon_000|  楼主 | 2007-8-29 23:27 | 只看该作者

把图也贴上来

这是I2C的电路图部分 感觉图里也没有问题啊 谁能帮我看看

使用特权

评论回复
地板
deng_1976| | 2007-8-30 10:04 | 只看该作者

我最近也在弄I2C,菜鸟一个,你看看SCL的时间是否有问题。

使用特权

评论回复
5
zhaoyu2005| | 2007-8-30 10:13 | 只看该作者

好像8563的时序和24CXX的有差别

使用特权

评论回复
6
独占一江秋| | 2007-8-30 11:32 | 只看该作者

C64和8574的地址重叠了

使用特权

评论回复
7
comeon_000|  楼主 | 2007-8-30 12:33 | 只看该作者

谢谢各位

回4楼:我起初认为是SCL的高电平和低电平延时不够,但我把延时加到很长也不行,按照PCF8574的DATASHEET上的时序改也不行
回5楼:I2C芯片的时序似乎都有所差别,但作为从机,只要主机的延时足够,应该没太大问题,PCF8563和AT24Cxx似乎都支持高速I2C,所以它们的延时问题不大。PCF8574似乎只支持低速I2C,资料上显示波特率<=100k
回6楼:C64的地址是AAH 8574地址是4AH 地址应该不会重叠,而且我用另一个带I2C口的仿真器连接其SDA和SCL,测试写数据通过

现在的问题是
1.通过我的调试发现8574的电路应该没问题
2.模拟I2C程序驱动8563和24Cxx没问题说明程序流程肯定没问题
所以现在问题似乎仅集中在时序上,比较郁闷,因为这一个芯片调不通板子可能要改,好麻烦。
谢谢上面各位兄弟帮忙
现在上面的程序就是严格按照PCF8574的时序写的

使用特权

评论回复
8
comeon_000|  楼主 | 2007-8-30 13:55 | 只看该作者

关于地址重叠的问题

A0A1A2是地址的可编程部分,器件的地址一般是 固有地址+A2A1A0+R/W 吧
EEPROM的固有地址是1010,8574的固有地址是0100,所以他们的地址应该分别是1010101R/W(AA写AB读)和0100101R/W (4A写4B读)怎么会重叠呢 

使用特权

评论回复
9
gooog| | 2007-8-30 17:14 | 只看该作者

等待从机应答的时候,主机要释放SDA

然后主机等待从机把SDA拉低,表明从机接受到了一个字节。

使用特权

评论回复
10
comeon_000|  楼主 | 2007-8-31 07:55 | 只看该作者

释放了啊

看应答子程序: CACK 有SETB SDA语句 

使用特权

评论回复
11
gooog| | 2007-8-31 11:33 | 只看该作者

要把SDA设置为输入

不太懂这种汇编语句。

使用特权

评论回复
12
comeon_000|  楼主 | 2007-8-31 11:49 | 只看该作者

回楼上

SDA用的是S51的P3.4 是双向输入输出的,外部引脚可以直接置低

使用特权

评论回复
13
comeon_000|  楼主 | 2007-8-31 18:10 | 只看该作者

问题已经解决

问题已经解决 原来是8574在电路板上的SDA和SCL线接反 原理图的问题 直接崩溃了

使用特权

评论回复
14
gooog| | 2007-9-1 08:35 | 只看该作者

我晕~~~~~

使用特权

评论回复
15
deng_1976| | 2007-9-3 16:40 | 只看该作者

是晕,兄弟们都死好了好多脑细胞了。

使用特权

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

本版积分规则

6

主题

58

帖子

0

粉丝