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

[复制链接]
 楼主| comeon_000 发表于 2007-8-29 20:39 | 显示全部楼层 |阅读模式
我写了一段模拟I2C的程序,用S51测24C64和PCF8563的地址都有反映,惟独PCF8574没有反映.用PLC935的I2C口测PCF8574能通,表明地址无错.&nbsp;<br />不知道问题出在哪里了,是PCF8574的时序比较特殊吗?<br />我的程序如下,希望有经验的朋友指点指点.<br />ACK&nbsp;&nbsp;&nbsp;&nbsp;BIT&nbsp;&nbsp;&nbsp;&nbsp;10H<br />SLA&nbsp;&nbsp;&nbsp;&nbsp;DATA&nbsp;&nbsp;&nbsp;&nbsp;50H<br />SUBA&nbsp;&nbsp;&nbsp;&nbsp;DATA&nbsp;&nbsp;&nbsp;&nbsp;51H<br />NUMBYTE&nbsp;&nbsp;&nbsp;&nbsp;DATA&nbsp;&nbsp;&nbsp;&nbsp;52H<br />SDA&nbsp;&nbsp;&nbsp;&nbsp;BIT&nbsp;&nbsp;&nbsp;&nbsp;P3.5<br />SCL&nbsp;&nbsp;&nbsp;&nbsp;BIT&nbsp;&nbsp;&nbsp;&nbsp;P3.4<br />MTD&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;30H<br />MRD&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;40H<br />PCF8574&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;&nbsp;&nbsp;4AH<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;0000H<br />&nbsp;&nbsp;&nbsp;&nbsp;AJMP&nbsp;&nbsp;&nbsp;&nbsp;MAIN<br />&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;&nbsp;&nbsp;&nbsp;0080H<br />MAIN:&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R4,#0F0H<br />&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;&nbsp;&nbsp;&nbsp;R4,$<br /><br />WRPCF8574:<br /><br />;往8574写00H<br />IWRBYTE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;A,#4AH<br />IWBLOOP:<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;START<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;WRBYTE<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;CACK<br />&nbsp;&nbsp;&nbsp;&nbsp;JB&nbsp;&nbsp;&nbsp;&nbsp;ACK,RETWRB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A,#00H<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;WRBYTE<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;CACK<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;STOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br />RETWRB:<br />&nbsp;&nbsp;&nbsp;&nbsp;POP&nbsp;&nbsp;&nbsp;&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;&nbsp;STOP<br />;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCALL&nbsp;&nbsp;&nbsp;WRONG<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SJMP&nbsp;&nbsp;&nbsp;&nbsp;$<br />WRONG:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SJMP&nbsp;&nbsp;&nbsp;&nbsp;$<br /><br />;I2C总线开始<br />START:<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br />;I2C总线结束<br />STOP:<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br />;I2C从机应答<br />CACK:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;ACK<br />&nbsp;&nbsp;&nbsp;&nbsp;JNB&nbsp;&nbsp;&nbsp;&nbsp;SDA,CEND<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;ACK<br />CEND:<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br /><br />;写1B数据<br />WRBYTE:<br />&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;R0,#08H<br />WLP:<br />&nbsp;&nbsp;&nbsp;&nbsp;RLC&nbsp;&nbsp;&nbsp;&nbsp;A<br />&nbsp;&nbsp;&nbsp;&nbsp;JC&nbsp;&nbsp;&nbsp;&nbsp;WR1<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SJMP&nbsp;&nbsp;&nbsp;&nbsp;SENT<br /><br />WR1:<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />SENT:<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;SETB&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;CLR&nbsp;&nbsp;&nbsp;&nbsp;SCL<br />&nbsp;&nbsp;&nbsp;&nbsp;DJNZ&nbsp;&nbsp;&nbsp;&nbsp;R0,WLP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;RET<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br /><br />&nbsp;
 楼主| comeon_000 发表于 2007-8-29 21:24 | 显示全部楼层

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

顶一下&nbsp;朋友们请多给提提意见&nbsp;谢谢
 楼主| comeon_000 发表于 2007-8-29 23:27 | 显示全部楼层

把图也贴上来

这是I2C的电路图部分&nbsp;感觉图里也没有问题啊&nbsp;谁能帮我看看
deng_1976 发表于 2007-8-30 10:04 | 显示全部楼层

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

  
zhaoyu2005 发表于 2007-8-30 10:13 | 显示全部楼层

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

  
独占一江秋 发表于 2007-8-30 11:32 | 显示全部楼层

C64和8574的地址重叠了

  
 楼主| comeon_000 发表于 2007-8-30 12:33 | 显示全部楼层

谢谢各位

回4楼:我起初认为是SCL的高电平和低电平延时不够,但我把延时加到很长也不行,按照PCF8574的DATASHEET上的时序改也不行<br />回5楼:I2C芯片的时序似乎都有所差别,但作为从机,只要主机的延时足够,应该没太大问题,PCF8563和AT24Cxx似乎都支持高速I2C,所以它们的延时问题不大。PCF8574似乎只支持低速I2C,资料上显示波特率&lt=100k<br />回6楼:C64的地址是AAH&nbsp;8574地址是4AH&nbsp;地址应该不会重叠,而且我用另一个带I2C口的仿真器连接其SDA和SCL,测试写数据通过<br /><br />现在的问题是<br />1.通过我的调试发现8574的电路应该没问题<br />2.模拟I2C程序驱动8563和24Cxx没问题说明程序流程肯定没问题<br />所以现在问题似乎仅集中在时序上,比较郁闷,因为这一个芯片调不通板子可能要改,好麻烦。<br />谢谢上面各位兄弟帮忙<br />现在上面的程序就是严格按照PCF8574的时序写的
 楼主| comeon_000 发表于 2007-8-30 13:55 | 显示全部楼层

关于地址重叠的问题

A0A1A2是地址的可编程部分,器件的地址一般是&nbsp;固有地址+A2A1A0+R/W&nbsp;吧<br />EEPROM的固有地址是1010,8574的固有地址是0100,所以他们的地址应该分别是1010101R/W(AA写AB读)和0100101R/W&nbsp;(4A写4B读)怎么会重叠呢&nbsp;
gooog 发表于 2007-8-30 17:14 | 显示全部楼层

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

然后主机等待从机把SDA拉低,表明从机接受到了一个字节。
 楼主| comeon_000 发表于 2007-8-31 07:55 | 显示全部楼层

释放了啊

看应答子程序:&nbsp;CACK&nbsp;有SETB&nbsp;SDA语句&nbsp;
gooog 发表于 2007-8-31 11:33 | 显示全部楼层

要把SDA设置为输入

不太懂这种汇编语句。
 楼主| comeon_000 发表于 2007-8-31 11:49 | 显示全部楼层

回楼上

SDA用的是S51的P3.4&nbsp;是双向输入输出的,外部引脚可以直接置低
 楼主| comeon_000 发表于 2007-8-31 18:10 | 显示全部楼层

问题已经解决

问题已经解决&nbsp;原来是8574在电路板上的SDA和SCL线接反&nbsp;原理图的问题&nbsp;直接崩溃了
gooog 发表于 2007-9-1 08:35 | 显示全部楼层

我晕~~~~~

  
deng_1976 发表于 2007-9-3 16:40 | 显示全部楼层

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

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

58

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部