I2C 基础原理详解
今天来学习下I2C通信~

I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式。如上图所以有很多的周边设备都是用I2C通信方式进行通信的。

I2C(Inter-Intergrated Circuit)通信使用Clock Line(SCL:Serial Clock)和Data Line(SDA:Serial Data)。数据通过时钟同步经过数据线进行传输。这里生成时钟信号并输出的设备便是Master, 时钟信号作为输入并接受数据的设备便是Slave。一般情况下Master便是MicroController,Slave便是周边的设备,比如RTC, EEPROM, TOUCH等等。

上面我们提到I2C是同步通信的。同步通信需要独立的时钟线进行同步传输数据。我们看上面的图可以知道这里只有一根数据线。我们用一根数据线来同时进行数据发送和数据接受。那么我们为什么需要设定通信速度呢?对于同步通信,有了独立的时钟信号进行同步发送数据根本不需要匹配Bit Width的啊?为什么同步通信还要设置通信速度呢?
在I2C中我们说的通信速度指的是Clock的最大速度(MAX SPEED),比方说Slave最多只能在100KHz下工作,但是Master在400KHz的频率下工作,这样的话他们就不能进行正常数据通信,所以我们需要设定设备时钟的最大速度。

现在我们对I2C的基本通信情况是不是有了初步的了解了呢?
现在我们的Master想发送数据给Slave,但是周边有很多的Slave,那么Master怎么把数据发送给自己向发送的设备呢?用Device Address(设备地址)!

Master为了能将数据发送给想发送的设备就需要能区分设备(slave)的方法。Master通过设备的地址来区分周边的设备并进行数据接发。也就是说Master通过[设备地址&R/W+数据]形式的数据发送到I2C bus中,所有的设备读取bus上的这些数据,判断是不是发送给自己的,如果是发送给自己的就给Master一个响应。

前面我们一直提到I2C是通过同步时钟在数据线(SDA)上进行数据接发的。这里我们来边看图边分析看看。一般情况下同步时钟上升沿或者是下降沿来接受或者发送数据的。但是I2C是在高电平(HIGH)的区间里数据有效,低电平区间内数据进行转换的。

前面我们通过硬件方式了解了下数据是怎么发送接收的。那么数据在发送接收之前数据接发的开始标记和结束标记是如何通过硬件方式来规定的呢?数据接受发送的时候必须要知道开始标记和结束标记才能进行正常的数据接受对吧??

I2C的开始标记和结束正如图所示。时钟信号在高电平的情况下数据信号从高电平转为低电平的话即为I2C通信的开始标记,时钟信号在高电平的情况下数据信号有低电平转为高电平的话即为I2C通信结束标记。

现在我们基本了解了硬件形式下I2C的[START+DATA+STOP]是如果进行工作的。现在我们来了解下I2C通信的最小单位是怎样的。Master在时钟信号为高电平并且数据信号有高电平转为低电平的时候开始I2C通信。然后伴随着时钟的同步进行8bit的数据传送或者是接受。后面第9bit的数据(ACK)是用来确认数据接发是否正常。最后时钟信号高电平并且数据信号有低电平转为高电平,即I2C通信终止结束。就是这样I2C包含ACK总共9bit为通信的最小单位. 了解了这些,下面我们来看看上面提到过的[Device Address&R/W + data]形式的数据是如何传输的。
1. Master在时钟信号->High并且数据信号由高电平转为低电平,I2C通信开始。

2. Maste伴随着时钟同步传输8bit的数据。这里说的8bit数据指的是7bit的Device Address和1bit的R/W。

3. 这里的Device Address在我们用的设备DataSheet里面有说明的。这里需要注意到是比方说设备地址是1101000(0x68, 7bit),数据传输的时候因为要和1bit的W/R一起,所以这里要将device address左移一位,然后和W/R进行OR操作。

4. Master传输的设备地址对应的设备是否正确接发通过ACK进行响应确认。

