Ⅰ. 工作原理:


I2C全称为Inter-Integrated Circuit(内部集成电路),是一种串行总线的外设接口,采用同步方式串行接收或发送数据,两个设备在同一个时钟下工作。
I2C总线只需要两根线:SDA-->串行数据线;SCL-->串行时钟线。
SDA线和SCL线都是双向 I/O线,接口电路为开漏输出,必须通过上拉电阻接到电源VCC,总线空闲时,两根线都是高电平。
这里阐明两个概念,解释为什么需要上拉电阻:

1.推挽输出结构是由两个MOS或者三极管互补输出组成,同一时刻,只有一个导通,另一个截止;推挽输出最大的优点是:可以真正的输出高电平和低电平,且在两种电平下都具有驱动能力。但一个缺点是:推挽输出不能实现“线与“。如果两个推挽输出结构相连在一起,比如A、B两个结构;A结构上面的MOS导通,下面的MOS截止;同时B结构上面的MOS截止,下面的MOS导通,那么电流会直接从VDD-->A结构上面的MOS-->B结构下面的MOS-->GND。整个通路电阻很小,会发生短路。

2.开漏输出最主要的特性是高电平没有驱动能力,需要借助外部上拉电阻接到高电平才能输出高电平。当MOS管截止,那么电流会从VDD-->MOS上拉电阻-->负载-->GND。这一特性可以实现”线与“功能。

3.线与即多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线才为高电平;只要任意一个或多个信号为低电平,则总线为低电平。

4.上拉电阻过大,驱动能力不足;上拉电阻过小,上拉过强,无法拉低。

IIC只有两根线(SCL和SDA),假设主设备A需要启动I2C, 他需要在SCL高电平时, 将SDA由高电平转换为低电平作为启动信号。主设备A在把SDA拉高后, 它需要再检查一下SDA的电平。
SDA是高电平, 说明主设备A可以占用总线, 然后主设备A将SDA拉低, 开始通信.
SDA是低电平, 说明已经有其他主设备将SDA拉低了, 由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平, 而是低电平. 说明其他主设备抢占总线的时间比它早, 主设备A只能放弃占用总线, 如果是高电平, 则可以占用。

Ⅱ.协议信号

起始信号:当 SCL 线是高电平时 ,SDA 线从高电平向低电平切换。 
停止信号:当 SCL 线是高电平时 ,SDA 线由低电平向高电平切换。
发送数据:8个数据位,先传最高位(MSB),然后释放SDA线(拉高电平)
SCL为低电平时(0),SDA可进行电平转换;
SCL为高电平时(1),SDA必须保持不变,接收设备(主设备或从设备)读取数据。
接收响应:ACK,在第九个周期(可以说是第九个数据位)
从机设备拉低SDA(0),这表示一个确认位(ACK),答复发送设备,接收完成;如果从机保持SDA为高电平(1),主机认为从机没有确认(NACK)本次数据传输,多字节数据传输过程就会被中止。

Ⅲ.传输内容和过程

1)内容:

地址帧(address frame):一旦主机产生一个起始信号,总线便不在空闲。主机接着发送包含7位从机地址和1位读写标志(R/W)共8个数据位。
数据帧(data frames):由master发往slave的数据(或由slave发往master),每一帧是8-bit的数据
2)过程:现在的I2C应用里,在起始信号后要发2~3个地址,第1个是设备地址,第2个是设备内的地址(比如寄存器地址、存储空间地址),如果设备内部地址是16位,则发第3个地址,与第2个地址组合起来拼16位地址,然后才是读写数据操作。

Ⅳ.I2C读写数据步骤

1:写数据:

1).发送一个起始信号。 
2).发送7bit从机地址,即接收设备地址。此处需要注意,发送数据时,无法发送7bit数据,此处需要发送bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。 (为从器件的的写地址-->Slaver_Addr | 0)
3).产生一个ACK应答信号,此应答信号为从机器件产生的应答。 
4).发送寄存器地址(想要写入的寄存器地址),8bit数据。 
5).产生一个ACK应答信号,此应答信号为从机器件产生的应答。 
6).发送一个数据,8bit数据。 
7).产生一个ACK应答信号,此应答信号为从机器件产生的应答信号。 
8).发送一个CRC校验码,此CRC校验值为2、4、6步数据产生的校验码。(可以不校验) 
9).既可以发送一个应答信号,也可以发送一个无应答信号,均由从机器件产生。 
10).发送一个停止信号。

2:读数据:

1).发送一个起始信号。 
2).发送7bit从机地址,即接收设备地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。 (为从器件的的写地址-->Slaver_Addr | 0)
3).产生一个ACK应答信号,此应答信号为从机器件产生的应答。 
4).发送寄存器地址(想要读取的寄存器地址)。 
5).产生一个ACK应答信号,此应答信号为从机器件产生的应答。 
6).再次发送一个起始信号。 
7).发送7bit从机地址,即接收设备地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。 (为从器件的的读地址-->Slaver_Addr | 1)
8).产生一个ACK应答信号,此应答信号为从机器件产生的应答。 
9).读取一个字节(8bit)的数据。 
10).产生一个ACK应答信号,此应答信号为CPU产生。 
11).读取一个CRC校验码。 (可以不校验) 
12).产生一个NACK信号。此无应答信号由CPU产生。 
13).产生一个停止信号。

