协议类接口 - 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 实体框架的一些基础知识,以及构建 ...
随机推荐
- Ajax的XMLHttpRequest对象
编写一个例子:从服务器取回一个Hello Ajax字符串. HTML: <input type="button" value="ajax提交" oncli ...
- webview中播放视屏,返回或者退出后,仍然会有声音。
解决办法: protected void onPause() { super.onPause(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODE ...
- (五)html部分标签元素补充
html标签元素十分的多,一次性掌握全部,那是不可能的,在后续的学习中,会不断补充标签元素... 1.行元素和块元素 行标签元素即是标签元素根据内容大小进行自适应,而不是占据一整行. 如<spa ...
- oracle学习篇一:sqlplus常用命令
1.程序运行--> cmd --> sqlplus 登陆普通用户:scott/brant;普通管理员用户登陆:system/brant;高级管理员用户登陆:1>先切换其他用户:SQL ...
- 从零开始的全栈工程师——JS面向对象( 原型 this 继承)
一.生成对象的方式 ①单例模式(字面量定义)var obj = {} ②类的实例 var obj = new Object( ) ③工厂模式 ④构造函数:扮演三种角色 普通函数 普通对象 类 工厂模式 ...
- 小程序 - 图片列表显示lazyload效果
在做一个短视频平台,涉及到的都是一些列表模块.因为小程序没有提供lazyload api,所以只能自己写一个了... 开发涉及 <scroll-view></scroll-view& ...
- twaver拓扑图通道组织图(百分比使用率/水槽)效果实现
功能介绍: 利用拓扑图实现:64条通道,根据每条通道是否承载业务,提供百分比展示 首先上图,功能效果如图: 废话不多,直接上代码: <!DOCTYPE html> <html> ...
- css 简单梯形
通过css2D变形我们可以轻松得到平行四边形,那么通过此技巧可以得到梯形吗? no! 不过我们可以通过3D旋转得到类似这样的效果: transform:perspective(0.5em) rota ...
- Xshell连接不上虚拟机的问题和解决办法
第一次用xshell,一直连不上linux,搞了好久,也查了很多办法,但是最后也终于解决了,在这里我分享一下自己的解决办法,再列举网上的办法,希望可以帮助其他人. 1,你的linux ip地址没有配置 ...
- maven学习(一)setting.xml配置文件详解
maven环境搭建: 1.官网下载zip包,解压至任意目录(如:E:\wly\apache-maven-3.2.5) 2.环境变量MAVEN_HOME(E:\wly\apache-maven-3.2. ...