谁能说说44B0的I2C是怎么工作的?

[复制链接]
 楼主| 发表于 2009-2-6 10:02 | 显示全部楼层 |阅读模式
I2c, ic, iic, ST, TI
<br />自己写了一下没有成功,下面是给的例程,用中断的方法来发送一个Byte,红色的部分都好理解,分别写器件地址,子地址,数据,每发送完一个字节产生一次中断,发完了停止总线。<br />问题是,它上面的每个字节发完之后都不等ACK,直到发完,总线停止了以后,来到蓝色部分,在这里等ACK???而且这时还是设<font color=#0000FF>rIICSTAT=0xf0;<font color=#000000>就是</font></font><font color=#000000>主器件发送模式,再发送一次器件地址,然后等ACK,这是从何说起啊??</font><br /><font color=#000000>另外,44B0是否无法用I/O口来模拟I2C了?要频繁更改I/O口的属性,似乎时间上来不及,不知道为什么ARM的I/O口都要这样设计,不像51的是输入输出的??<br /><br /></font><br />void&nbsp;Wr24C040(U32&nbsp;slvAddr,U32&nbsp;addr,U8&nbsp;data)<br />{<br />&nbsp;&nbsp;_iicMode=WRDATA;<br />&nbsp;&nbsp;_iicPt=0;<br />&nbsp;&nbsp;_iicData[0]=(U8)addr;<br />&nbsp;&nbsp;_iicData[1]=data;<br />&nbsp;&nbsp;_iicDataCount=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><font color=#FF0000>&nbsp;&nbsp;rIICDS=slvAddr;//0xa0<br />&nbsp;&nbsp;rIICSTAT=0xf0;&nbsp;//MasTx,Start<br />&nbsp;&nbsp;while(_iicDataCount!=-1);</font><br /><br /><font color=#0000FF>&nbsp;&nbsp;_iicMode=POLLACK;<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_iicStatus=0x100;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xf0;&nbsp;//MasTx,Start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(_iicStatus==0x100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!(_iicStatus&0x1))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;//&nbsp;when&nbsp;ACK&nbsp;is&nbsp;received<br />&nbsp;&nbsp;}<br /></font>&nbsp;&nbsp;<br />&nbsp;&nbsp;rIICSTAT=0xd0;&nbsp;&nbsp;//stop&nbsp;MasTx&nbsp;condition&nbsp;<br />&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.&nbsp;<br />&nbsp;&nbsp;Delay(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;until&nbsp;stop&nbsp;condtion&nbsp;is&nbsp;in&nbsp;effect.<br /><br />&nbsp;&nbsp;//write&nbsp;is&nbsp;completed.<br />}<br /><br />void&nbsp;__irq&nbsp;IicInt(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U32&nbsp;iicSt,i;<br />&nbsp;&nbsp;&nbsp;&nbsp;rI_ISPC=BIT_IIC;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;switch(_iicMode)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;POLLACK:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_iicStatus=iicSt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;<font color=#FF0000>&nbsp;&nbsp;case&nbsp;WRDATA:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((_iicDataCount--)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xd0;&nbsp;&nbsp;&nbsp;&nbsp;//stop&nbsp;MasTx&nbsp;condition&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay(1);&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;until&nbsp;stop&nbsp;condtion&nbsp;is&nbsp;in&nbsp;effect.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//The&nbsp;pending&nbsp;bit&nbsp;will&nbsp;not&nbsp;be&nbsp;set&nbsp;after&nbsp;issuing&nbsp;stop&nbsp;condition.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=_iicData[_iicPt++];&nbsp;&nbsp;//_iicData[0]&nbsp;has&nbsp;dummy.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt10;i++);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//for&nbsp;setup&nbsp;time&nbsp;until&nbsp;rising&nbsp;edge&nbsp;of&nbsp;IICSCL<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=0xaf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//resumes&nbsp;IIC&nbsp;operation.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /></font><br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
发表于 2009-2-7 09:20 | 显示全部楼层

re:

程序使用了44b0x内部硬件IIC,可能楼主之前使用的是模拟的IIC,此时楼主可以对着44b0x的数据手册来看
发表于 2009-2-6 12:44 | 显示全部楼层

先别急着自己写,用官方的test程序试下先,成功后再去理解

  
 楼主| 发表于 2009-2-6 12:53 | 显示全部楼层

上面的就是测试程序

但是没明白它为什么要这么操作,跟之前理解的I2C对不着,手头上没有示波器,看不到它的波形.
 楼主| 发表于 2009-2-7 11:01 | 显示全部楼层

re

嗯,用的是硬件I2C.<br />我的意思是,I2C协议里面说的就是每个Byte之后等ACK,这跟用甚么方法来实现没关系吧?假如我要求实现发送器件地址后如果没ACK就重发,显然这里是没法做到的啊.它只能得到最后的一个ACK.<br />或者是每发一个字节就要把总线停止了,然后等ACK,奇怪得很
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝
快速回复 返回顶部 返回列表