I2C(IIC)通信协议
I²C(Inter-Integrated Circuit),中文名为“集成电路总线”,是一种由 Philips 公司(现 NXP)在 1980 年代推出的串行通信总线协议。它广泛应用于嵌入式系统中,用于连接低速外设,比如 EEPROM、实时时钟(RTC)、传感器、OLED 显示屏等。
一、IIC的概念
I²C(Inter-Integrated Circuit),中文名为“集成电路总线”,是一种由 Philips 公司(现 NXP)在 1980 年代推出的串行通信总线协议。它广泛应用于嵌入式系统中,用于连接低速外设,比如 EEPROM、实时时钟(RTC)、传感器、OLED 显示屏等。
二、I²C 总线结构
I²C 是一种同步、半双工的串行通信方式,其核心由以下两个信号组成:
| 信号 | 功能说明 |
|---|---|
| SCL(Serial Clock Line) | 时钟信号,由主机产生,控制数据传输节奏 |
| SDA(Serial Data Line) | 数据信号,双向传输,用于发送和接收数据 |
三、I²C 的电气特性与总线驱动方式
3.1 推挽输出(Open-Drain)
包含两个互补的 MOSFET(或三极管):
- 上管(P-MOS):连接 VCC → 引脚
- 下管(N-MOS):连接 引脚 → GND
当输出高电平时,上管导通,下管关闭,引脚被“推”到高电平;
当输出低电平时,下管导通,上管关闭,引脚被“拉”到低电平。
3.2 开漏输出(Open-Drain)
开漏输出只包含一个下拉的 N-MOS 管,没有上拉部分:
- 当 MOS 管导通 → 引脚接地(输出低电平)
- 当 MOS 管关闭 → 引脚处于高阻态(悬空),无法主动输出高电平

3.3 线与特性
当一个芯片输出高电平,真实的引脚电平。由外界芯片,上下拉电路决定

四、I²C 通信协议基础
4.1起始与停止条件
- 起始条件(Start Condition):SCL 高电平时,SDA 由高变低。
- 停止条件(Stop Condition):SCL 高电平时,SDA 由低变高。
4.2数据传输格式
I²C 每次传输 8 位数据,以字节为单位。每个字节后紧跟一个应答位(ACK/NACK)。
- 主机发送数据 → 从机应答(ACK)
- 从机发送数据 → 主机应答(ACK)
4.3地址帧
每次通信开始时,主机先发送一个地址帧,包含:
- 7 位从机地址(或 10 位)
- 1 位读写标志(0=写,1=读)
五、i.MX6ULL 中的 I²C 控制器
| 寄存器 | 功能 |
|---|---|
I2CR(I2C Control Register) |
控制 I²C 工作模式、使能、速度等 |
I2SR(I2C Status Register) |
当前状态(如是否忙、是否收到 ACK) |
I2DR(I2C Data Register) |
数据收发缓冲区 |
I2ADR(I2C Address Register) |
设置从机地址(可选) |
六、I²C 读写工作流程
6.1 I²C 初始化 (i2c_init)
引脚复用配置:将 UART4 的 RX/TX 引脚复用为 I²C1 的 SDA 和 SCL。
引脚电气配置:设置引脚为开漏输出模式,并配置上拉电阻、驱动强度等。0x10B0 这个值通常包含了开漏使能(ODE)和上拉使能(PUS)等位。
void i2c_init(I2C_Type *base)
{
IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA,1);
IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL,1);
IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0x10B0);
IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x10B0);
base->I2CR &= ~I2CR_IEN;
base->IFDR=0x15;
base->I2CR |= I2CR_IEN;
}
6.2 I²C 写操作 (i2c_write)
流程步骤:
1.初始化:配置引脚为开漏模式,设置上拉电阻,使能I²C控制器
2. 发送起始信号:主机发起START
3. 发送设备地址:发送7位从机地址+写标志(0)
4. 发送寄存器地址:发送要写入的寄存器地址
5. 发送数据:依次发送要写入的数据字节
6. 发送停止信号:主机发送STOP结束通信
void i2c_write(I2C_Type *base, unsigned char dev_addr, unsigned short reg_addr, int reg_len, unsigned char *data, unsigned int len )
{
int stat = 0;
//0. 清除IAL、IIF,
base->I2SR &= ~(I2SR_IAL | I2SR_IIF);
//1. 设置为发送模式
base->I2CR |= I2CR_MTX;
//2.start信号
base->I2CR |= I2CR_MSTA;
//3.发送从机地址及数据流向位
base->I2DR = ((dev_addr << 1) | 0);
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
//4.发送从机寄存器地址
int i=reg_len-1;
for (; i >=0; i--)
{
base->I2DR = (reg_addr >> (i * 8))& 0xFF;
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
}
for (i=0; i < len; i++)
{
base->I2DR = data[i];
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
}
stop:
//发送stop信号
base->I2CR &= ~I2CR_MSTA;
while ((base->I2SR & I2SR_IBB) != 0)
{
//设计超时机制
}
}
6.3 I²C 读操作 (i2c_read)
- 初始化:同写操作
- 发送起始信号:主机发起START
- 发送设备地址(写):发送7位从机地址+写标志(0)
- 发送寄存器地址:发送要读取的寄存器地址
- 发送重复起始信号:主机发起RESTART
- 发送设备地址(读):发送7位从机地址+读标志(1)
- 接收数据:主机接收从机返回的数据
- 发送停止信号:主机发送STOP结束通信
void i2c_read(I2C_Type *base, unsigned char dev_addr, unsigned short reg_addr, int reg_len, unsigned char *data, unsigned int len)
{
int stat=0;
base->I2SR &= ~(I2SR_IAL | I2SR_IIF);
base->I2CR |= I2CR_MTX;
//2.start信号
base->I2CR |= I2CR_MSTA;
//3.发送从机地址及数据流向位
base->I2DR = ((dev_addr << 1) | 0);
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
//4.发送从机寄存器地址
int i = reg_len - 1;
for (; i >= 0; i--)
{
base->I2DR = (reg_addr >> (i * 8)) & 0xFF;
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
}
//5.重发start
base->I2CR |= I2CR_RSTA;
//6.发送从机地址及数据流向位
base->I2DR = ((dev_addr << 1)|1);
stat = wait_i2c_iif(base);
if (stat != 0) goto stop;
//7.设置为接受模式
base->I2CR &= ~I2CR_MTX;
//8.设置应答模式
if (len >1)
{
base->I2CR &= ~I2CR_TXAK;
}else {
base->I2CR |= I2CR_TXAK;
}
//9.触发一次伪读read_buff
data[0]=base->I2DR;
for (i=0; i < len; i++)
{
stat = wait_i2c_iif(base);
if (i== len-2)
{
base->I2CR |= I2CR_TXAK;
}
if (i==len-1)
{
base->I2CR |= I2CR_MTX;
}
data[i]=base->I2DR;
if (stat != 0) goto stop;
}
stop:
//发出stop信号
base->I2CR &= ~I2CR_MSTA;
while ((base->I2SR & I2SR_IBB) != 0)
{
//设计超时机制
}
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)