通过实例来分析I2C基本通信协议

本文旨在用最通俗易懂的方式,让大家明白I2C通信的过程究竟是怎么回事。
I2C起源于飞利浦公司的电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C


总的来说,I2C可以简单归纳为,两根线,一个时钟线,一个数据线;一个总线上 ,一个主控 ,多个 从设备 。I2C的作用当然是用来传输数据,它的最大特点就是仅仅用了2根线,可以完成对总线上多个从设备的有序通信,这就依赖于其通信协议了。
主控相当于I2C的大脑,每一次读写操作都必须是主控发起的。这样就保证了多个从属设备间是无法直接通信的,这样就防止了仅有的2根线上数据传输发生混乱。

我们还是简单回顾一下《I2C 简介》中的 I2C 总线的几种信号状态

1. 空闲状态: SDA 和  SCL 都为高电平。

2. 开始条件(S)SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

3. 结束条件(P)SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

4. 数据有效:在 SCL 的高电平期间,SDA 保持稳定,数据有效。SDA 的改变只能发生在 SCL 的低电平期间。

5. ACK 信号:数据传输的过程中,接收器件每接收一个字节数据要产生一个 ACK 信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。


  • 空闲状态

当没有数据需要读写时,大家风平浪静,时钟和数据线都是出于高电平状态,但是当传输数据时,就必须有一个规则产生,那就是


  • 开始条件(S)
Start: 在clk为高的情况下,data由高变低为start。


  • 结束条件(P)
Stop:在clk为高的情况下,data由低变高是stop。
        

  • 数据有效
只有在 clk 为高的时候,数据才有效。 Clk 为低,数据无效。



  • ACK 信号
每一个字节完成,都会有一个 ack ,无论由 master 还是 slave 发出。ack位是低电平,表示有应答,如果是高电平,表示无应答。


  • 读写协议
读数据需要有offset。所以offset需要先用写协议告诉slave,然后再读。
所以一个完整的写协议就是: S 7_BIT_ADD W A OFFSET A RS 7_BIT_ADD R A DATA A P
ST: 起始位
SAD: 设备地址
SAK: 从设备应答位
MAK: 主控应答位
SUB: offset
DATA: 具体数据
SP: 结束位 



  • 实例分析

二进制串为 S 001111000 000010000 {RS} 001111010 110111101 P
翻译就是 3C 08 3D DE
另外可以看出, RS restart  start 波形很相似,而且 P 之前 slave 没有 ack ,就说明 slave 不准备再提供数据了,说明是 byte 读。
如果要读多 byte ,因为这个是 st sensor ,所以在 offset 位最高位写 1 就行了。这是 st private 规定。



数据位是S 001100000 001000000 001001110 P
翻译一下就是30 20 27,slave address 18 (30/2) offset 20, data 27.


从图中可以看出,第九位应答位为高,说明并没有master并没有收到应答
数据位是S 001111001 000000001(并不是完整的波形)
翻译一下slave address 1e(3c/2) offset 0 .....

本文简单分析了I2C的读写的具体过程,以及根据几个波形图的实例,分析了具体发送的数据,供大家参考!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值