I2C通信——I2C通信的基础介绍

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除 。

参考博客

SPI、I2C、UART(即串口)三种串行总线详解_天糊土的博客-CSDN博客_串口总线

s5pv210 I2C通信详解 - biaohc - 博客园

嵌入式常用技术概览之IIC(I2C)_C_XianRen的博客-CSDN博客_c# iic

很清晰的解读i2c协议_追风de人的博客-CSDN博客_i2c协议(推荐)

一、I2C通信的简介 

1、物理接口

(1)SCL(serial clock)

时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

(2)SDA(serial data)

数据线,通信数据(命令、地址、数据)都通过SDA线传输。

2、通信特征

(1)串行通信

所有的数据以比特为单位在SDA线上串行传输,但每次传输8bit。

(2)同步通信

通信双方工作在同一个时钟。A方通过CLK信号线传输时钟给B,B工作在A传输的时钟下。

(3)电平信号

因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信。

(4)低速率通信

I2C一般用在同一个板子上的2个IC之间,传输的数据量不大,因此本身通信速率很低。一般几百KHz,不同I2C芯片的通信速率可能不同,在编程的时候要看具体设备允许的I2C通信最高速率。

3、突出特征

(1)分为主设备与从设备

  • 通信由主设备发起和主导,从设备只是按照I2C时序协议被动地接受主设备的通信。
  • 谁是主从设备,由通信双方来决定,I2C协议并无规定。

(2)允许多个从设备挂在一条总线上

  • 主设备负责调度总线,决定某一时间与哪个从设备通信。
  • 同一时刻,只能有一个从设备和主设备通信,其他从设备处于休眠状态。
  • 每个I2C从设备在通信中都有一个I2C从设备地址,它是从设备本身固有的属性。这个地址在电路板上是唯一的,但不是全球唯一的。这个地址共7个bit,理论上有128个地址,但有几个保留地址如广播地址0x00等,因此数量少于128个。另外标准协议里预见了地址的局限性,扩充了10位地址的概念。
  • 系统中可能有多个同种芯片,因此从设备的地址分为固定部分和可编程部份。
  • 通信时主设备需要知道从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。
  • IIC可以挂多少个设备?对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个;对于不同的设备来说,标准协议里面没有限制具体的数量,这个由线路布线情况、软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。

(3)采用大端传输方式

SDA传输数据是大端传输,每次传输的有效数据都是1个字节。

4、应用领域

SoC和周边外设之间的通信,典型的如EEPROM、电容触摸IC、各种sensor等。

二、I2C通信的协议

1、I2C通信的内容

(1)开始信号、结束信号

由上图可知,SDA总线空闲是1,且只有下拉操作,故1->0是开始信号,0->1是结束信号。

SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。   

SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

(2)位传输

SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit。

若SDA发生跳变,则用来表示一个会话的开始或结束(如上面讲的)。

SCL为低电平时,SDA线才能改变传输的bit,比如原来传输1,接下来传输0。

(3)应答信号

SDA传输完一个字节后,主机会释放SDA线(传送的数据最后一位若是0,则取消下拉恢复为高电平1,或者最后一位本来就是1),释放后SDA处于高电平的状态,从机就可以控制SDA线了。若从机下拉SDA线并且主机从SDA读到了这一个低电平,则表示从机发送了一个确认信号0;若从机不下拉SDA,则主机读到SDA依然是高电平,故表示一个非应答信号1,这会引起Master发生RESTART或STOP流程

2、数据在总线上的传输协议


这里的读写,是从主机对总线的操作这个角度来说的。比如写,是指主机写数据到总线,那么从机从总线读数据;比如读,是指主机读取总线的数据,那么从机写数据到总线。

(1)write命令

如果为write命令,则主设备释放总线(If the I2C-bus is free, both SDA and SCL lines should be both at High level),即SDA为高位;然后从设备拉低SDA,表示ACK主设备;然后主设备再发送8bit数据,从设备再ACK(A),通信结束(P)。