Ⅴ. 附:

1).I2C读取数据时序图

2).I2C代码:见上传资源 赛元SC95F861X+日历芯片PCF8563_赛元-嵌入式文档类资源-CSDN下载

串行通信(一):I2C相关推荐

  1. 【IT】计算机体系结构

    https://edu.51cto.com/center/course/user/get-study-course 解释型语言,在计算机资源受限制的嵌入式计算机上(单片机等)效果不好,因此在嵌入式开发 ...

  2. IC卡、ID卡、M1卡、射频卡的区别是什么(射频卡是种通信技术)

    IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC卡.ID卡.M1卡.射频卡的区别是什么,下面我们一起来看看吧. 所谓的IC卡就是集成电路卡,是继磁卡之后出现的又一种 ...

  3. IC卡、ID卡、M1卡、射频卡的区别是什么【转】

    本文转载自:https://www.cnblogs.com/najifu-jason/p/4122741.html IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC ...

  4. 详解IC卡、ID卡、M1卡、射频卡四种智能卡的区别

    转载:http://www.elecfans.com/tongxin/rf/20181122819903.html IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC ...

  5. IC卡、ID卡、M1卡、射频卡的区别是什么

    IC卡.ID卡.M1卡.射频卡都是我们常见的一种智能卡,但是很多的顾客还是不清楚IC卡.ID卡.M1卡.射频卡的区别是什么,下面我们一起来看看吧. 所谓的IC卡就是集成电路卡,是继磁卡之后出现的又一种 ...

  6. Arduino UNO R3 (CH340G)基础篇-引脚

    目录 Arduino Uno R3 (CH340G)引脚分配图 Arduino Uno 板载指示灯 Arduino Uno引脚分配 - 电源 Arduino Uno引脚分配 - 数字引脚 数字电平 P ...

  7. arduino uno电压_Arduino UNO的简介

    步骤1:为什么使用ARDUINO UNO? arduino UNO是最常用的, UNO是第一款arduino的绝佳选择,因为它相对便宜且易于安装,并且是您可以使用的最困难的主板.在极少数情况下,即使您 ...

  8. 串行通信协议(I2C、SPI、UART、SCCB、CAN)

    推荐一部书,在这本书里面介绍了I2C.SPI.UART和CAN等通信协议,写的蛮不错的. 串行通信:设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输. 并行通信:设备与设备之间,通过多 ...

  9. i2c通信 msp430g2553_关于msp430G2553的I2C串行通信

    这是msp430g2xx3_uscib0_i2c_09例程,i2c从机接收数据的程序,请高手指点一下,为什么读取UCB0RXBUF是在发送中断中?接收机是在什么时候进入发送中断的? #include ...

最新文章

  1. Linux的内存分页管理
  2. quicklook不能预览office_万物皆可格!给空格键施加神奇魔法的神器软件—快速预览工具QuicklookPC软件...
  3. 【Android基础】点击Back键退出应用程序
  4. OCFS2+ASM 的RAC安装文档
  5. 容易被误读的IOSTAT
  6. Android高效加载大图、多图解决方案_LruCache,有效避免程序OOM
  7. sqlite导入后无法使用
  8. java计算并显示学生的成绩_Java开学测试-学生成绩管理系统
  9. 网络编程—网络基础概览、socket,TCP/UDP协议
  10. IBM 的大型机 z Systems 引入 Go 语言
  11. SpringBoot使用@ServerEndpoint无法依赖注入问题解决 SpringBoot webSocket配置
  12. 【C】输出乘法口诀表
  13. day10--Matplotlib--条形图与散点图
  14. layui时间选择30分钟为单位_layui 时间选择器实现季度选择器
  15. LintCode—链表倒数第n个节点(166)
  16. AutoCAD2022 安装说明
  17. Discuz论坛项目架构分析
  18. Unity ToLua 使用教程
  19. 小程序apkg还原_Macbook不为人知实用小技巧,学到就赚到!
  20. 老男孩教育老师的博客

热门文章

  1. 时间插件只能选择整点和半点_外贸人如何把控合适的客户开发时间及跟进频率...
  2. 相机模型与标定(一)--相机标定概述
  3. Android NDK开发之 opencv for android 问题总结
  4. php反序列化漏洞实验,PHP反序列化漏洞简介及相关技巧小结
  5. 新鲜出炉的canvas~
  6. SourceInsight初学使用笔记
  7. Windows核心编程_LOG软件
  8. Hbase 操作工具类
  9. 关于防止表单form重复提交的方式
  10. php语法------04 php内置函数之与页面表单请求相关的内置函数对象