[ZLG-ARM] I2C的问题

[复制链接]
2106|4
 楼主| xcxxyc 发表于 2007-4-28 10:39 | 显示全部楼层 |阅读模式
I2c, ST, TE, se, ui
void&nbsp;Send_N_byte(uint8&nbsp;Sla,uint8&nbsp;Subaddr,uint8&nbsp;Data)<br />{<br />&nbsp;&nbsp;&nbsp;uint8&nbsp;ii=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=(1&lt&lt3);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONSET&nbsp;=&nbsp;(1&lt&lt5);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0DAT&nbsp;=&nbsp;Sla&0xfe;&nbsp;&nbsp;&nbsp;//&nbsp;和屏蔽部分对照,改成这样,第2步读到的状态位正常--18,使用屏蔽部分,第2步读到的状态位为&nbsp;20,不是18<br />//&nbsp;&nbsp;while&nbsp;(&nbsp;&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x08)&nbsp;&&&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!&nbsp;&nbsp;=x10)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&&&nbsp;(ii++&lt0xff)&nbsp;&nbsp;);<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temptemp&nbsp;=&nbsp;I2C0STAT;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0DAT&nbsp;=&nbsp;0x34;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=&nbsp;1&lt&lt3;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(&nbsp;&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x18)&nbsp;&&&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x20)&nbsp;);//&nbsp;&&&nbsp;(ii++&lt0xffff)&nbsp;&nbsp;);<br />//&nbsp;temptemp&nbsp;=&nbsp;I2C0STAT;<br />//&nbsp;&nbsp;if((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x18)<br />//&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0DAT&nbsp;=&nbsp;Subaddr;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=&nbsp;1&lt&lt3;<br />//&nbsp;&nbsp;&nbsp;}<br />//&nbsp;&nbsp;&nbsp;else<br />&nbsp;//&nbsp;&nbsp;&nbsp;{<br />&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=0x28;<br />&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONSET=1&lt&lt4;<br />&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;<br />&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;<br />//&nbsp;&nbsp;ii=0;&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(&nbsp;&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x28)&nbsp;&&&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x30)&nbsp;&nbsp;&&&nbsp;(ii++&lt0xff)&nbsp;&nbsp;);<br />&nbsp;&nbsp;temptemp&nbsp;=&nbsp;I2C0STAT;&nbsp;&nbsp;&nbsp;//该句测试用&nbsp;状态变为08H,不懂为什么,求助<br />&nbsp;&nbsp;if(((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x28))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C0DAT&nbsp;=&nbsp;Data;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=&nbsp;1&lt&lt3;<br />&nbsp;&nbsp;&nbsp;&nbsp;ii=0;&nbsp;<br />&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=0x28;<br />&nbsp;&nbsp;&nbsp;I2C0CONSET=1&lt&lt4;<br />&nbsp;&nbsp;&nbsp;return&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;while&nbsp;(&nbsp;&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x28)&nbsp;&nbsp;&&&nbsp;((I2C0STAT&nbsp;&&nbsp;0xf8)!=0x30)&nbsp;&&&nbsp;(ii++&lt0xffff)&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;temptemp&nbsp;=&nbsp;I2C0STAT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONCLR&nbsp;=0x28;&nbsp;&nbsp;&nbsp;//&nbsp;清零&nbsp;SI&nbsp;和&nbsp;STA&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C0CONSET=1&lt&lt4;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1&lt&lt3&nbsp;he&nbsp;1&lt&lt5&nbsp;<br />&nbsp;&nbsp;temptemp&nbsp;=&nbsp;I2C0STAT;&nbsp;&nbsp;<br />}&nbsp;&nbsp;
 楼主| xcxxyc 发表于 2007-4-28 10:40 | 显示全部楼层

注释一下

其他变量为全局变量,方便查看
 楼主| xcxxyc 发表于 2007-4-28 10:43 | 显示全部楼层

问题的主要体现

&nbsp;总的来说就是ACK应答位不正确
Ice_River 发表于 2007-4-28 11:22 | 显示全部楼层

08H为状态码

为什么不用中断呢?08H为状态码,用来标识I2C的状态,08H应该使以发送起始地址<br />
 楼主| xcxxyc 发表于 2007-4-29 09:16 | 显示全部楼层

已经解决,谢谢各位的支持

&nbsp;&nbsp;建议:就是当你很累的时候不要写程序,因为那样你就可能出低级错误!!这是我的教训!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

105

帖子

0

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