通过实例来分析I2C基本通信协议

本文旨在用最通俗易懂的方式,让大家明白I2C通信的过程究竟是怎么回事。

I2C起源于飞利浦公司的电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C

总的来说,I2C可以简单归纳为,两根线,一个时钟线,一个数据线;一个总线上,一个主控,多个从设备。I2C的作用当然是用来传输数据,它的最大特点就是仅仅用了2根线,可以完成对总线上多个从设备的有序通信,这就依赖于其通信协议了。

主控相当于I2C的大脑,每一次读写操作都必须是主控发起的。这样就保证了多个从属设备间是无法直接通信的,这样就防止了仅有的2根线上数据传输发生混乱。

我们还是简单回顾一下《I2C 简介》中的I2C 总线的几种信号状态

1. 空闲状态:SDA 和 SCL 都为高电平。

2. 开始条件(S):SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

3. 结束条件(P):SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

4. 数据有效:在 SCL 的高电平期间,SDA 保持稳定,数据有效。SDA 的改变只能发生在 SCL 的低电平期间。

5. ACK 信号:数据传输的过程中,接收器件每接收一个字节数据要产生一个 ACK 信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。

  • 空闲状态

当没有数据需要读写时,大家风平浪静,时钟和数据线都是出于高电平状态,但是当传输数据时,就必须有一个规则产生,那就是

  • 开始条件(S)

Start: 在clk为高的情况下,data由高变低为start。

  • 结束条件(P)

Stop:在clk为高的情况下,data由低变高是stop。

  • 数据有效

只有在clk为高的时候,数据才有效。Clk为低,数据无效。

  • ACK 信号

每一个字节完成,都会有一个ack,无论由master还是slave发出。ack位是低电平,表示有应答,如果是高电平,表示无应答。

  • 读写协议

读数据需要有offset。所以offset需要先用写协议告诉slave,然后再读。

所以一个完整的写协议就是: S 7_BIT_ADD W A OFFSET A RS 7_BIT_ADD R A DATA A P

ST: 起始位

SAD: 设备地址

SAK: 从设备应答位

MAK: 主控应答位

SUB: offset

DATA: 具体数据

SP: 结束位

  • 实例分析

二进制串为S 001111000 000010000 {RS} 001111010 110111101 P

翻译就是3C 08 3D DE

另外可以看出,RS restart 和start波形很相似,而且P之前slave没有ack,就说明slave不准备再提供数据了,说明是byte读。

如果要读多byte,因为这个是st的sensor,所以在offset位最高位写1就行了。这是st的private规定。

数据位是S 001100000 001000000 001001110 P

翻译一下就是30 20 27,slave address 18 (30/2) offset 20, data 27.

从图中可以看出,第九位应答位为高,说明并没有master并没有收到应答

数据位是S 001111001 000000001(并不是完整的波形)

翻译一下slave address 1e(3c/2) offset 0 .....

本文简单分析了I2C的读写的具体过程,以及根据几个波形图的实例,分析了具体发送的数据,供大家参考!

通过实例来分析I2C基本通信协议

时间: 2024-10-06 23:53:20

通过实例来分析I2C基本通信协议的相关文章

Hadoop初学指南(6)--MapReduce的简单实例及分析

本文在上一节的基础上通过一个简单的MR示例对MapReduce的运行流程进行分析. 假设有两行数据,分别是hello you,hello me,我们要统计其中出现的单词以及每个单词出现的次数. 所得的结果为 hello   2 you     1 me      1 (1)大致运行流畅 1.解析成2个<k,v>,分别是<0, hello you><10, hello me>.调用2次map函数. 2.执行map任务 3.map输出后的数据是:<hello,1>

Android中的消息处理实例与分析

Android中的消息处理实例与分析 摘要 本文介绍了Android中的消息处理机制,给出了Android消息处理中的几个重点类Handler.Message.MessageQueue.Looper.Runnable.Thread的详细介绍,提供了两个消息处理的实例代码,并深入分析了使用Android消息机制应该遵循的几个原则. 阅读本文的收获 在具有java基础的情况下,Android的学习比较轻松,很多人在没有深刻了解Android消息处理机制的背景下,已经能够开发出可用的app,很多人开始

电脑声卡维修经验和实例完全分析

电脑声卡维修经验和实例完全分析 声卡无法"即插即用" 1.检查声卡跳线是否正确.例如,一块联讯OPTI931声卡,有一说明书上没有的隐含跳线JP3,短路即为PnP,开路时Windows 95认不出声卡,但出厂时默认为开路! 2.如果你的声卡号称PnP,但Windows95就是不认怎么办?像以前很难安装的007声卡,解决方法很简单:假设安装前操作系统是DOS,先安装DOS下的声卡驱动再进行Windows 95的安装,在安装中间提示"本机即插即用设备"时选择"

Netty入门实例及分析

什么是netty?以下是官方文档的简单介绍: The Netty project  is an effort to provide an asynchronous event-driven network application framework and tools for rapid development of maintainable high performance and high scalability protocol servers and clients. In other

SQLServer数据库,表内存,实例名分析SQL语句

--数据库内存分析 USE master go DECLARE @insSize TABLE(dbName sysname,checkTime VARCHAR(19),dbSize VARCHAR(50),logSize VARCHAR(50)) INSERT INTO @insSize ( dbName, checkTime, dbSize, logSize ) EXEC sp_msforeachdb 'select ''?'' dbName,CONVERT(VARCHAR(19),GETDA

backbone实例todos分析(二)view的应用

在上一篇文章中我们把todos这个实例的数据模型进行了简单的分析, 有关于数据模型的操作也都知道了.接着我们来看剩下的两个view的模型,以及它们对页面的操作. 首先要分析下,这个俩view是用来干嘛的.按照自己的想法,一个页面上的操作,直接用一个view来搞定不就行了吗,为何要用两个呢? 我觉得这就是新手和老手的主要区别之一,喜欢在一个方法里面搞定一切,随着时间的推移,再逐渐重构,让代码变得灵活可扩展.但既然我们拿到一个成熟的代码,就应该吸取其中的精华. 我觉得这里面的精华就是,将数据的展示和

Hello2实例的分析

首先: java EE 上的hello2项目是一个部署在glass fish上的开发源码的java web项目,在终端通过命令行使用maven进行打包成.war文件,最后部署到相关的glass fish服务器上. Java EE 的hello2 不同于hello1 的不同之处在于,前者可以直接通过hello1项目名进行访问文件,后者需要通过访问编写的greeting的web文件才能够访问到hello2文件. 其中的原因在于如下: 1:在hello2的项目中,采用的是Java servlet  技

Java RMI(远程方法调用) 实例与分析 (转)

目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocation):远程方法调用,顾名思义,通过远程的方式调用非本地对象的方法并返回结果.使用远程调用通常解决本地计算瓶颈问题,例如分布式记算,最近很火的阿尔法狗人机大战,据说运算使用上千个CPU. JRMP(java remote method protocol):java远程方法协议,这是完成java到j

面向对象之父类变量指向子类实例对象分析

父类 public class person { public static string markup; static person() { markup = "markup"; } //无参数构造函数 //public person() //{ // Console.WriteLine("调用person构造函数"); //} public person(int parage, string paraname, string parahobby) { age =