打印

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

[复制链接]
1959|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
comeon_000|  楼主 | 2007-8-29 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段模拟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
AT24C64 EQU     0AAH
        ORG    0000H
    AJMP    MAIN
    ORG    0080H
MAIN:    MOV    R4,#0F0H
    DJNZ    R4,$

WRPCF8574:


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    $
START:
    SETB    SDA
           NOP
        NOP
    SETB    SCL
        NOP
    NOP
    NOP
    NOP
    NOP
        NOP
    CLR    SDA
        NOP
    NOP
    NOP
    NOP
    NOP
        NOP
    CLR    SCL
    RET
STOP:
    CLR    SDA
        NOP
    SETB    SCL
        NOP
    NOP
    NOP
    NOP
    NOP
    SETB    SDA
        NOP
    NOP
    NOP
    NOP
    RET
CACK:

    SETB    SDA
        NOP
        NOP
    SETB    SCL
    NOP
    NOP
    CLR    ACK
    JNB    SDA,CEND
    SETB    ACK
CEND:
    NOP
    CLR    SCL
    RET
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-31 08:22 | 只看该作者

高手们有时间帮忙看一下

顶一下 高手们有时间帮忙看一下 非常感谢 
已经头痛至及了

使用特权

评论回复
板凳
comeon_000|  楼主 | 2007-8-31 11:01 | 只看该作者

再顶顶

大虾们帮看看

使用特权

评论回复
地板
qjy_dali| | 2007-8-31 11:09 | 只看该作者

不喜欢看汇编了

  不过要提示你一点,前两者都是支持400KHZ高速I2C操作的,而PCF8574是老的芯片,好像就支持100KHZ的标准速率。
  建议你在I2C延时中多加NOP,把速度降下来试试。因为从你上面的情况,也没看出你的单片机晶振是多少,所以看不出你的现在的速度。

使用特权

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

这种问题,用逻辑分析仪很容易定位

有工具真是好啊。

使用特权

评论回复
6
qjy_dali| | 2007-8-31 11:14 | 只看该作者

请再次注意:

LZ也要看自己用的是PCF8574,还是PCF8574A,它们的区别就是地址不同。要是地址没发,那肯定不行的

使用特权

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

谢谢楼上两位

回四楼:单片机晶振是12M的 我也怀疑问题都出在延时上,可是无论我把延时按照8574DATASHEET上的数据调 还是把延时调的很长都不能通
回五楼:实验室条件差,可怜啊~ T_T

使用特权

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

谢谢六楼朋友

回六楼:已经确定是8574了 因为用另一个带I2C口的仿真器连接电路图上的SDA和SCL脚 测试8574写数据 ,地址4A通过 

使用特权

评论回复
9
qjy_dali| | 2007-8-31 11:26 | 只看该作者

LZ啊,4,5,6楼就我一个人啊

不用“谢谢楼上两位”吧

使用特权

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

没仔细看啊

呵呵 多谢你几次 也是应该的 

使用特权

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

LZ你不能说调的很长,这么说吧

你就说你用的是哪个具体型号的单片机,晶振多少,你的NOP是加了多少。要用数量说,不要只说你加了“很多”

使用特权

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

回楼上

单片机用的AT89S51 晶振是12M 一个机器周期是1us 我用一个CJNZ循环了0FF次 应该是255*2个机器周期吧 这个是我调的最长的 应该不会比这个更长了吧

使用特权

评论回复
13
qjy_dali| | 2007-8-31 12:42 | 只看该作者

问题是你上面的start,stop那些都是直接在里面写的NOP

并没有见你用子程序调用

使用特权

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

终于搞定了

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

使用特权

评论回复
15
qjy_dali| | 2007-8-31 18:51 | 只看该作者

晕,包括LZ自己在内,大家都在白忙活

使用特权

评论回复
16
comeon_000|  楼主 | 2007-9-1 15:47 | 只看该作者

还是有收获的

至少知道,不是所有的芯片的引脚顺序都是一样的,在画原理图的时候一定要把每一个芯片的引脚好好对应一下 

使用特权

评论回复
17
hollly| | 2007-9-1 23:35 | 只看该作者

^_^

确实可以啊。哈哈 
本人n年前也曾经调试液晶的时候遇到如上的问题,折腾了好半天最终发现竟然D0到D7的8根数据线竟然是D7到D0!!!!!
差点没让我吐血,最后用软件进行纠正过来了,就可以不用修改PCB了,呵呵,

使用特权

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

本版积分规则

6

主题

58

帖子

0

粉丝