5. 如果Master只是以 START + data 8bit(device address&R/W) + ACK这种格式发送后就结束的话也可以。但是一般情况下在地址发送之后紧接着会发送数据。

6. Master能对特定的设备进行数据发送或者是数据接受。在设备地址数据发送之后便可紧接着要发送的数据或者是要接受的数据。

7. Master在发送或者接受数据的时候不需要规定要发送或者接受多少bit 的数据。因为这个依据不同设备而不同,所以依据设备自己想要的格式进行收发数据即可。

8. Master在时钟信号为高电平并且数据信号有低电平转为高电平的话便终止结束通信。

现在我们已经了解了I2C整个通信过程中的数据格式以及通信方式。实际写代码过程中依据Datasheet中说明的Register情况来写就可以了。
I2C部分到此结束~
未经允许不得转载:浩瀚先森 » I2C 基础原理详解
I2C 基础原理详解的更多相关文章
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- Influxdb原理详解
本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 Infl ...
- 【转】VLAN原理详解
1.为什么需要VLAN 1.1 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.V ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- Storm概念、原理详解及其应用(一)BaseStorm
本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数“wordcount” ...
- JSPatch实现原理详解<二>
本文转载至 http://blog.cnbang.net/tech/2855/ 距离上次写的<JSPatch实现原理详解>有一个月的时间,在这段时间里 JSPatch 在不断地完善和改进, ...
- [转帖]HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...
- Cisco路由技术基础知识详解
第一部分 请写出568A的线序(接触网络第一天就应该会的,只要你掐过,想都能想出来) .网卡MAC地址长度是( )个二进制位(16进制与2进制的换算关系,只是换种方式问,不用你拿笔去算) A.12 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙
消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...
随机推荐
- ABP 初探 之 多语言
最近几天空闲时间比较多,就研究Abp的多语言,Abp是基于接口的依赖注入,有很多思想与方法都很好,需自己深入体会与应用,转化成自己的思想应用于实践. 本篇介绍基于 开源Demo ModuleZeroS ...
- jQuery Mapael – 呈现动态的矢量地图
jQuery Mapael 是基于 Raphael.js 的一个 jQuery 插件,可以显示动态矢量地图.例如,使用 Mapael 可以显示国家能够点击的世界地图.此外,你可以用圈,方形或者图片来标 ...
- 使用hovertree菜单作为后台导航
hovertree是一个jquery菜单插件,官方网址:http://keleyi.com/jq/hovertree/ ,可以登录该网址体验效果. 0.1.3版本:http://keleyi.com/ ...
- 2016第16本:TED演讲的秘密
花0.01元抢购了<得到APP>中的<成甲说书:TED演讲的秘密>,不到30分钟的音频,感觉全是干货,基本不用看原书了.如果在以后的演讲中随便应用几条都可以让演讲水平提升一大截 ...
- android 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- # iOS 10 适配 # 适配刷新控件 以MJRefresh 为例
在iOS10中ScrollView 添加了一个refreshControl的东西 - - 不知道水果公司做了什么 导致原有的刷新控件类刷新后frame.y 向下偏移了20 起初以为是水果调整了sta ...
- 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装
我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...
- IOS开发之Bug--使用xib的自动布局和代码中修改遇到的bug
首先,在xib中约束了宽高22,但是需要代码动态重设,所以一开始如下设置,但是实际显示的仍然是22,而不是重设的值: 然后直接拿xib的将布局约束对象拖线重新通过代码重设约束值,虽然打印的结果宽高值是 ...
- nodejs 中自定义事件
经常看到 req.on('error', function(){...}); 这种代码. 在nodejs中,可以使用 EventEmitter来实现. 具体的关键词有如下几个: var reqEven ...
- ORA-27125: unable to create shared memory segment
平台环境 : Oracle Linux Server release 5.7 x86_64 数据库版本 : Oracle Database 10g Enterprise Edition Rel ...