I2C的读写时序

发布时间:2026/11/1 11:40:24

I2C的读写时序 1. I2C总线基础概念I2CInter-Integrated Circuit是一种由飞利浦公司开发的半双工、同步、串行通信总线广泛应用于微控制器与外设之间的低速通信。它具有以下特点两线制仅需SCL时钟线和SDA数据线两根信号线多主多从支持多个主设备和从设备连接在同一总线上地址寻址每个从设备有唯一的7位地址共127个地址标准速率100KHz标准模式和400KHz快速模式上拉电阻总线需要4.7KΩ-10KΩ的上拉电阻2. I2C通信时序详解2.1 起始信号与停止信号起始信号STARTSCL为高电平时SDA从高电平变为低电平下降沿表示一次通信的开始停止信号STOPSCL为高电平时SDA从低电平变为高电平上升沿表示一次通信的结束2.2 数据传输规则I2C采用MSB先行高位先发的传输方式数据发送SCL为低电平时发送方可以改变SDA数据线数据采样SCL为高电平时SDA必须保持稳定接收方在此刻采样数据应答机制每发送8位数据后第9个时钟周期为应答位ACK低电平接收方成功接收数据NACK高电平接收方未成功接收或通信结束2.3 从机地址格式7位从机地址 1位数据方向位| 7位地址 | R/W | |---------|-----| | 1010110 | 0 | // 写操作 | 1010110 | 1 | // 读操作数据方向位0主机向从机写数据1主机从从机读数据3. I2C读写时序分析3.1 写操作时序3.2 读操作时序4. IMX6ULL平台I2C驱动实现4.1 寄存器定义与宏// I2C控制寄存器(I2CR)位定义#defineIEN(7)// I2C使能位#defineMSTA(5)// 主/从模式选择#defineMTX(4)// 发送/接收模式选择#defineTXAK(3)// 发送应答使能#defineRSTA(2)// 重复起始条件// I2C状态寄存器(I2SR)位定义#defineICF(7)// 数据传输完成标志#defineIBB(5)// 总线忙标志#defineIAL(4)// 仲裁丢失标志#defineIIF(1)// 中断标志4.2 I2C初始化函数#includeMCIMX6Y2.h#includecore_ca7.h#includefsl_iomuxc.h#includei2c.h#includedelay.hvoidi2c_init(void){// 1. 引脚复用功能配置IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL,1);IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA,1);// 2. 电气属性配置IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL,0xF0B0);IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA,0xF0B0);// 3. 设置波特率100KHzI2C1-I2CR~(17);// 先禁用I2CI2C1-IFDR0x15;// 设置分频值I2C1-I2CR|(17);// 使能I2C}4.3 I2C写操作实现voidi2c_write(I2C_Type*base,unsignedchardev_address,unsignedcharreg_address,constunsignedchar*data,intlen){// 1. 通信前清除IIF和IAL标志位base-I2SR~((1IAL)|(1IIF));// 2. 等待数据传输完成while((base-I2SR(1ICF))0);// 3. 发送起始信号base-I2CR|(1MSTA);// 4. 设置为发送模式base-I2CR|(1MTX);// 5. 使能应答base-I2CR~(1TXAK);// 6. 清除中断标志base-I2SR~(1IIF);// 7. 发送从机地址写模式base-I2DRdev_address1;// 8. 等待从机应答while((base-I2SR(1IIF))0);base-I2SR~(1IIF);// 9. 发送寄存器地址base-I2DRreg_address;// 10. 等待从机应答while((base-I2SR(1IIF))0);base-I2SR~(1IIF);// 11. 发送数据字节while(len--){base-I2SR~(1IIF);// 清除中断标志base-I2DR*data;// 发送数据while((base-I2SR(1IIF))0);// 等待应答}// 12. 发送停止信号base-I2CR~(1MSTA);// 13. 等待总线空闲while((base-I2SR(1IBB))!0){delay_us(100);}}5. 关键代码解析5.1 波特率计算IMX6ULL的I2C时钟源为66MHz通过IFDR寄存器分频得到目标波特率IFDR 0x15 对应分频值计算公式为实际波特率 66MHz / (分频值 × 2)0x15对应十进制21计算得66MHz / (21 × 2) ≈ 1571.4KHz再经过内部预分频得到标准100KHz5.2 状态机控制I2C通信需要严格的状态控制总线空闲检测通过IBB位判断总线是否被占用仲裁丢失处理IAL标志位检测多主竞争超时机制while循环需要添加超时判断错误恢复通信异常时需要重新初始化总线5.3 时序关键点// 起始信号生成base-I2CR|(1MSTA);// SCL高电平期间SDA从高变低// 停止信号生成base-I2CR~(1MSTA);// SCL高电平期间SDA从低变高// 应答检查if((base-I2SR(1RXAK))0){// 收到ACK}else{// 收到NACK通信异常}
延伸阅读

更多相关文章

2026/10/30 23:00:08

UE5编辑器扩展实战:基于Slate与UMG打造自定义场景管理面板

1. 项目概述:为什么我们需要自定义场景管理面板?在虚幻引擎5(UE5)的日常开发中,无论是构建开放世界、制作复杂的叙事关卡,还是管理一个拥有大量子关卡和流送区块的项目,场景(关卡&am…

2026/10/31 11:19:25

半导体MFC响应时间怎么测?T10、T90与稳定时间定义,附Python分析代码

摘要 半导体MFC响应时间不能只写成一个没有条件的毫秒数。完整的MFC响应时间测试至少应同时说明设定值阶跃时刻、T10、T90、10到90上升时间、稳定误差带、稳定时间和超调量,并记录测试气体、流量范围、入口压力、出口压力、温度、采样率、参考仪器及滤波条件。 本文…

2026/10/30 16:16:09

Windows消息机制与RegisterWindowMessage跨进程通信详解

1. 理解Windows消息机制基础Windows消息机制是操作系统进程间通信(IPC)的基石之一。这种基于事件驱动的通信方式,允许不同应用程序甚至同一程序的不同线程之间进行数据交换和状态同步。在Windows编程中,几乎所有的用户交互和系统事件都以消息的形式传递。…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