news 2026/5/6 10:02:09

I2C(IIC)通信协议

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
I2C(IIC)通信协议

一、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)

  1. 初始化:同写操作
  2. 发送起始信号:主机发起START
  3. 发送设备地址(写):发送7位从机地址+写标志(0)
  4. 发送寄存器地址:发送要读取的寄存器地址
  5. 发送重复起始信号:主机发起RESTART
  6. 发送设备地址(读):发送7位从机地址+读标志(1)
  7. 接收数据:主机接收从机返回的数据
  8. 发送停止信号:主机发送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) { //设计超时机制 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 18:13:20

2024年SEVC SCI2区,用于求解带时间窗车辆路径问题的邻域综合学习粒子群算法,深度解析+性能实测

目录 1.摘要2.提出的算法3.结果展示4.参考文献5.代码获取6.算法辅导应用定制读者交流 1.摘要 针对带时间窗车辆路径问题这一典型NP-hard组合优化难题&#xff0c;本文提出邻域综合学习粒子群优化算法N-CLPSO&#xff0c;将PSO更有效地适配到离散路径优化中。该方法通过引入移除…

作者头像 李华
网站建设 2026/4/23 13:05:59

“推三返一”的完整商业逻辑:从裂变算法到合规边界,一篇讲透

在流量成本高企的今天&#xff0c;每一个手握产品、寻求线上突破的老板&#xff0c;都在寻找能“四两拨千斤”的增长秘籍。“推三返一”这个词&#xff0c;随之频繁出现在项目圈、方案商的对话中。它被描绘成私域裂变的核武器&#xff0c;但也总与“是否合法”的质疑相伴。今天…

作者头像 李华
网站建设 2026/4/23 13:11:11

宝藏抠图网站 —— 抠抠图​

还在为抠图烦恼吗&#xff1f;别担心&#xff0c;今天我要给大家分享一个超棒的免费在线抠图网站 —— 抠抠图&#xff0c;有了它&#xff0c;抠图从此变得轻松简单&#xff01;​ 免费在线AI抠图工具-在线批量抠图-ai智能抠图-图片去背景-抠抠图 一、强大的 AI抠图功能​ &a…

作者头像 李华
网站建设 2026/4/29 17:53:26

技术融合驱动安全升级:AI 与 IPv6 的深度协同之道

随着IPv6规模化部署进入深水区&#xff0c;万物互联场景下的网络边界持续拓宽&#xff0c;地址海量性、协议开放性、攻击隐蔽性等特性&#xff0c;给传统安全防护体系带来致命挑战。当IPv6的技术革新遇上人工智能的算力赋能&#xff0c;安全防护行业正迎来从“规则驱动”到“智…

作者头像 李华
网站建设 2026/5/3 17:51:49

为什么 CGI(电脑特效)在暂停画面时看起来很模糊?

你是否曾在观看好莱坞大片或高质量动画时按下暂停键&#xff0c;结果发现那一帧画面看起来模糊不清、边缘发虚&#xff0c;甚至感觉像是“低画质”&#xff1f;很多人此时会怀疑特效制作得不够精良&#xff0c;但事实恰恰相反。这种“模糊感”并非技术失误&#xff0c;而是为了…

作者头像 李华
网站建设 2026/5/2 11:46:50

大数据领域数据工程的云计算资源管理

大数据领域数据工程的云计算资源管理&#xff1a;从奶茶店调兵遣将到企业级资源魔法 关键词&#xff1a;大数据工程、云计算资源管理、弹性伸缩、资源调度、成本优化、分布式系统、云原生 摘要&#xff1a;在大数据时代&#xff0c;企业每天要处理数亿条用户行为、交易记录和设…

作者头像 李华