I2C(Inter-Integrated Circuit)——短距离设备间串行通信协议

一、I2C 概述

I2C(Inter-Integrated Circuit,集成电路总线)是一种由 Philips 公司开发的简单、双向二线制同步串行总线,专为短距离设备间通信设计。它仅需两根信号线——串行数据线(SDA)和串行时钟线(SCL),即可实现主设备与多个从设备之间的数据传输。I2C 总线广泛应用于嵌入式系统、消费电子、工业控制等领域,是连接微控制器与外围设备(如传感器、EEPROM、显示屏等)的常用通信接口。



二、I2C 硬件特性与通信原理

(一)硬件引脚

I2C 总线由两根信号线组成:

  • SDA(Serial Data Line):串行数据线,用于主设备与从设备之间的双向数据传输。
  • SCL(Serial Clock Line):串行时钟线,由主设备产生时钟信号,用于同步数据传输。
(二)通信原理

I2C 通信基于主从架构,主设备负责发起通信、产生时钟信号并控制数据传输方向,从设备则响应主设备的请求。通信过程包括起始条件、地址传输、数据传输、应答信号和停止条件五个阶段。

  1. 起始条件:当 SCL 为高电平时,SDA 由高电平跳变为低电平,表示通信开始。
  2. 地址传输:主设备发送 7 位或 10 位从设备地址,后跟 1 位读/写标志位(0 表示写操作,1 表示读操作)。
  3. 数据传输:主设备与从设备之间进行数据交换,每次传输一个字节(8 位)。
  4. 应答信号:每个字节传输后,接收方需发送一个应答位(ACK/NACK),表示数据是否成功接收。
  5. 停止条件:当 SCL 为高电平时,SDA 由低电平跳变为高电平,表示通信结束。

三、I2C 工作模式与特性

(一)工作模式

I2C 支持多种工作模式,包括标准模式(≤100 kbps)、快速模式(≤400 kbps)、高速模式(≤3.4 Mbps)和超快速模式(≤5 Mbps,部分设备支持)。用户可根据实际需求选择合适的模式。

(二)特性
  • 双向通信:SDA 支持双向数据传输,主设备和从设备均可发送和接收数据。
  • 多主设备:I2C 总线支持多个主设备同时工作,但需通过总线仲裁机制避免冲突。
  • 硬件简单:仅需两根信号线,降低了电路设计的复杂性。
  • 地址区分:每个从设备具有唯一的 7 位或 10 位地址,主设备通过地址选择从设备。

四、I2C 通信时序与协议

(一)通信时序

I2C 通信时序严格遵循起始条件、地址传输、数据传输、应答信号和停止条件的顺序。以下是一个典型的写操作时序:

  1. 主设备发送起始条件。
  2. 主设备发送从设备地址和写标志位。
  3. 从设备发送应答信号。
  4. 主设备发送寄存器地址。
  5. 从设备发送应答信号。
  6. 主设备发送数据。
  7. 从设备发送应答信号。
  8. 主设备发送停止条件。
(二)协议细节
  • 起始与停止条件:通过 SDA 和 SCL 的电平变化实现。
  • 地址传输:7 位或 10 位地址后跟 1 位读/写标志位。
  • 数据传输:每个字节传输后需接收应答信号。
  • 应答信号:低电平表示成功接收,高电平表示接收失败或不需要更多数据。

五、I2C 优缺点分析

(一)优点
  • 硬件简单:仅需两根信号线,降低了电路设计的复杂性。
  • 支持多设备:一条总线上可连接多个从设备,通过地址区分。
  • 双向通信:主设备和从设备均可发送和接收数据。
  • 兼容性强:广泛应用于各种微控制器和外围设备。
(二)缺点
  • 速度限制:相比 SPI,I2C 的数据传输速率较低,高速模式下也仅能达到 3.4 Mbps。
  • 仲裁机制:多主设备情况下,需通过仲裁机制避免冲突,增加了通信复杂性。
  • 信号完整性:长距离传输时,信号完整性可能受到影响,需考虑上拉电阻和总线电容。

六、I2C 应用案例:STM32 连接 I2C 传感器

以下是一个使用 STM32 微控制器连接 I2C 温度传感器(如 BMP180)的详细案例:

(一)硬件连接