写寄存器的标准流程:

1.    Master发起START

2.    Master发送I2C addr(7bit)和 W操作0(1bit),等待ACK

3.    Slave发送ACK

4.    Master发送reg addr(8bit),等待ACK

5.    Slave发送ACK

6.   Master发送data(8bit),即要写入寄存器中的数据,等待ACK

7.    Slave发送ACK

8.    第6步和第7步可以重复多次,即顺序写多个寄存器

9.    Master发起STOP

(2)read命令

如果为read命令,则从设备先拉低SDA表示ACK主设备,然后再发送8bit数据。主设备拉低SDA表示ACK从设备(我已经读取8bit的数据),之后结束。

读寄存器的标准流程

1、Master发送I2Caddr(7bit)和 W操作1(1bit),等待ACK

2.   Slave发送ACK

3.   Master发送reg addr(8bit),等待ACK

4.   Slave发送ACK

5.   Master发起START

6.   Master发送I2C addr(7bit)和 R操作1(1bit),等待ACK

7.   Slave发送ACK

8.   Slave发送data(8bit),即寄存器里的值

9.   Master发送ACK

10. 第8步和第9步可以重复多次,即顺序读多个寄存器

(3)总结

  • 每一个通信周期的发起和结束都由主设备进行,从设备只有被动的响应主设备。
  • 主设备先发送8位的从设备地址,其中7位是从设备地址,1位表示主设备接下来是要写数据到总线,还是从总线读取数据。主设备以广播的形式发送,总线上的所有从设备都能收到这个信息。从设备收到地址后,与本身的设备地址对比。
  • 发送方发送一段数据后,接收方需要回应一个ACK,表示收到数据。
  • 在某个时刻,主设备和从设备只能有一个在发(发数据,即向总线写数据,这会占用总线),另一个在收(从总线读)。

换个角度总结如下:

  • 起始位及其后的8个clk中都是主设备在发送(主设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;
  • 然后到了第9周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动),同时从设备试图拉低总线发出ACK。
  • 如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高。这意味着主设备没有收到ACK,主设备就认为刚才给从设备发送的8字节不对。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IBM SOA[ESB,BPM,Portal等]基础架构图解

最近公司对众多的异构系统进行SOA化,产品选型为IBM的Websphere系列产品的WMB,BPM,Portal,LDAP等技术,根据具体的描述,连猜带蒙的画了个系统协作图,有不对的地方欢迎大家拍砖....谢谢。 SOA详细技…

高精度计算

多精度计算 许剑伟 2006-10-31 一、多(高)精度数据表示法: 用字符型数组表示一个高精度的数,以下示范数据结构,左边为数组底端(或说内存底端),下表以底端高位(或说高端…

css3图标悬停导航菜单

纯css3制作的图标悬停导航菜单,包含9中不同的悬停风格,干净大气。转载于:https://blog.51cto.com/jimanyu/1362823

I2C通信——S5PV210的I2C通信简单案例

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考内容 I2C子系统详解3——I2C总线驱动层代码分析_天糊土的博客-CSDN博客 一、S5PV210的I2C控制器 1、为什么需要控制器? 通信双方通过时序协调工作,但是时序比较复杂而…

POJ 2718

题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0) 题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,…

转:跨dll操作fopen的返回值导致出错

从老板的blog那里抄来的,一个很神奇的bug,雷死: 源地址http://www.cnblogs.com/len3d/p/3406294.html 在设置成/MD 或 /MDd 不会导致出错 设置成/MT 或 /MTd 的情况下会导致出错 看了CRT的实现,估计是因为fopen创建了CriticalSect…

HDUOJ---1879 继续畅通工程

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11473 Accepted Submission(s): 5026 Problem Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一…

windows批量关机

