两个设备在不同电压工作时,出来的信号电平也不一样,若两个设备需要通信,那么信号之间就得进行电平转换,电平转换一般都采取:
1、电平转换芯片,如SN74AVC1T45等系列。
2、可以用N-MOS管搭建,MOS价格比专用的电平转换芯片便宜,应用也比较广泛。如下图是一个5V~3.3V之间的I2C电平转换电路, SCL 是单向,主机发送的; SDA是双向,主机和设备都要驱动,用N-MOS管的工作原理:
只能是MCU 驱动SCL:
当I2C_SCL = 1(MCU_VCC) 时,Q1的Vgs=0V,小于MOS管的开启电压, Q1 截止,ADC_SCL = 1(VREF);
当I2C_SCL = 0时, Q1的Vgs = MCU_VCC 大于MOS管的开启电压,Q1 导通,ADC_SCL = 0。
MCU 驱动SDA时:
当I2C_SDA = 1(MCU_VCC), Q2的Vgs=0V,小于MOS管的开启电压Q2 截止,ADC_SDA = 1 (VREF);
当I2C_SDA = 0, Q2的Vgs = MCU_VCC 大于MOS管的开启电压,Q2导通,ADC_SCL = 0
Slave 驱动SDA时:
当ADC_SDA = 1(VREF),此时主机端要释放I2C1_SCL,通过外部的电阻默认被拉高,Q2的Vgs = 0, Q2 截止,Q2内部的二极管处于反向截止,故I2C_SDA = 1(MUC_VCC)
当ADC_SDA = 0,此时主机端要释放I2C1_SCL,通过外部的电阻默认被拉高,此时Q2的Vgs = 0, Q2 截止,但是Q2内部的二极管处于正向偏置,
S极电位被二极管钳位到低电平(0.7V~1.2V),导致Vgs = MCU_VCC - 内部二极管的导通电压 = (3.3-0.76)>0.45V或(3.3-1.2) >0.45V ,Vgs还是大于MOS的开启电压,进一步促进I2C1_SDA = 0
接下来看下MOS的参数。这里选用的UT2302 NMOS管,开启电压Vgs = 0.45V,开启电压是非常低的了,为什么选一个这么低的开启电压呢?
答案是:
(1)、开启电压越低,NMOS管从关闭到导通的时间就越快,能及时的响应,这样I2C速率也能更好的满足。
(2)、开启电压越低,能适配更多的电平之间的转换,比如5~2.8V,5~1.8V,3.3~1.8V等。要关注内部二极管导通压降,大部分都是0.7V左右。
巧妙记法:
(1)、当两边都是高电平时(I2C不工作时也就是空闲时,SCL和SDA默认都是高电平),一定要将MOS管内部的二极管处于反向偏置,让二极管处于截止状态,所以D极接高电压端,S极接低电压端
(2)、NOMS管导通与否都是看Vgs电压,所以G极也接低压端。