
一、I2C 总线概述I2CInter-Integrated Circuit是一种串行通信总线使用两根信号线完成设备间的数据通信SCL时钟信号线由主机控制。SDA数据信号线用于传输数据。I2C 采用高位先行MSB First的数据传输方式支持一主多从的通信结构最多可挂载 127 个从机设备。二、I2C时序一起始信号与结束信号起始信号SCL 时钟信号线为高电平时SDA 数据信号线由高变低出现下降沿表示通信开始。结束信号SCL 时钟信号线为高电平时SDA 数据信号线由低变高出现上升沿表示通信结束。二数据传输规则SCL 时钟信号线为高电平时SDA 数据信号线电平保持稳定此时接收方采样数据。SCL 时钟信号线为低电平时SDA 数据信号线电平可以改变此时发送方发送数据。三应答信号ACK / NACK在第 9 个时钟周期接收方需要向发送方回复应答信号ACK低电平表示接收成功继续传输。NACK高电平表示接收失败或传输结束。四设备地址与数据流向1. 起始信号后的第一个字节为设备地址高 7 位设备地址。低 1 位数据流向位。2. 数据流向位含义0主机发送数据给从机写操作。1从机发送数据给主机读操作。例如设备地址 0x10二进制为 0001 000加上读写位后写操作0001 000 0读操作0001 000 1五寄存器访问I2C 设备通过寄存器地址访问内部寄存器寄存器地址范围通常为 0x00 到 0xFF。六I2C 通信速率I2C 支持多种通信速率100 kHz标准模式400 kHz快速模式1.x MHz快速模式3.x MHz高速模式三、写时序与读时序一I2C 写时序主机发送起始信号 设备地址 写位等待从机 ACK 应答。主机发送寄存器地址等待从机 ACK 应答。主机向从机发送数据等待从机 ACK 应答。主机发送停止信号。// 通信前 仲裁丢失标志位清零 中断标记位清零base-I2SR ~((1 IIF) | (1 IAL));// 通信前等待数据传输完毕while ((base-I2SR (1 ICF)) 0);// 发送起始信号base-I2CR | (1 MSTA);// 主机模式发送模式base-I2CR | (1 MTX);// 后续检测从机ACK信号base-I2CR ~(1 TXAK);// 中断标记位清零base-I2SR ~(1 IIF);// 发送设备地址 写位base-I2DR dev_address 1;// 等待从机ACKwhile ((base-I2SR (1 IIF)) 0);// 中断标记位清零base-I2SR ~(1 IIF);// 发送寄存器地址base-I2DR reg_address;// 等待从机ACKwhile ((base-I2SR (1 IIF)) 0);二I2C 读时序主机发送起始信号 设备地址 写位等待从机 ACK 应答。主机发送寄存器地址等待从机 ACK 应答。主机重新发起起始信号 设备地址 读位等待从机 ACK 应答。主机接收从机数据主机回复 ACK 应答。当主机接收完最后一个字节数据向从机回复 NACK 应答。主机发送停止信号。四、I2C 知识点补充一多主机与总线仲裁I2C 支持多主机结构当多个主机同时发起通信时需要通过总线仲裁机制决定谁获得总线控制权。仲裁发生在 SDA 线上各主机在发送数据的同时持续监测 SDA 电平一旦发现自身发送的电平与总线实际电平不一致即退出竞争由发送高电平的主机让位给发送低电平的主机。仲裁过程不会破坏已传输的数据也不会产生额外开销。二时钟同步与时钟拉伸多主机场景下各主机时钟频率可能存在差异I2C 通过线与机制实现时钟同步低电平时间最长的设备决定总线时钟。此外从机在需要处理数据或未准备好时可以主动拉低 SCL 线使主机进入等待状态这一机制称为时钟拉伸常用于低速从机与高速主机之间的速率适配。三上拉电阻与电平标准I2C 总线为开漏输出结构SCL 和 SDA 线必须外接上拉电阻才能输出高电平。上拉电阻的阻值会影响总线上升时间和通信速率阻值过大会导致上升沿变缓、限制速率阻值过小则会增大功耗。常见取值在 1 kΩ 到 10 kΩ 之间具体需结合总线电容和通信速率综合选择。I2C 还支持 3.3 V 和 5 V 等不同电平标准可通过电平转换芯片实现不同电压域设备间的通信。四7 位地址与 10 位地址标准 I2C 使用 7 位设备地址最多可挂载 127 个从机。当设备数量较多时可扩展使用10 位地址模式其首字节前 5 位固定为 11110后 2 位为地址高 2 位第二个字节为地址低 8 位从而支持更多从机设备。五常见应用场景I2C 广泛应用于嵌入式系统中低速外设的连接常见设备包括传感器温度、湿度、气压、加速度等传感器。存储芯片EEPROM 等非易失性存储器。显示模块OLED、LCD 显示屏。时钟芯片RTC 实时时钟模块。扩展芯片GPIO 扩展、ADC/DAC 转换器等。六I2C 与 SPI 的对比I2C 与 SPI 是嵌入式中最常用的两种串行总线二者各有优劣引脚数量I2C 仅需 2 根线SCL、SDASPI 通常需要 4 根线SCLK、MOSI、MISO、CS。通信速率SPI 速率更高可达数十 MHzI2C 标准模式为 100 kHz高速模式可达 3.x MHz。多从机寻址I2C 通过设备地址寻址SPI 通过片选信号 CS 选择从机。全双工SPI 支持全双工通信I2C 为半双工。总线占用I2C 支持多主机仲裁SPI 通常为单主机结构。