协议类接口 - I2C
一、12c总线概述
I2C( Inter-Integrated Circuit,又称IIC)总线是一种串行总线,用 于连接微控制器及其外围设备,硬件图非常简单:一条串行数据线(SDA),一条串行时钟线(SCL )一根接地线(GND)。

它具有如下特点:
1)每个连接到总线的器件都可以使用软件根据它的惟一的地址来识别(具体地址需要查阅具体的I2C设备)。
2)传输数据的设备间是简单的主/从关系。主从式结构,通信双方必须一个为主(master)一个为从(slave),主设备掌握每次通信的主动权,从设备按照主设备的节奏被动响应。每个从设备在总线中有唯一的地址(slave address),主设备通过从地址找到自己要通信的从设备(本质是广播)。
3)主机可以用作主机发送器(主机指的是发送/停止数据传输、提供时钟信号的器件;发送器指发送数据到总线的器件)或主机接收器(主机指被主机寻址的器件;接收器指从总线接收数据的器件)。
4)它是一个真正的多主机总线(多主机指可以由多个主机试图去控制总线,但是不会破坏数据),两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破坏。
5)I2C主要用途就是主SoC和外围设备之间的通信,最大优势是可以在总线上扩展多个外围设备的支持。常见的各种物联网传感器芯片(如gsensor、温度、湿度、光强度、酸碱度、烟雾浓度、压力等)均使用I2C接口和主SoC进行连接。
下是一条I2C总线上多个设备相连的例子:

二、12c总结的信号类型
I2C总统在传送数据过程中共有3种类型信号:开始信号、结束信号和响应信号。
1)开始信号(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据(数据按二进制传输,先传最高位)当对方检测到后就知道要开始传输数据了。
2)结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
3)响应信号(ACK):主机把设备发给从机后怎么知道对方是否收到了呢?接收器在接收到8位数据后,在第9个时钟周期(这个时间刚接收到1位),拉低SDA电平,这时主机就能检测到相应引脚变化了。响应信号由主机来检测
开始信号和结束信号的波形图如下:

应答信号电平波形图如下:

SDA上传输的数据必须在SCL为高电平期间保持稳定,因为外接设备要在SCL为高电平期间内采集数据,才能知道数据是低电平还是高电平;SDA上的数据只能在SCL为低电平期间变化,如下图所示便为I2C总线的位传输波形。

三、I2C总线的数据传输格式
发送到SDA线上的每个字节必须是8位的,每次传输可以发送的字节数量不受限制。每个字节后必须跟个响应位。首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能继续接收或发送下个字节,从机可以拉低SCL迫使主机进入等待状态。当从机准备好接收下一个数据并释放SCL后,数据传输继续。如果主机在传输数据期间也需要完成一些其他功能(例如一个内部中断服务程序)也可以拉低SCL以占住总线。
启动一个传输时,主机先发出S信号,然后发出8位数据。这8位数据中前7位为从机的地址(由此可见最多可接128个设备,从机地址需要看具体I2C设备的数据手册),第8位表示传输的方向(0表示写操作,1表示读操作)。被选中的从机发出响应信号。紧接着传输一系列字节(不同的I2C设备格式是不同的,需要查具体数据手册)及其响应位(将SDA拉低)。最后,主机发出P信号结束本次传输。
下图是几种I2c总线上数据传输的格式:

并非每传输8位数据之后,都会有ACK信号,有以下3种例外。
1 )当从机不能响应从机地址时(例如它正忙于其他事而无法响应I2c总线的操作,或 这个地址没有对应的从机),在第9个SCL周期内SDA线没有被拉低,即没有ACK信号。 这时,主机发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
2)如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK信号。这样, 主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
3)主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。
四、I2C控制器
协议类接口 - I2C的更多相关文章
- 协议类接口 - UART
一.何为协议类接口? 双方约定信号的协议和满足时序要求. 二.UART如何传数据 通用异步收发器简称 UART,即“Universal Asynchronous Receiver Transmitte ...
- 协议类接口 - SPI
一.SPI概述 SPI(Serial Peripheral Interface,串行外设接口)总线系统是一种同步串行外设接口,它可以使CPU与各种外围设备以串行方式进行通信以交换信息.一般主控SoC ...
- 协议类接口 - NAND
一.引脚的含义 先看下nand flash是怎么接的,如下所示便为某一款nand存储芯片的引脚图.发现其连地址信号都没有.那么是如何访问地址数据的呢? 查阅该nand flash的数据手册可得其各个引 ...
- 协议类接口 - LCD
一.引脚含义 下图为某LCD相关引脚: 从引脚可以大概看出其SoC的连接情况: 1)VCLK为时钟,每一次像素就移动一次 2)HSYNC/VLINE 3)VSYNC/VFRAME 4)VD0 - VD ...
- 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份
业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...
- Python 基于urllib.request封装http协议类
基于urllib.request封装http协议类 by:授客QQ:1033553122 测试环境: Python版本:Python 3.3 代码实践 #!/usr/bin/env python ...
- 组件接口(API)设计指南[2]-类接口(class interface)
*返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 类接口(class interface) 你能够參考MGTi ...
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)
本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
随机推荐
- 吴恩达《Machine Learning Yearning》总结(11-20章)
11.何时修改开发集.测试集和度量指标 开展一个新项目,尽快选好开发集和测试集:例子,根据度量指标A分类器排在B分类器前面,但是团队认为B分类器在实际产品上优于A分类器,这时就需要考虑修改开发集和测试 ...
- JS的从理解对象到创建对象
JavaScript不是一门真正的面向对象语言,因为它连最基本的类的概念都没有,因此它的对象和基于类的语言中的对象也会有所不同.ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对 ...
- 净推荐值(NPS):用户忠诚度测量的基本原理及方法
文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益. 初识NPS 作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如 ...
- Javascript “等于”
JavaScript支持“=”.“==”和“===”运算符. 我们应当理解这些(赋值.相等.恒等)运算符之间的区别,并在编码过程中小心使用. == equality 等同,用于一般比较,在比较的时候可 ...
- Windows phone 8.1应用集成cortana语音命令
微软推出小娜已经有一段时间了,最近恰好在研究其用法,就随便写点记录一下自己的心得. 在研究时参考了@王博_Nick的博客:http://www.cnblogs.com/sonic1abc/p/3868 ...
- Excle 导入DataSet
using System.Data.OleDb;using System.Data; public void ReadExcelFiless() { //strin ...
- 【Linux】Linux入门及常见基本操作命令详解
本文基于 Red Hat Enterprise Linux 6 一.Linux 入门体验 1.1 root用户登陆 1.2 图形化与纯字符模式切换 init 5 - 图形模式 init 3 - 纯字符 ...
- css Media Query详解
Media Queries详解 Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码: 1 <link href="css/re ...
- SpringMVC方法接收参数可以为空、默认值设置
- python 02/100例
题目 输入某年某月某日,判断这一天是这一年的第几天? 分析 例如:2018年6月19日 天数 = 19天 + 一月天数 + 2月天数 + ... + 6月天数 注意 闰年的2月是29天,如果年份是闰年 ...