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详细技…

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,…

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省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一…

动态载入树 (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…

【洛谷 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的派生类读取帧数…

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

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

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

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

javascript深入浅出

第一章 数据类型 1&#xff0c;六种数据类型&#xff1a;原始类型&#xff08;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff09; object对象&#xff08;Function Array Date&#xff09; 2&#xff0c;隐式转换&#xff1a;Na…

网络通信基础常识

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、网络通信属于进程间通信 进程间通信的一种方法是使用套接字socket&#xff0c;网络通信其实就是位于网络中不同主机上面的2个进程之间的通信。 2、网络通信的层次 网络通信的层次&#xff0c;即…

Android NDK工程创建与编译运行

首发地址&#xff1a;http://www.eoeandroid.com/thread-201993-1-1.html一、 工程创建1. 创建一个Android工程配置好开发环境并加载好对应版本sdk后&#xff0c;选择菜单File->New-> Project创建工程&#xff0c;工程类型选择Android Project&#xff0c;如下图所示&…

[Quatsch]Quantum Or Optics

小生预言&#xff0c;鉴于目前CG产业中学术界与生产界之间的差异&#xff0c;未来必将有一门独立的学科&#xff0c;专门用于研究自然界的材质特性与表现&#xff0c;从此艺术界与学术界将呈现完美之统一&#xff0c;应该先在MIT或者Cornell出现。本人姑且将这门学科命名为“应…

C#事件 的讲解

一、事件的本质事件是软件系统里的两个子系统之间&#xff0c;或者两个模块之间&#xff0c;或者两个对象之间发送消息&#xff0c;并处理消息的过程。在面向对象的世界里&#xff0c;就可以统一认为是两个对象之间的行为。两个对象之间发送的这种消息&#xff0c;对发送方来讲…

phpMyAdmin密码设置

2019独角兽企业重金招聘Python工程师标准>>> 在使用phpMyAdmin操作数据库时&#xff0c;首先需要设置mysql的root用户的密码。具体操作参考前一篇博文。设置完mysql的root密码之后&#xff0c;需要对phpMyAdmin的登录进行一些配置。 未经配置的phpMyAdmin很不安全&a…

抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库&#xff08;语料库&#xff09;&#xff0c;采集博客、微博、问答库的信息。将数据库的内容进行训练&#xff0c;最后应该是做成一个类似中文siri的模型吧。 第一步新闻抓取器已经稳定运行了&#xff0c;基本原理用的是爬虫去爬新闻门户网站的…

四旋翼无人机调研结果

P.S&#xff1a;作者曾在大学某次小班课上看到该视频&#xff0c;深深被震撼了&#xff0c;因此对无人机念念不忘。 恰逢某课程要求讲解自己喜欢的领域的内容&#xff0c;因此对四旋翼无人机进行了调研。