假设使用 STM32F103 微控制器和 BMP180 温度传感器,硬件连接如下:

  • BMP180 VCC 连接 STM32 3.3V。
  • BMP180 GND 连接 STM32 GND。
  • BMP180 SDA 连接 STM32 PB7(I2C1_SDA)。
  • BMP180 SCL 连接 STM32 PB6(I2C1_SCL)。
(二)软件实现
  1. I2C 初始化
c复制代码
#include "stm32f10x.h"
void I2C1_Init(void) {
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 I2C1 和 GPIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
// 配置 I2C1 的 SDA 和 SCL 引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置 I2C1 参数
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; // 100 kHz
I2C_Init(I2C1, &I2C_InitStructure);
// 使能 I2C1
I2C_Cmd(I2C1, ENABLE);
}
  1. 传感器初始化
c复制代码
#include "bmp180.h"
void BMP180_Init(void) {
uint8_t data;
// 读取校准数据
BMP180_ReadReg(BMP180_CAL_AC1_MSB, &data, 1);
// 其他校准数据读取...
// 配置传感器(如设置测量模式)
// 具体配置取决于传感器规格书
}
  1. 数据读取
c复制代码
int16_t BMP180_ReadTemperature(void) {
uint8_t data[2];
int16_t temperature;
// 发送测量命令
BMP180_WriteReg(BMP180_CONTROL, BMP180_TEMP_CONVERT);
// 等待转换完成
Delay(5); // 假设转换时间为 5ms
// 读取温度数据
BMP180_ReadReg(BMP180_TEMP_MSB, data, 2);
temperature = (data[0] << 8) | data[1];
// 根据传感器规格书进行数据转换
// temperature = ...;
return temperature;
}
  1. 辅助函数
c复制代码
void BMP180_WriteReg(uint8_t reg, uint8_t data) {
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(

 

扫描下方二维码,一个老毕登免费为你解答更多软件开发疑问!

物业管理工单AI调度方案:维修响应缩短至30分钟的核心算法

物业报修总是慢半拍?业主群里天天吐槽维修不及时?物业管理人员为工单分配焦头烂额?别慌!今天给大家揭秘一套超实用的物业工单 AI 调度方案,手把手教你用核心算法把维修响应时间从几小时压缩到 30 分钟内,让业主满意度直线飙升!​据中国物业管理协会发布的《2023 年物业管理行业发展报告》显示,在业主对物业的投诉中,维修响应不及时占比高达 38%。而当维修响应时间控制在 30 分钟以内时,业主对物业的

电商网站加速方案:WooCommerce加载从5s到0.9s的实操

你的 WooCommerce 电商网站是不是也总被用户吐槽 “加载慢如龟”?明明商品超有吸引力,却因为 5 秒的加载时间,白白流失了大量潜在客户!别慌!今天手把手教你把网站加载速度从 5 秒直接干到 0.9 秒,让你的店铺直接起飞!​根据 Akamai 的研究报告显示,网页加载时间每延迟 1 秒,就会导致用户转化率下降 7%,销售额降低 11% ,用户跳出率增加 16%。想象一下,每天几百上千的访

APP开发后如何做A/B测试? (转化率提升指南!界面/文案/按钮优化案例)

辛辛苦苦开发的 APP,转化率却总是上不去?根据麦肯锡发布的《2024 年移动应用用户行为报告》显示,经过科学 A/B 测试优化的 APP,平均转化率能提升 35%!想要让界面、文案、按钮成为转化 “利器”,A/B 测试绝对是必备技能。今天就通过真实案例,手把手教你用 A/B 测试提升 APP 转化率!一、为啥 A/B 测试是转化率的 “加速器”?用数据说话先看两组真实数据:某电商 APP 对商品

APP开发后如何做热更新? (动态修复BUG!不重新上架的更新方案)

APP 刚上线就发现严重 BUG,难道只能等重新上架 “干着急”?据 App Annie 发布的《2024 年移动应用质量报告》显示,因等待重新上架修复问题,平均每个 APP 会流失 12% 的用户。而热更新技术能让你绕过应用商店审核,动态修复 BUG!今天就手把手教你 APP 热更新的实现方案,让你的应用随时 “满血复活”。一、为啥热更新成了开发者的 “救命稻草”?先看一组真实数据:某热门游戏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部