ESP32 I2C学习笔记

I2C总线通信过程

1. 主机发送一个起始信号启用总线
2. 主机发送一个字节数据,表示从机地址和数据发送方向(字节中前七位确定从机地址。最后一位确定发送器和接收器,0表示主机为发送器,从机为接收器;1表示从机为发送器,主机位接收器)
3. 被寻址的从机发送一个应答信号,建立通讯
4. 发送器发送一个字节数据(在这里不确定数据发送方向,所以用发送器接收器表示)
5. 接收器发送应答信号回应发送器

起始信号和停止信号

这里就要涉及到时序图的问题,I2C一共有两根通讯线,一根是SCL时钟线,一根是SDA数据线,当主机和从机处于空闲状态时,SCL和SDA都处于高电平,只有当SDA从高电平转变到低电平,且SCL为高电平时,就会触发起始信号;当SDA从低电平转变到高电平,且SCL为高电平时,就会触发停止信号,再次转变到空闲状态;

起始信号:

起始信号

停止信号

在这里插入图片描述

字节传送与应答

在字节传送与应答的过程中,因为发送器是需要一次性传输一个字节,就是八位,才会有一个应答信号,这一个过程叫一帧,即一帧共有九位;发送器发送完一个字节后,接收器也可以选择应答或不应答,是可选的,在SDA也可以用0和1表示,0代表应答1代表不应答
时序图:
在这里插入图片描述

同步信号

  • 具有同步信号,是I2C对比UART最大的优点之一,我们知道UART在进行通讯时是异步的,在识别1100和10这种电平变化的时序图是靠波特率的,假如波特率等于1,那么UART在每秒就识别一个电平,这样依靠时间就可以分别1100和10的区别,但这里有一个最大的漏洞,就是UART是两个不同的硬件进行通讯,那么就有可能出现时间误差,而且会无限堆积,只要误差达到了一位的大小,那么就会导致一位错,位位错,所以这也是为什么UART只能一次传输八位的原因,主要是为了消除堆积的时间误差;
  • 而I2C在进行通信时,两个硬件用的是同一个SCL和SDA,就不存在会出现时间的误差,能做到不存在时间误差的原理是:
    在SCL为低电平时,SDA的电平可以任意改变,也就是在发送数据的阶段,当SCL为高电平时,SDA就不允许改变了,这时SCL就会接收SDA在发生改变时的电平,从而读取到数据:
    在这里插入图片描述
    当SCL和SDA处于状态1时,SDA的电平就在发生任意改变,假设为0,那么等到状态2时,SDA就不允许再发送改变,SCL就读取SDA上次发生改变的电平,即为0,只要一直循环这个步骤,就可以读完一个字节,然后SDA再选择是否要应答,即为一个字节传输完毕,这样就可以持续的发送数据而且不会有时间误差。

经典I2C时序

在这里插入图片描述
在这里插入图片描述
一共分三种:
:主机给从机发送信号;
:从机给主机发送信号;
:主机先给从机发送一段时间,再转变为从机给主机发送信号(不能在同一组I2C中完成,因为在一组I2C中只要确定了谁是发送器和接收器,就不能再发生改变)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值