2025-11-08 05:56:14
硬件I2C就是用两根线控制多个设备的数据传输。一根叫SDA,负责传数据;另一根叫SCL,控制时钟信号。设备之间要互相拉高或拉低这两根线才能通信。比如用Arduino的GPIO口接上拉电阻,当电流从设备拉到地时,电压就变低,表示0;电流断开时电压变高,表示1。这样多个设备就能共用这两根线了。
为什么得用开漏输出呢?因为I2C总线需要多个设备共享同一线路,如果直接接上拉电阻,设备同时拉低时电压还是会被拉低,反而出问题。开漏输出就像拧螺丝的扳手,设备自己能拉低电平,但拉高电平得靠电阻帮忙。实验数据证明,用4.7kΩ上拉电阻时,信号稳定在0.4V到3.6V之间,刚好符合5V系统要求。比如树莓派的I2C接口就是用这种设计,能同时连接8个传感器。时钟频率得控制在100kHz到400kHz之间,太慢设备响应不及时,太快信号容易失真。比如DS18B20传感器最高支持400kHz,但实际用100kHz更稳定。设备通信时先发起始位(SDA拉低500us),再发地址和ACK信号,发停止位(SDA先高后低)。这样每根线既当数据线又当控制线,省了布线。
本题链接: