I2C协议其实没有什么,就是一个实时的双线协议,主要是其中的时序比较复杂,但是函数并不复杂,需要记住以下的几个要点。
要点:
(1)其数据发送的方向是先高位,再低位。而时钟和18B20都是相反的,都是从低位走高位的。
(2)这个协议中的函数比较少,就是起一个起始信号,终止信号,读时序信号,写时序信号,写字节函数,读字节函数(由于是实时的串口,所以读写都不需要用缓存装着,直接通过信号线就传输过去了)
(3)需要注意的是,读时序的话,最后不读了之后发送的是无应答,这个需要记住,这个时候读信号可以将ACK的应答拆分出来就好了。
(4)还有一个就是注意起始信号和终止信号的陷阱。
void Dri_EEPROM_Start()
{
/*初始化的时候,是SCL = 1,然后SDA是下降沿*/
// 初始状态的时候,SCL和SAD都是1
SDA = 1;
SCL = 1;
SDA = 0;
// 后面可以不用讲SCL = 0,因为我们养成了一个好的习惯,会将SCL = 0提前准备好
}
void Dri_EEPROM_Stop()
{
/*终止的时候,由于不知道前面的SCL 和SDA的数值是多少,所以不能先开SCL = 1,因为这样的话,
再对SDA产生改变的话,可能会触发下降沿,即初始化,同时,SCL = 0需要重置化,因为如果SDA = 0的话
前面的SCL = 1可能为1,从而导致下降沿*/
SCL = 0;
SDA = 0;
SCL = 1;
SDA = 1;
// 这样就可以了
}
(5)还有一点是:由于IIC协议可以挂载很多个设备,属于的是内部的驱动,而开发板上只有一个EEPROM,所以还得写一个函数,这个函数可以屏蔽掉设备地址,直接返回内部的结果就好了。
(6)在IIC协议中,在完成了一个写时序之后,都需要5ms的时间,来完成写周期,这个是需要记住的。
(7)由于IIC协议有起始信号和终止信号,所以IIC没有初始化。