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

参考博客:

http://blog.csdn.net/oqqhutu12345678/article/details/65445338

http://www.cnblogs.com/biaohc/p/6271335.html

https://blog.csdn.net/Mr_Lyoko/article/details/79598106

https://blog.csdn.net/lingfeng5/article/details/73361833(推荐)

一、I2C介绍

1、物理接口:SCL+SDA

(1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

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

2、通信特征:串行、同步、电平、低速率

(1)串行通信。所有的数据以bit为单位在SDA线上串行传输(但每次传输8bit)。

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

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

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

3、突出特征

(1)主设备+从设备

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

(2)可以多个设备挂在一条总线上(从设备地址)

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

(3)SDA传输数据是大端传输,以字节为单位的,每次传输的有效数据都是1个字节(8位)。

4、应用领域

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

二、I2C时序

1、I2C通信时序的四个元素

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

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

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

分析:跳变有两个方向1->0和0->1,因为SDA总线空闲是1(由下图可知),且只有下拉操作,故1->0是开始信号,1->1是结束信号。

(2)数据bit传输(应答 / “0”、非应答 / “1”)

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

SDA传输完一个字节后,主机会释放SDA线(最后一位若是0,则取消下拉恢复为高电平1,或者最后一位本来就是1),这时SDA处于高电平的状态,从机就可以控制SDA线了。

若从机下拉了SDA线并且主机从SDA读到了这一个低电平,则表示从机发送了一个确认信号(0)

若从机不对SDA下拉,则主机读到SDA依然位高电平,故表示一个非应答信号(1)

2、I2C数据传输格式

(1)每一个通信周期的发起和结束都由主设备进行,从设备只有被动的响应主设备。

(2)在每个通信周期,主设备先发送8位的从设备地址

  • 其中7位是从设备地址,1位表示主设备接下来是要写数据到总线,还是从总线读取数据
  • 主设备以广播的形式发送,总线上的所有从设备都能收到这个信息;
  • 从设备收到地址后,与本身的设备地址对比。

(3)发送方发送一段数据后,接收方需要回应一个ACK

  • 这个响应只有1个bit位,只能表示2个意思,表示有无收到数据。

(4)在某个时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。

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

a、综述

(1)起始位及其后的8个clk中都是主设备在发送(主设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;

(2)然后到了第9周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动),同时从设备试图拉低总线发出ACK。

(3)如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高。这意味着主设备没有收到ACK,主设备就认为刚才给从设备发送的8字节不对。

b、细述

主设备首先会发送7bit位的slave device地址,和1bit位的rean或者write命令。(这里的读写,讲的是主机对总线的操作。比如写,主机写数据到总线,那么从机是读的;比如读,主机读总线的数据,那么从机是写的。)

(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步可以重复多次,即顺序读多个寄存器

s5pv210——I2C基础详解、I2C时序详解相关推荐

  1. [Python从零到壹] 八.数据库之MySQL和Sqlite基础知识及操作万字详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  3. 关于计算机应用基础问题,《计算机应用基础》习题及问题详解

    <计算机应用基础>习题及问题详解 (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档第一章 计算机基础知识填空题 ...

  4. get方法报空指针_C++基础教程之指针拷贝详解

    C++基础教程之指针拷贝详解 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此.特别是在C++中,如果不注意处理类中的指针,非常容易出问题.如果朋友们不相信可以看看下面的代码: ...

  5. 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解

    网络iso协议及语义语法时序详解 计算机学习 网络协议的三要素 在计算机网路中,通信发生在不同系统的实体之间,,实体(entity)是能够发送和接收信息的任何事物.然而,两个实体间仅发送比特流就指望能 ...

  6. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  7. Keras深度学习实战(1)——神经网络基础与模型训练过程详解

    Keras深度学习实战(1)--神经网络基础与模型训练过程详解 0. 前言 1. 神经网络基础 1.1 简单神经网络的架构 1.2 神经网络的训练 1.3 神经网络的应用 2. 从零开始构建前向传播 ...

  8. 纹理基础知识和过滤模式详解

    转载自 纹理基础知识和过滤模式详解 1. 为什么在纹理采样时候需要 texture filter (纹理过滤) 我们的纹理 要贴到三维图形表面,而三维图形上的pixel中心与纹理上的texel中心并不 ...

  9. 《Java基础——break与continue用法详解》

    Java基础--break与continue用法详解 一. break语句: 规则: 1. 仅用于循环语句和switch语句当中,用于跳出循环. 2. 当只有一层循环时,则直接跳出循环,不再进行下一轮 ...

  10. Python基础学习之 os 模块详解

    Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...

最新文章

  1. java文件放桌面怎么运行不了,不可能使用Java桌面在网络上启动文件吗?
  2. java 保留数字与中文_java 转中文数字
  3. delphi 停电文本数据丢失_概述DCS系统正确停电和上电的步骤
  4. java xml数据解析_java xml解析,数据读取
  5. 问题:未清空磁盘被添加到磁盘组触发坏块
  6. Kubernetes学习总结(14)—— Kubernetes 实用命令总结
  7. Centos7配置 SNMP服务(防火墙配置注意)
  8. STM32L476应用开发之二:模拟量数据采集
  9. 2011年工作安排_计算机技术与软件专业技术资格考试
  10. jQuery 1.3 API 参考文档中文版
  11. 【新手基础教程】 硬件加速的图像处理
  12. 服务器lsass占用内存_Lsass.exe进程占用大量内存
  13. 修改网页标题前面的logo
  14. 饥荒中的聊天表情(Emoticons In Don‘t Starve Together)
  15. 破竹课堂-老A的杠杆术
  16. 黑苹果鼠标不动_四款热门鼠标横评,好物种草,平价好鼠标
  17. springboot+vue网上书城书店销售商城系统
  18. PMP续证费用和流程
  19. matlab各个指令的含义,matlab的常用指令及其含义
  20. 机器视觉特点 机器视觉实际应用

热门文章

  1. 让360安全浏览器默认使用谷歌内核
  2. Mac - 设置NSButton 的背景色
  3. Socket网络编程--简单Web服务器(6)
  4. Linux下判断cpu物理个数,几核,是超线程还是多核心
  5. 浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程
  6. java基础面试题:说说和的区别
  7. grep 命令的 12 个实例
  8. EDM营销之如何使邮件列表更加有效
  9. EasyUI学习总结(二)——easyloader分析与使用
  10. 张左峰的歪理邪说 之 大话Redmine插件