I2C的读写时序

发布时间:2026/9/10 3:16:49

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/9/10 3:47:15

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

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

2026/9/10 7:36:27

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

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

2026/8/25 19:12:17

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

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

2026/9/10 11:42:30

SubAgent实战:基于Microsoft Agent Framework的多智能体架构设计

上周复盘一个智能客服项目,业务方给我看了一段对话记录:用户问“华东区七月销售额为什么环比跌了12%”,助手先是从数据库拉出三百多条订单明细,然后试图在同一个上下文里完成清洗、对比、归因分析,最后生成三页报告。结…

2026/9/10 11:42:30

四类经典机器学习算法在肿瘤临床特征分类中的对比实践

简介:本资源是一套面向计算机、人工智能、数据科学等专业在校学生与初学者的肿瘤识别机器学习实践项目,聚焦医学图像分类任务,覆盖SVM、逻辑回归、决策树、K近邻、随机森林及梯度提升等多种经典算法实现,可直接用于毕业设计、课程…

2026/9/10 11:42:30

期权Delta自动对冲机器人AutoHedge:原理、实现与实战

量化交易的时间越久,我就越觉得“对冲”这件事,做不做是态度问题,怎么做是能力问题。尤其是手里握着期权持仓的时候,看着Delta从正0.3漂到负0.5,那种感觉就像开车时方向盘自己会转,你不去扶,下一…

2026/9/10 11:42:29

CANN/ge获取动态子图API

GetDynamicSubgraph 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Tensor…

2026/9/10 11:42:29

如何用 ECC 的 Plan Canvas 在浏览器中审阅并批准计划?

如何用 ECC 的 Plan Canvas 在浏览器中审阅并批准计划? 【免费下载链接】ECC The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond. …

2026/9/10 11:37:29

C++数据库连接池设计与性能优化实践

1. 为什么需要数据库连接池? 在C后端开发中,数据库操作是系统性能的关键瓶颈之一。每次建立数据库连接都需要完成TCP三次握手、认证、权限检查等系列操作,实测MySQL创建单个连接的平均耗时在50-200ms之间。在高并发场景下,频繁创建…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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