I2C通信
I2C通信协议:串行,同步,半双工
数据线:SDA (需要上拉输出)
时钟线:SCL(由master提供时钟)
待机状态:SCL和SDA都持续高电平。
开始标志:SCL高电平,SDA由高变为低 ↓
结束标志:SCL高电平,SDA由低变为高 ↑

数据有效性:
SCL高电平时,SDA不能修改,此时可以读取SDA的有效数据。
SCL低电平时,SDA可以发生电平的变动。

应答(ACK)和非应答(NACK):
IIC write:master将SDA拉高来释放SDA。如果slave将SDA拉低,则认为回应了master,传输成功(可以继续传输下一个字节,直到传输结束,再发送STOP信号)。如果slave没有拉低SDA,则认为通信失败。
IIC read:master在接收完slave发送的数据后,回复ACK(拉低SDA),则slave继续向master发送数据。若master回复NACK(拉高SDA),则表示不需要slave继续发送数据。

使用GPIO接口来模拟IIC:
GPIO需要设置为开漏输出模式,因为推挽输出不能进行线与。(若是上拉输出,则推挽/开漏都可以)
通信时应该注意寄存器修改需要的时间,有的寄存器擦写时间长,写入操作后不能立刻进行读取操作,读写操作之间需要一个时间间隔。(比如说EEPROM的擦写时间就比较长)