前几天,有小伙伴在群里问I2C电平转换的实现逻辑,今天借这个机会在这里分享下。
下图为I2C电平转换电路的示意图,左侧VDD1为3.3V的电压域,右侧为5V电压域,中间通过N沟通的MOS管TR1连接,两侧分别有各自的上拉电阻Rp。(Vth为N-MOS动作的阈值电压。)
电平转换的具体实现过程如下:
信号传输方向:从左向右
1)当SDA1为高电平时,Vgs=0V<Vth,TR1处于断开状态,SDA2被Rp上拉到5V(高电平);
2)当SDA1为低电平时,Vgs=3.3V>Vth,TR1处于导通状态,SDA2被SDA1拉低;
信号传输方向:从右到左
1)当SDA2为高电平时,TR1的S极被Rp上拉倒3.3V,Vgs=0V<Vth,TR1处于断开状态,SDA1依旧保持高电平;
2)当SDA2为低电平时,由于TR1内部集成的二极管(P-N结)存在,SDA1此时的电压会因为体二极管导通而被钳位至0.2V~0.3V,Vgs=3V>Vth,TR1处于导通状态,SDA1被SDA2拉低。
I2C总线在两个不同系统中的电平转换在I2C总线的协议规范里有专门的描述,具体可以参阅《I2C协议规范》。