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