数据传输:开始SCL保持高电平,SDA由高变低
结束SCL保持高电平,SDA由低变高
由此对应的两个函数:
iiC_STAR() { SDA = 1;//保证在SCL为高电平期间只产生由高变低的变化 SCL = 1;//拉高scl,让数据传输 SDA = 0;//由高变低,表示数据开始传输 SCL = 0;//为SDA变化做准备 }iic_STOP() { SDA = 0;//同理 SCL = 1; SDA = 1; }数据传输:
时序:SDA只能在SCL为低期间翻转变化,在SCL为高期间保持稳定,此时IIC采集SDA数据(SDA必须稳定) 信号响应:
单片机发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。IIC数据从最高位开始传输(小端传输)。
数据传输:
iic_WR_Bit() { u8 temp,i; for(i=0;i<8;i++) { SCL = 0; if(temp&0x80) SDA = 1; eles SDA = 0; temp =temp << 1; SCL = 1;//采集SDA数据 SCL = 0;//传输完成后拉低(SDA才能变化) SDA = 1;//成功发送8bit数据,等待应答 } }信号应答:
iic_Check() { u8 i; SCL = 1; while(SDA==1 && i<255)i++;//检测SDA是否为高电平 SCL = 0;//拉低,SDA可变化 }写数据时序:
IIC要写入数据,首先要发送开始信号,然后写操作芯片寻址(寻找到后应答,代表设备正常,接着在进行片内子地址寻址address,同样写了8bit后进入应答,最后写入数据,进入应答)