当前位置:   article > 正文

ESP32S3学习Vol1:I2C协议与使用_esp32s3 i2c

esp32s3 i2c

一、背景与原理介绍

I2C本来的写法应该是  I^{2}C  ,一般口语称作:I方C。这么称呼是因为它的全称:Inter-Intergrated Circuit。它是一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大传输距离短的场合下的主从通信。主机启动总线,并产生时钟用于传送数据,此时任何接收数据的器件均被认为是从机

IIC使用两根信号线通信,SCL和SDA,即时钟线和数据线。IIC将SCL处于高电平时SDA拉低的动作作为开始信号SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

以上可以理解到,时钟的高电平才会让SDA的动作有意义。

二、物理层的特点

  • 一条总线上可以连接多个IIC通讯设备,支持多个通信主机及多个通信从机。
  • 一个 I2C 总线只使用两条总线线路,一条双向串行数据线 (SDA),一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
  • 不同于SPI使用SS来选择设备,IIC协议中每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
  • 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  • 三种传输模式:标准模式为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多I2C 设备尚不支持高速模式。
  • 连接到相同总线的IC 数量受到总线的最大电容400pF 限制。

三、协议层机制

主机从机开始通信之前,两条线因为上拉电阻的缘故呈高电平,此时IIC空闲。开始数据传输的标志是:SCL高电平期间将SDA拉低,这将会产生一个开始信号。从机接收到这个开始信号后,就开始准备接收数据,SCL高电平期间将SDA拉高,这将会产生停止信号,就可以停止数据传输。不论哪种情况,必须是SDA的电平发生转换才可以,而不是保持某个电平状态。时序图如图所示:

在数据进入从机之前,开始信号已经发出,需要在开始信号发出后,在SCL的第一个低电平进行SDA的数据变更,之后将SDA拉高,这整个过程需要处于SCL的下一个高电平来到之前。之后下一个低电平到来,先拉低SDA并再次更改数据,再拉高,加粗字段都必须在下一个高电平到来之前。每次可以传输一位数据。

第 8 个时钟周期的SCL从高电平向低电平切换时,主机将会释放SDA 以使从机应答,在第 9 个时钟周期,从机需要将 SDA 拉低以完成应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。我们要注意的是数据以 8 bit 即一个字节为单位串行发出,其最先发送的是字节的最高位

总结:传输数据、更改数据各自高低电平不同,但都需要保持;开始信号和停止信号需要在SCL高电平期间让SDA发生电平转换而不是保持高电平或低电平。

IIC空闲时、SCL高电平、SDA从高到低:开始信号

IIC应答后、SCL高电平、SDA从低到高:停止信号

SCL低电平、SDA切换:更改高低电平来切换这个位是0还是1

SCL高电平、SDA保持:传输数据

每8个时钟周期结束后、SDA保持低电平:从机应答

器件地址(也称从机地址,SLAVE ADDRESS):每个I2C 器件都有一个器件地址,有些 I2C 器件的器件地址是固定的,而有些 I2C 器件的器件地址由一个固定部分和一个可编程的部分构成。当主机想给某个器件发送数据时,只需向总线上发送接收器件的器件地址即可。 进行数据传输时,主机首先向总线上发出开始信号,对应开始位S,然后按照从高到低的位序发送器件地址,一般为 7bit,第 8bit 位为读写控制位R/W,该位为 0 时表示主机对从机进行写操作,当该位为1 时表示主机对从机进行读操作,然后接收从机响应。对于AT24C64 来说,其传输器件地址格式如下图所示。

发送完第一个字节(7 位器件地址和一位读写控制位)并收到从机正确的应答后就开始发送字地址(Word Address)。一般而言,每个兼容 I2C 协议的器件,内部总会有可供读写的寄存器或存储器,要在写入数据前先写入要写入的寄存器地址,然后再进行数据传输。

主机发送完字地址,从机正确应答后就把内部的存储单元地址指针指向该单元。如果读写控制位 R/W位为“0”即写命令,从机就处于接收数据的状态,此时,主机就开始写数据了。写数据分为单次写(对于EEPROM 而言,称为字节写)和连续写(对于 EEPROM 而言,称为页写),两者的区别在于发送完一字节数据后,是发送结束信号还是继续发送下一字节数据,如果发送的是结束信号,就称为单次写,如果继续发送下一字节数据,就称为连续写。 

如果读写控制位R/W 位为“1”即读命令,主机就处于接收数据的状态,从机从该地址单元输出数据。读数据有三种方式:当前地址读、随机读和连续读。当前地址读是指在一次读或写操作后发起读操作。由于 I2C 器件在读写操作后,其内部的地址指针自动加一因此当前地址读可以读取下一个字地址的数据。也就是说上次读或写操作的单元地址为 02 时,当前地址读的内容就是地址03 处的单元数据。

由于当前地址读极不方便读取任意的地址单元的数据,所以就有了随机读。发送完器件地址和字地址后,竟然又发送起始信号和器件地址,而且第一次发送器件地址时后面的读写控制位为“0”,也就是写命令,第二次发送器件地址时后面的读写控制位为“1”,也就是读。为什么会有这样奇怪的操作呢?这是因为我们需要使从机内的存储单元地址指针指向我们想要读取的存储单元地址处,所以首先发送了一次Dummy Write 也就是虚写操作,之所以称为虚写,是因为我们并不是真的要写数据,而是通过这种虚写操作使地址指针指向虚写操作中字地址的位置,等从机应答后,就可以以当前地址读的方式读数据了,如图 所示,随机地址读是没有发送数据的单次写操作和当前地址读操作的结合体。 

连续读,对应的是当前地址读和随机读都是一次读取一个字节而言的,它是将当前地址读或随机读的主机非应答改成应答,表示继续读取数据。

 图片皆源自参考文章。

参考文章:基础通信协议之 IIC详细讲解 - 知乎 (zhihu.com)

本人博客内容仅供交流学习用,如涉侵权联系本人侵删。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/734118
推荐阅读
相关标签
  

闽ICP备14008679号