如何解决这样的问题? IIC模块的怪现象

[复制链接]
3151|6
 楼主| dongshan 发表于 2008-1-16 15:47 | 显示全部楼层 |阅读模式
用的是AW32,外部晶振9.8304MHz,FBE模式,总线频率4.9152MHz,IIC模块配置如下:<br />&nbsp;&nbsp;IIC1C=0x80;<br />&nbsp;&nbsp;IIC1F=0x50;&nbsp;<br /><br />与at24c64通信,写子程序如下:<br /><br />tagAdr&nbsp;&nbsp;sAdr;<br />#define&nbsp;gAdr&nbsp;&nbsp;&nbsp;sAdr.EepromAdr<br />#define&nbsp;gAdrH&nbsp;&nbsp;sAdr.adr16.AdrH<br />#define&nbsp;gAdrL&nbsp;&nbsp;sAdr.adr16.AdrL<br /><br />void&nbsp;IICWriteByte(word&nbsp;adr,&nbsp;byte&nbsp;dt){<br />&nbsp;&nbsp;&nbsp;&nbsp;gAdr=adr;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1C_TXAK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1C|=0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MST=1&nbsp;TX=1&nbsp;&nbsp;and&nbsp;generate&nbsp;STARTcondition<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D=IIC_SLAVE_ADR;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!IIC1S_IICIF);&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;untill&nbsp;TX&nbsp;completed<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clear&nbsp;IICIF<br />&nbsp;&nbsp;&nbsp;&nbsp;while(IIC1S_RXAK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;for&nbsp;slave&nbsp;ack<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D=gAdrH;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!IIC1S_IICIF);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(IIC1S_RXAK);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D&nbsp;=&nbsp;gAdrL;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!IIC1S_IICIF);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(IIC1S_RXAK);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D=dt;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!IIC1S_IICIF);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(IIC1S_RXAK);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1C_MST=0;<br />}<br /><br />void&nbsp;IICWriteN(word&nbsp;adr,byte&nbsp;*dt,byte&nbsp;n){&nbsp;&nbsp;//此函数全速执行不正常,单步执行则正常!<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltn;++i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IICWriteByte(adr+i,dt);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />奇怪的是在调用IICWriteN时,如果全速执行,则会在while(IIC1S_RXAK);一直执行,即没收到从机的ACK,但是单片跳进IICWriteN函数执行则正常。为什么?&nbsp;
张明峰 发表于 2008-1-16 16:50 | 显示全部楼层

看波形

瞎猜不行。用示波器捕捉一次IIC通讯过程,看一下SDA和SCL波型和对应的时序关系,就一清二楚了。
 楼主| dongshan 发表于 2008-1-16 19:05 | 显示全部楼层

不是瞎猜

单步执行是写进去了。全速则不行。<br />有个示波器,表笔不见了一个。
xuhuadong 发表于 2008-1-17 09:28 | 显示全部楼层

能否在启动iic使能后延时一下

&nbsp;&nbsp;单步时硬件模块有延时,所以24c能收到地址码,<br />&nbsp;&nbsp;连续时,没有延时。<br />IIC1C|=0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MST=1&nbsp;TX=1&nbsp;&nbsp;and&nbsp;generate&nbsp;STARTcondition<br />&nbsp;&nbsp;delay(2ms);试试<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D=IIC_SLAVE_ADR;<br /><br />&nbsp;&nbsp;
 楼主| dongshan 发表于 2008-1-17 14:56 | 显示全部楼层

谢谢徐兄。

是延时的问题,加在这儿就可以了。<br /><br />void&nbsp;IICWriteByte(word&nbsp;adr,&nbsp;byte&nbsp;dt){<br />&nbsp;&nbsp;&nbsp;&nbsp;gAdr=adr;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时加在这,就可以读写了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1C_TXAK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1C|=0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MST=1&nbsp;TX=1&nbsp;&nbsp;and&nbsp;generate&nbsp;STARTcondition<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1D=IIC_SLAVE_ADR;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!IIC1S_IICIF);&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;untill&nbsp;TX&nbsp;completed<br />&nbsp;&nbsp;&nbsp;&nbsp;IIC1S_IICIF=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clear&nbsp;IICIF<br />&nbsp;&nbsp;&nbsp;&nbsp;while(IIC1S_RXAK);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//check&nbsp;for&nbsp;slave&nbsp;ack<br />&nbsp;&nbsp;&nbsp;。。。。<br /><br />}<br /><br />读函数也一样,在函数首部加了一个延时,则全速就正常了。但不知为什么会这样。
luxinsun 发表于 2008-1-17 19:59 | 显示全部楼层

没什么理由,它就这毛病。我当初也是这样的。

没什么理由,它就这毛病。我当初也是这样的。
yellowland 发表于 2008-2-23 18:09 | 显示全部楼层

回复主题:如何解决这样的问题? IIC模块的怪现象

需要仔细check你的延时是否符合eeprom的spec.<br />否则你在这个行了,到那个上又不行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

1144

帖子

7

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