[ZLG-ARM] I2C接收数据总是0xff?盼高手解答

[复制链接]
4574|2
 楼主| silentband 发表于 2008-5-30 15:05 | 显示全部楼层 |阅读模式
I2c, TE, sd, IO, ui
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序如下:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Star();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//24LC64器件地址,写入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//子地址高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//子地址低字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0x55);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入数据为0x55<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_End();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delayms(10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时10ms等待数据写入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Star();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//再次启动<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0x00);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(0xa1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//器件地址,读出操作<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_buf[0]=Recv_I2C_Byte();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_ACK(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主机应答信号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_End();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendBuf(data_buf,1);<br /><br />//&nbsp;&nbsp;&nbsp;&nbsp;函数名称:&nbsp;&nbsp;&nbsp;&nbsp;Recv_I2C_Byte(void)<br />//&nbsp;&nbsp;&nbsp;&nbsp;MCU接收一个字节<br /><br />uint8&nbsp;Recv_I2C_Byte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;i,recv_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;recv_data&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;&nbsp;=&nbsp;IO0DIR&nbsp;&&nbsp;EEP_SDA_IN;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;方向寄存器[输入]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SDA_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SCL_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recv_data&nbsp;=&nbsp;recv_data&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((IO0PIN&EEP_SDA_OUT)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recv_data&nbsp;=&nbsp;recv_data&nbsp;|&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(recv_data);<br />}&nbsp;<br /><br />//&nbsp;&nbsp;&nbsp;&nbsp;函数名称:&nbsp;&nbsp;&nbsp;&nbsp;Tend_I2C_Byte(void)<br />//&nbsp;&nbsp;&nbsp;&nbsp;发送一个字节到&nbsp;I2C-EEPROM<br /><br />void&nbsp;Tend_I2C_Byte(uint8&nbsp;tend_data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(((tend_data&lt&lti)&0x80)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SDA_0();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SDA_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SCL_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2C_SCL_0();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;&nbsp;&nbsp;=&nbsp;IO0DIR&nbsp;&&nbsp;EEP_SDA_IN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;方向寄存器[输入]<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C_SCL_1();<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;err_bz&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt200;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((IO0PIN&EEP_SDA_OUT)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{err_bz&nbsp;=&nbsp;0;break;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;I2C_SCL_0();<br />&nbsp;&nbsp;&nbsp;&nbsp;delay(2);<br />}&nbsp;<br /><br /><br /><br />每次读到的数都是0xff,在每个操作之后查询ACK,从器件都能响应。用的LPC2132,GPIO模拟I2C~曾经有老师说I2C只要有应答都好办,呵呵,现在真的不好办了...求助了<br />
helanmao 发表于 2008-5-30 16:42 | 显示全部楼层

程序小改一下试试

1、在“//器件地址,读出操作”之前先停止写操作,再重新开始读操作试试。<br />2、在读操作停止前,&nbsp;将“//主机应答信号”换成not_ack信号试试。
eyuge2 发表于 2008-5-30 20:42 | 显示全部楼层

有问题

uint8&nbsp;Recv_I2C_Byte(void)这个函数中的for循环,我只看到了&nbsp;I2C_SCL_1(),没看到&nbsp;I2C_SCL_0()。<br /><br />&nbsp;&nbsp;recv_data&nbsp;=&nbsp;recv_data&lt&lt1;<br />&nbsp;&nbsp;if&nbsp;((IO0PIN&EEP_SDA_OUT)!=0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recv_data&nbsp;=&nbsp;recv_data&nbsp;|&nbsp;0x01;<br />这几句循序是不是也有问题,recv_data&nbsp;=&nbsp;recv_data&lt&lt1;应该放在后面才对吧。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

272

帖子

0

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