建立bat文件,内容如下:net use \\192.168.1.1\ipc$ "admin" /user:"administrator" shutdown -s -f -t 20 -m \\192.168.2.2 net use \\192.168.1.2\ipc$ "admin" /user:"administrator" shutdown -s -f -t 20 -m \\192.16…

动态载入树 (ASP+数据库)

ASPACCESS 在数据量达100万条记录下&#xff0c;载入速度仍然惊人.... // 网上转载. 忘了作者... : ) //********************** Index.asp ************************// 1<%LANGUAGE"VBSCRIPT"CODEPAGE"936"%>2<%OptionExplicit%>3<htm…

ADC——S5PV210的ADC的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 s5pv210 AD转换 - biaohc - 博客园 一、ADC的相关概念 1、量程&#xff08;模拟量的输入范围&#xff09; ADC只能输入电压信号&#xff0c;其他种类的模拟信号要经过传感器的转换&#x…

创建新的swap文件

1&#xff09;决定swap文件的大小&#xff0c;这个一般参照要安装软件的说明2&#xff09;以root用户登录&#xff0c;执行以下命令创建一个swap文件dd if/dev/zero of/swapfile bs1M count1024if后面跟的是设备&#xff0c;不确定可以通过”df –h”命令来查看有哪些硬盘设备。…

【洛谷 2661】信息传递

题目描述 有 nn 个同学&#xff08;编号为 11 到 nn &#xff09;正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象&#xff0c;其中&#xff0c;编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学。 游戏开始时&#xff0c;每人都只知道自己的生日。之…

kernel移植——从三星官方内核开始移植

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、内核移植初体验 1、获取三星官方的内核源码包 三星SMDKV210开发板附带的光盘里有内核源码包&#xff1a;下载地址。 2、构建移植环境 &#xff08;1&#xff09;Windows下建立SI工程&…

Android中实时视频传输(摄像头实时视频传输)解决方案二

为什么80%的码农都做不了架构师&#xff1f;>>> 1、使用FFMpeg进行视频采集&#xff0c;使用Live555进行RTP传输&#xff0c;使用VideoView进行播放。 csdn提到&#xff1a;重载FrameSource&#xff0c;写一个服务类&#xff0c;可以从FrameSource的派生类读取帧数…

很好的 .NET 换肤软件 IrisSkin

当前.NET下提供换肤的控件有IrisSkin和DotNetSkin。但是DotNetSkin提供的Demo版本&#xff0c;功能有限制&#xff0c;一时找不到可以破解的完全版。IrisSkin 的功能不比DotNetSkin差&#xff0c;而且使用简单。不需要原始文件&#xff0c;只需要dll文件和皮肤文件。详细信息可…

定时器——S5PV210定时器的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、定时器简介 1、定时器的含义 定时器作为SoC的外设&#xff0c;主要用来实现定时执行代码的功能&#xff0c;它相对SoC而言&#xff0c;就像闹钟相对于人的意义一样。定时器内部的计数器每隔一个…

gson的简单使用方法

gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段&#xff0c;同时gson又可以通过使用annotation来灵活配置需要序列化的字段。 下面是一个简单的例子&#xff1a; publicclassPerson {privateString name;privatein…

String.Format格式说明

C#格式化数值结果表字符说明示例输出C货币string.Format("{0:C3}", 2)&#xff04;2.000D十进制string.Format("{0:D3}", 2)002E科学计数法1.20E0011.20E001G常规string.Format("{0:G}", 2)2N用分号隔开的数字string.Format("{0:N}", …

linux bjobs

bjobs 查看正在进行的job bkill job id 杀死job 转载于:https://www.cnblogs.com/zk-szd1314/p/11322460.html

uboot的移植——DM9000移植的理论基础

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 一、网卡相关的基本知识 1、DM9000网卡芯片和SoC的连接 如上图所示&#xff0c;DM9000网卡芯片是通过SROM总线接口&#xff0c;或者说SROM控制器接入SoC的。下面分别介绍SROM控制器、DM9000网卡芯片的相关…