快速简单理解i2c标准协议

tony之I2C协议简单理解 一、技术性能: 工作速率有100K和400K两种;                      支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控;     由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 阅读详情

对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置。今天,我们就随便聊聊这个I2C协议。

 

     I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。

 

     I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它是啥都不干的,更不会自动发送数据;而主设备,则是起到控制作用,一切都是从它开始。

 

     除了GND以外,I2C有两根线,分别是SDA和SCL,所有的设备都是接到这两根线上。那么,这些设备如何知道数据是发送给它们呢?这就得依靠前面所说到的地址了。设备I2C的地址是固定的,比如0x50,0x60等等。因为只能有127个地址,地址冲突是很常见的,所以一般设备都会有一个地址选择PIN,比如拉高时候为0x50,接地为0x60。如果无论拉高还是接地,都和别的芯片有冲突,那该怎么办呢?答案是:凉拌,没办法。遇到这种情况,只能换芯片了。

 

     我们来看I2C协议中的数据传输时序图:


 

     SCL是时钟,SDA承载的是数据。当SDA从1变动到0,而SCL还是1时,表示开始数据传输。接下来的7位,就是设备的地址。紧接着的是读写标志,其为1时是读取,为0则是写。如果I2C总线上存在着和请求的地址相对应的设备,则从设备会发送一个ACK信号通知主设备,可以发送数据了。接到ACK信号后,主设备则发送一个8位的数据。当传输完毕之后,SCL保持为1,SDA从0变换到1时,标明传输结束。

 

     从这个时序图中可以看到,SCL很重要,并且哪个时钟沿是干嘛的,都是确定好的。比如,前面7个必定是地址,第8个是读写标志,数据传输必须是8位,必须接个ACK信号等等。

 

     前面的时序图并没有标明数据传输的方向,我们现在看看写操作的数据流向:


 

     网格的是主设备发送的,白色格子是从设备发送的。从图示中可以看到,对于写操作,从设备都只是发送ACK进行确认而已。

 

     而读操作的数据流向,就有所不同,如图:


 
     这时候,从设备除了发送ACK以外,紧跟着的还有数据。


我们用示波器来查看波形图,以便于理解。


将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:


从图中可知时序如下:

  1. 由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
  2. 接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
  3. 接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
  4. 接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
  5. 还有其它数据和最后的停止位,图中被截掉了。

从图中可知,纵向一格是200mV,则SDA和SCL的电平大概就是350mV;由于信号笔上设置了信号x10,因此实际电平应该大概是3.5V(理论上应该是3.3V)。横向一格是25us,10个时钟周期大概用了4格,即4x25us=100us,平均每个时钟周期是10us,可算出传输频率为1/10us=100,000/s,即100k bps。



既有读又有写的波形图:


I2C是由2根线进行操作的,一个是主控时序SCL,另一根主控数据SDA

对于操作主要分成读写,读写的两个操作有部分是相似的

而时序的操作主要分为:START,DATA,ACK,STOP,NOACK

 

写的时序用到的时序为:STRAR,DATA,ACK,STOP

时序如图所示:

 

读时序用到的时序有:START,DATA,ACK,STOP,NOACK

时序如图所示:

 

下面对时序的说明:

IDLE:空闲的时候,尽量将SDA和SCL拉到高电平

START:保持SCL为高电平,然后SDA由H->L

DATA:数据是当SCL为低电平的时候数据有效,也就是说,SCL由L->H的时候,采集SDA的数据

ACK:在发完数据后,从设备会将SDA拉到L

NOACK:在发送完数据后,从设备不会将SDA拉低

STOP:保持SCL为高电平,然后SDA由L->H

 

好了,说一下时序的流程和时序图:

写时序的流程是:START –>

                      从设备的写地址 –> ACK –>

                      从设备的寄存器地址 –> ACK –>

                      写入的数据 –> ACK –>

                      STOP

写时序图:

 

读时序的流程是:START –>

                      从设备的写地址 –> ACK –>

                      从设备的寄存器地址 –> ACK –>

                      从设备的读地址 –> ACK ->

                      读出的数据 –> NOACK –>

                      STOP

读时序图:

 

其中要注意的是I2C的2根线上都必须接上拉电阻,阻值一般是4.7K

在获得ACK的时候,一般将SDA输出一个高阻,然后再读入ACK,好让从设备拉低SDA


转载:http://blog.youkuaiyun.com/k_linux_man/article/details/7224810


