这个协议是为了MCU微控制器和外设之间通信用的,有一个SCL时钟线,一个SDA数据线(地址线)。
首先是开始信号和结束信号
这时SCL要保持高电平1,这时SDA是下降沿,由高电平到低电平,则为开始信号,
若是这时SCL要保持高电平1,这时SDA是上升沿,由低电平到高电平,则为结束信号。
下面是代码
void IIC_start(){
SCL=1;
SDA=1;
delay(time);
SDA=0;
delay(time);
SCL=0;
}
void IIC_stop(){
SCL=1;
SDA=0;
delay(time);
SDA=1;
delay(time);
}
当SCL一直是高电平是,原则上SDA不能变化,除了起始结束信号,因为这个时候SCL在保持着让IIC通信良好的状态,当SCL为低电平时,正是SDA发送数据的好时候,这时SDA可以自由变换。
然后就是接受数据,那SCL为高电平时,SDA可以把一个位数据送过来,存储到一个变量中后,再把SCL置为低电平0。这时SDA又是自由变换的时候。
下面是代码
void sendbyte(unsigned chat byr){
unsigned char i;
for(i=0;i<8;i++){
SCL=0;
delay(time);
if(byr&0x80) SDA=1;
else SDA=0;
delay(time);
SCL=1;
byr<<=1;
delay(time);
}
SCL=0;
}
unsigned char recbyte(){
unsigned char i,da;
for(i=0;i<8;i++){
SCL=1;
delay(time);
da<<=1;
if(SDA) da|=1;
SCL=0;
delay(time);
}
return da;
}
每次都有应答环节,外设对IIC总部发送数据后,IIC总部需要手动发送应答,IIC总部发送地址或数据时,需要等外设有应答
和输送接受数据一样,信号从外设过来时,SCL高电平保持通信良好,以便接受SDA来的信号,并返回这个信号,来判断是否成功。
void sendait(bit ackbit){
SCL=0;
SDA=ackbit;
delay(time);
SCL=1;
delay(time);
SCL=0;
SDA=1;
}
bit waitbyte(){
bit ackbit;
SCL=1;
delay(time);
ackbit=SDA;
SCL=0;
return ackbit;
}
信号从IIC总部过来时,先把SCL低电平,方便信号从SDA传输,然后SCL置1来送,之后再把SCL置0,让SDA变化。