一、I2C为什么采用开漏输出
I2C是有很多设备线与连接而成,如果采用推挽输出的话,难免会出现下面的情况,一个设备输出高,另外设备输出低,也就是左边设备的PMOS打开而右边设备的NMOS打开,这样就在VCC和GND之间形成短路,此时大的电流会把设备烧毁,后果是灾难性的。
但凡多个设备直接相连并且双向输出的总线, 要么设计成开漏输出,要么设计成三态门。
二、I2C上拉电阻选择
I2C的上拉电阻可以是 1.5K,2.2K,4.7K, 电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K或2.2K。
1.先确定最大值:取值太大的话,会导致两个后果,一是芯片接收端驱动能力不足是上升时间不够。
2.再确定最小值:电阻取值太小的话,会导致Vol太大,芯片低电平下不来。
I2C 上拉电阻计算公式
- Rmin={Vdd(min)-0.4V}/3mA
- Rmax=(T/0.874)*C, (T=1us 100KHz;T=0.3us 400KHz)
C是总线电容,标准模式,100Kbps 总线的负载最大容限<=400pF;快速模式,400Kbps 总线的负载最大容限<=200pF,根据具体使用情况、目前的器件制造工艺、PCB 的走线距离等因素以及标准的向下兼容性,设计中以快速模式为基础,即总线负载电容<200pF,也就是传输速度可以上到400Kbps 是不成问题的。
上拉电阻Rp 最大值由总线最大容限(Cbmax)决定,上拉电阻Rp最小值由 Vol 与上拉驱动电流(最大取3mA)决定。
三、I2C通信时序
开始信号:SCL为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
(1)I2C的读操作步骤
- 1.Start
- 2.Master发device address3Master发 R/W为Write;4.Slave 回ACK
- 5.Master发寄存器地址,也叫Word Address
- 6.Slave收到后再回ACK
- 7.此时Slave内部的寄存器指针已经知道对应的寄存器地址
- 8.Master发start
- 9.Master再次发device address
- 10.Master 发R/W为Read
- 11.Slave发出ACK
- 12.Slave发数据给Master
- 13.Master收到数据后发NAK给Slave
- 14.Master发stop结束本次读操作
(2)I2C的写操作步骤
- 1.Start
- 2.Master发device address
- 3.Master发 R/W为Write
- 4.Slave 回ACK
- 5.Master发寄存器地址,也叫Word Address
- 6.Slave 再回ACK
- 7.Master发要写的数据给Slave
- 8.Slave收到数据后回ACK
- 9.Master看到ACK后发Stop结束本次操作
(3)I2C的读或写操作
四、I2C电平转换电路
SDA是双向的,电路分析有四种情况
(1)Master往Slave发数据1
- 左边MasterSDA _1为输出,驱H-3.3VNMOS的VGS=0,此时NMOS关闭;
- 右边的Slave的SDA_ 2是输入,对外呈现高阻;
- NMOS关断和SLAVE为输入,导致SDA2悬空;
- 最终SDA _2依靠RP2上拉到5V,完成3.3V到5V的转换;
(2)Master往Slave发数据0
- 左边MasterSDA_1为输出,驱Low=0,NMOS的VGS>0,此时NMOS打开;
- 右边的Slave的SDA_2是输入,对外呈现高阻;
- NMOS打开和SLAVE为输入,导致SDA_2=SDA_1=0:
- 最终SDA_2被SDA_1拉到0,完成低电平的转换;
(3)Slave往Master发数据1
- 右边Slave SDA_2为输出,驱H-5V;
- 左边Master SDA _1为输入,对外高阻,被RP1上拉到3.3V;
- NMOS 因为VGS=0一直关闭;
- NMOS关闭,MasterSDA_1维持3.3V高电平,完成电平转换;
(4)Slave往Master发数据0
- 右边Slave SDA_2为输出,驱LOW;
- 左边Master SDA_1为输入,对外高阻,被RP1上拉到3.3V;
- NMOS 因为VGS=0一直关闭;
- 由于左边SDA_1为高,右边SDA 2为LOW,MOS管体二极管导通;
- SDA_1被拉低,导致NMOS VGS>0 后打开;
- NOMO打开后,SDA_1和SDA_2相当于短在一起;
- 最终左边SDA_1被右边的SDA_2拉低变为Low;