另外一篇参考文章:

http://blog.chinaunix.net/uid-24545924-id-84564.html



【计算机网络】一图让你看懂!计算机网络模型之网络层 计算机网络模型之网络层 一、网络层 1.网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间。 2.为经过源端的传输层发送过来的分组进行选择合适的路由和交换结点,并通过IP寻址 的方式正确无误地将分组发送到目的端 的传输层。 二、网络层数据封装 1.封装 封装:接收来自传输层的传输层片段(TCP报头+上层数据),并将IP报头封装到报文上,组成IP数据报。 2.IP报头 IP报头:其中IP报头由源地址、目的地址等IP地址和 数据组成。 3.IP地址 IP地址:地址 唯一 标识一台网络设备,由32个二 阅读详情

相关推荐

imx6ull——I2C驱动

SCL 为高电平,SDA 出现下降沿:起始位SCL 位高电平,SDA出现上升沿:停止位主机——从机地址(ack)——寄存器地址(ack)——数据(ack)重点:先是写,因为要写入从机让从机知道主机要读,再是读主机——从机地址(写)(ack)——寄存器地址(ack)——从机地址(读)(ack)从机——发送数据(主机发送no ack)1-7位放要访问的从机地址I2c频率不能随便分,只能选。

ljh5930的博客 1916

STM32 IIC详解

本文的程序是主控室STM32F207,读取的芯片是PCF8563。各种宏定义和文件会在末尾说明。 1、IIC的定义: IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同...

人生一路,点滴记录 10万+

arduino i2c 如何写16位寄存器_快速简单理解I2C标准协议

欢迎FPGA工程师加入官方微信技术群I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它是啥都不干的,更不会自动发送数据;而主设备,则是起到控制作用,一切都是从它开始。除了GND以...

weixin_39653766的博客 913

i2c时序图_快速简单理解i2c标准协议

对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置。 I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。 I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它...

weixin_39773215的博客 2331

光模块标准协议解析:从EEPROM到CMIS,掌握高速网络核心管理技术

在现代数据中心与通信网络中,设备间的互操作性与可管理性依赖于一套标准化的通信协议。其核心原理在于定义了硬件接口、电气信号以及数据交换的规则,确保不同厂商的组件能够协同工作。这一技术价值在于实现了网络设备的即插即用与智能监控,是构建稳定、高效网络基础设施的基石。其典型应用场景包括数据中心互联、5G基站前传以及企业核心网络。具体到光模块领域,这套协议通过SMBus等管理总线访问模块内部的EEPROM存储器,实现了对模块身份、技术参数及实时运行状态(如光功率、温度)的读取与监控。随着网络速率向400G/800G演

weixin_33491377的博客 272

STM32 I2C通信模式实践:模拟主机与硬件从机

STM32微控制器是STMicroelectronics(意法半导体)推出的一系列高性能32位RISC微控制器,属于ARM Cortex-M系列处理器。具有灵活、高性能、成本低等特点,广泛应用于工业控制、医疗设备、智能家居等领域。这些微控制器内置了丰富的外设接口,如I2C、SPI、USART等,并拥有强大的处理能力和丰富的开发资源。I2C(Inter-Integrated Circuit)协议由飞利浦半导体(现为NXP半导体)在1980年代初期开发,旨在促进CPU与外围设备之间以及外围设备之间的通信。

weixin_33363025的博客 1023

i2c时序图_快速简单理解I2C标准协议

欢迎FPGA工程师加入官方微信技术群I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它是啥都不干的,更不会自动发送数据;而主设备,则是起到控制作用,一切都是从它开始。除了GND以...

weixin_39693193的博客 922

NX/UG二次开发—CAM—设置程序修剪边界Boundary

最近做了一个设置CAM程序边界的小工具,分享一下经验(官方的代码在文章末尾处),以下均以修剪边界曲线为例。 以下为官方提供的源码: /***************************** Include Files **********************************/ #include <stdlib.h> #include <uf.h> #include <uf_obj.h> #include <uf_object_type

门前大桥下,游过一群鸭,快来看一看,原来是C++ 3733

[单片机框架][bsp层][cx32l003][bsp_i2c] I2C/IIC硬件配置和使用

