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