I2C协议理解

I2C协议理解

I2C总线(Inter-Integrated Circuit)

一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

I2C总线连接图

请添加图片描述

I2C硬件结构

  1. I2C总线通过上拉电阻接正电源.
  2. 当总线空闲时,两根线均为高电平,连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

I2C总线的构成

  1. 只有两根双向信号线
  2. 一根是数据线(SDA):串行数据线,传输通信数据
  3. 一根是时钟线(SCL):串行时钟线,传输CLK信号,一般是主设备向从设备提供
    请添加图片描述

主设备与从设备

  1. 主端主要用来驱动SCL line、 从设备对主设备产生响应;
  2. 二者都可以传输数据,但是从设备不能发起传输,且传输是受到主设备控制的。

I2C总线的作用

  1. 可发送和接收数据
  2. 各种被控制电路均并联在这条总线上,每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。

I2C总线协议

  1. I2C总线在传送数据过程中共有三种类型信号,它们分别是:起始信号、终止信号和应答信号。(这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。)
  2. 起始信号(S):当SCL为高电平期间,SDA由高到低的跳变
  3. 终止信号§:当SCL为高电平期间,SDA由低到高的跳变
  4. 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
  5. 任何时候时钟信号都是由主控器件产生。
    请添加图片描述

数据的有效性

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定;时钟信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
请添加图片描述

数据传输格式与应答

I2C数据以字节(即8bits)为单位传输,每个字节传输完后都会有一个ACK应答信号。

应答信号

  • 应答信号的时钟是由主设备产生的
  • 主机写从机时,每写完一个字节,如果正确,从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。
  • 主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出认可信号,告诉从机所发数据已经收妥
  • 字节传送与应答每一个字节必须保证8位长度,数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位ACK(即一帧共有9位)
    请添加图片描述

数据传送组合方式

当SDA从1变动到0,而SCL还是1时,表示开始数据传输,接下来的7位,就是设备的地址,紧接着的是读写标志,其为1时是读取,为0则是写
注:阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送. A表示应答,A表示非应答(高电平)

  • List item

写操作:主机向从机发送数据,数据传送方向在整个传送过程中不变
请添加图片描述
读操作:主机在第一个字节后,立即由从机读数据
请添加图片描述

  1. 在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生 一次,但两次读/写方向位正好相反
  2. 在传输期间,如果从设备来不及处理主设备发送的数据,从设备会保持SCL线为低电平,强迫主设备等待从设备释放SCL线,直到从设备处理完后,释放SCL线,接着进行数据传输

总线的寻址

寻址字节的位定义请添加图片描述

  1. D7~D1位组成从机的地址。
  2. D0位是数据传送方向位,为“0”时表示主机向从机写数据为“1”时表示主机由从机读数据
  3. I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
  4. 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。

I2C的读写流程

写寄存器的标准流程

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

读寄存器的标准流程

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发起START
7.Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
8.Slave发送ACK
9.Slave发送data(8bit),即寄存器里的值
10.Master发送ACK
11.第9步和第10步可以重复多次,即顺序读多个寄存器
12.Master发起STOP

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值