I2C 是双线双向的串行总线,它为设备之间数据交换提供了一种简单高效的方法。I2C 标准是一个具有冲突检测机制和仲裁机制的真正意义上的多主机总线。它能防止两个或者多个主机在同时请求控制总线时发生数据冲突。I2C 总线控制器,能满足 I2C 总线的各种规格并支持所有与 I2C 总线通信的传输模式。I2C 总线使用连接设备的"SCL"(串行时钟总线)和"SDA"(串行数据总线)来传送信息。

嵌入式单片机实验室 1210

ROS入门必学导航算法——Navigation

该平台集成了多款无人车底盘,包括履带式、四轮差速、阿克曼、麦克纳姆轮底盘等,以满足不同形式和配置的需求,并搭载了RTK定位系统、双目相机、深度相机和激光雷达等多种传感器,以满足开发者的科研需求。amcl节点接收里程计数据(通过"odom"话题)和激光雷达数据(通常通过"scan"话题),结合已知的地图,实时地估计出机器人在该地图上的位置。在ROS中,这是通过"tf库"变换实现的,通过将传感器数据转换到共同的参考系中,系统可以更容易地集成来自不同传感器的数据,并确保它们在相同的空间和时间范围内可用。

AMOVLAB(阿木实验室) 2908

在线绘制富集分析多组气泡图和单细胞分析marker基因矩阵气泡图

常规的GO或者KEGG通路富集分析结果通常以气泡图的形式展示,然而这个气泡图仅仅是一个比较的结果,如果想在一张图上展示多个比较的结果,就需要用到多组气泡图(图1,左侧)。 单细胞RNA-seq分析结果中,矩阵形式的气泡图可以很好地展示marker基因(X轴)在不同cluster(Y轴)中的表达情况(图1,右侧)。

微生信 3665

i2c读写Verilog代码资源库介绍:数字电路设计的I2C通信解决方案

i2c读写Verilog代码资源库介绍:数字电路设计的I2C通信解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代数字电路设计中,I2C(Inter-Integrated Circuit)通信协议因其高效的数据传输和简洁的线路连接而广泛应用。今天,我要向大家推荐一个开源项目——i2c读写Verilog代码资源库。这个资源库提供了一套完善的Verilog代码...

gitblog_06704的博客 754

STM32F407+LAN8720A+LwIP实战:FreeModbus TCP从机功能开发指南

本文详细介绍了基于STM32F407和LAN8720A硬件平台,结合LwIP协议栈实现FreeModbus TCP从机功能的开发指南。内容涵盖硬件连接、LwIP移植、FreeModbus TCP从机实现、任务调度及调试技巧,为工业控制领域的以太网通信开发提供实用参考。

weixin_29190651的博客 546

I2C协议标准(中文版)资源下载介绍

I2C协议标准(中文版)资源下载介绍 【下载地址】I2C协议标准中文版资源下载介绍 这是一份精心整理的I2C协议标准中文版资源,旨在帮助电子工程师、嵌入式开发者及相关专业学生深入理解I2C总线技术。文档详细介绍了I2C协议的规范与要求,内容全面且易于学习。通过这份资料,您可以快速掌握I2C通信的核心原理与应用技巧,提升开...

gitblog_06723的博客 330

初级文章【西门子】字符拼接成字符串

针对S7-400极其以下PLC,1200往上据说有专门的块了呢,首先,我是不用库的,需要什么函数会自己写,OK进入正题。 首先,我们有一个DB块,里面有14个char,一个14位的char数组和一个14位的string。如下图。 我们的目的是将char1-char10拼接成一个string。 第一种方式:第一步,将char放进数组。 ​​​​​​​ 相信大家都能看明白,但是我还是要解释解释 L取值2 T赋值到临时变量DBNO(INT) OPN DB [#DBNO]获取DB块,这一句.

NS_Speak(IVAV) 1万+

2021.07.05【R语言】丨预测lncRNA并绘制venn图

目录摘要环境与方法依赖工具预测工具绘制工具使用命令预测lncRNA统计noncoding_ID绘制Venn图结果展示总结 摘要 接到一个单样品测lncRNA数据的项目,正好拿来练练手,梳理一下lncRNA流程。这里记录预测lncRNA并生成venn图的过程 环境与方法 R version 3.6.3 (2020-02-29) 依赖工具 预测工具 CPC2 CNCI Pfam CPAT 绘制工具 R:VennDiagram 使用命令 预测lncRNA CPC2 #更换env conda activate py

2035
上一篇: C++ 虚基类、虚继承
下一篇: Android中Path类的lineTo方法和quadTo方法画线的区别
panfengsoftware
博客等级 码龄20年 38粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值