1、IIC
1.1物理层与基础
-
两根线:SDA(数据线)、SCL(时钟线)。
起始条件: SCL保持高电平,SDA由高变低 停止条件: SCL保持高电平,SDA由低变高 IIC数据传输的基本规则: 规则1: 在SCL为高电平期间,SDA必须保持绝对稳定(不能变),此时SDA上的数据才被认为是有效的。 规则2: 只有在SCL为低电平期间,SDA才允许改变电平。 如果总线的空闲状态是低电平,那么: 1、设备一上电,就得死死拽住总线,功耗极大。 2、"起始"和"停止"条件就得反过来设计,且非常容易产生误触发(因为从"拉高"到"松手"的过渡不够干脆,容易受到RC充电延迟的影响)。 -
开漏输出(Open-Drain):IIC的引脚必须是开漏或开集极,因此必须外接上拉电阻(通常4.7kΩ)。这也是为什么IIC不能像SPI那样跑得特别快的原因。
推挽输出:由两个晶体管(上管P-MOS,下管N-MOS)组成。上管导通输出高电平,下管导通输出低电平。可以真正输出高和低,驱动能力强。 开漏输出:只有下管N-MOS,没有上管。只能主动拉低,不能主动拉高。高电平需要靠外部上拉电阻。相当于一个开关,要么接地(低),要么断开(高阻态)。 开漏输出只能拉低,高电平是'放手'让外部上拉电阻决定的。这样无论总线上挂5V还是3.3V的器件,高电平的电压域由外部电源决定,MCU只是拉低或断开,彻底避免了推挽输出时不同电压域之间的电流倒灌和短路问题,因此IIC不需要电平转换芯片 -
半双工:同一时间只能收或发。
1.2完整时序图

SCL的低电平和高电平分别对应了'数据准备'和'数据采样'两个阶段。
拉低SCL,是为了满足'SCL低电平期间SDA允许改变'的规则,给发送方时间去准备下一位数据,此时接收方不看数据,所以电平跳变是安全的。
拉高SCL,是为了满足'SCL高电平期间数据有效'的规则,让接收方读取SDA上的稳定电平。