7bit 器件地址和write 位 (0),波形正确, 等不到 ACK? 相关程序如下: uint8 SystemError; sbit SCL= P1^0; //定义串行时钟线所在口 使用时根据自己的需要来定义 sbit SDA= P1^1; //定义串行数据线所在口 使用时根据自己的需要来定义 sbit test_LED0=P0^0; sbit test_LED1=P0^1;
void I2CStart(void) { EA=0; SDA=1; _nop_(); _nop_(); SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始 SDA=0; SomeNOP(); SCL=0; }
void I2CSendByte(uint8 Data) { uint8 BitCounter=8;//位数控制 uint8 temp;//中间变量控制 do{ temp=Data; SCL=0; SomeNOP(); if((temp&0x0080)==0x0080)//如果最高位是1 SDA=1; else SDA=0; SCL=1; temp=Data<<1;//左移 Data=temp; BitCounter--; }while(BitCounter); SCL=0; }
WaitAck(void) { int16 errtime=200;//因故障接收方无ACK,超时值为255。 SDA=1; _nop_(); _nop_(); SCL=1; SystemError=0; while(SDA) { errtime--; if(!errtime) { I2CStop(); SystemError=1; //出错后给全局变量赋值 Prints("
无ACK应答信号 ",1); return; } } _nop_(); _nop_(); SCL=0; }
void I2C_Write(uint8 address, uint8 data_size,uint8 *s_data) { uint8 i; //do{ //do{ //Prints("
W1:开始写数据 ",1); I2CStart(); I2CSendByte(ATA2508_AddrW); //Prints("
W2:写ATA2508器件地址等ACK信号 ",1); WaitAck(); //}while(SystemError); I2CSendByte(address); //Prints("
W3:写ATA2508寄存器地址等ACK信号 ",1); WaitAck(); //}while(SystemError); for(i=0;i<data_size;i++) { I2CSendByte(s_data); WaitAck(); } //Prints("
W4:写完ATA2508寄存器数据结束 ",1); I2CStop(); } MAIN() { data1[0]=0x04; //aps-2 MODE I2C_Write(0,1,data1); } |