I2C概念
Inter-Intergrated Circuit
一种低速稳定的通讯,特点:
- 双向两线,硬件更简单
- 同步串行半双工
- 一般速度未400kbit/s,和UART串口速度差不多
和UART的区别:I2C是半双工,且是同步的,而UART是异步,全双工的
物理层
- 主设备控制时钟
- 总线默认上拉
协议层
高位先行
起始信号:SCL为高电平时,SDA拉低,停止信号类似。
开始传输时,第一件事是通过从设备的地址 SLAVE_ADDRESS 找从设备。
LSB是传输方向位(从主机角度看),高电平向从机读,低电平向从设备写。
注意:这一位是第8位而不是第1位。
MSB是地址位,7位的话可以表示128个设备。
读取:只在SCL为高电平时读取SDA,其他时间SDA改变数据。
前两个线,发送方和接收方对SDA的行为。
第三个线就是主设备的时钟线。
- 一方拉低SDA后,在每个SCL高电平时传输了7位另一方的地址和1位传输方向后,拉高数据线。
- 另一方拉低一个SDA周期做响应(NCK),或保持高电平不响应(NACK)。
M24C02 EEPROM 芯片
- 256 bytes大小的EEPROM,支持100kHz和400kHz的I2C协议读写。
- 16个bytes为一页。
- 256 个字节一共需要8位地址,恰好有16页,其高四位是页地址,低四位是页内地址。
- 芯片地址高4位固定为1010,低3位由3个引脚电平控制。
写入字节时序
读出一个字节时序
因为数据传输位 为读时是高电平,即发送方表达要对从从设备读时,就将总线SDA的所有权让了出去,这时还没有表明要读的寄存器的地址。而EEPROM中有一个地址计数器,每次读取默认从上一次读的位置。因此,要实现对特定地址的读取,可以使用假写真读的策略,如上图所示。
假写的功能就是将地址计数器的存放的地址改成为指定的地址。
因为只收一个字符,传输后直接不应答。
EE2PROM没收到ack就发送一个stop。
单次写多个字节时序
对于使用的芯片,一次最多只能写一页,也就是16个字节,如果超过16个,EEPROM会覆盖本页。