你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-I2C-EEPROM 实验②-I2C介绍-I2C协议层

[复制链接]
STMCU小助手 发布时间:2022-6-26 23:56
I2C 协议层
    I2C 的协议定义了通信的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。下面我们就来简单介绍下。
(1)数据有效性规定
    I2C 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。如下图:

微信图片_20220626235552.png

    每次数据传输都以字节为单位,每次传输的字节数不受限制。
(2)起始和停止信号
    SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。如下图:

微信图片_20220626235546.png

    起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
(3)应答响应
    每当发送器件传输完一个字节的数据后,后面必须紧跟一个校验位,这个校验位是接收端通过控制 SDA(数据线)来实现的,以提醒发送端数据我这边已经接收完成,数据传送可以继续进行。这个校验位其实就是数据或地址传输过程中的响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号即特定的低电平脉冲,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号即特定的高电平脉冲,发送方接收到该信号后会产生一个停止信号,结束信号传输。应答响应时序图如下:

微信图片_20220626235542.png

    每一个字节必须保证是 8 位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。
    由于某种原因从机不对主机寻址信号应答时 (如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。
    如果从机对主机进行了应答, 但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。
    当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。
    这些信号中,起始信号是必需的,结束信号和应答信号都可以不要。
(4)总线的寻址方式
    I2C 总线寻址按照从机地址位数可分为两种,一种是 7 位,另一种是10 位。采用 7位的寻址字节(寻址字节是起始信号后的第一个字节)的位定义如下:

微信图片_20220626235535.png

    D7~D1 位组成从机的地址。D0 位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。
    10位寻址和 7 位寻址兼容,而且可以结合使用。10 位寻址不会影响已有的7 位寻址,有 7 位和 10 位地址的器件可以连接到相同的 I2C 总线。我们就以7位寻址为例进行介绍。
    当主机发送了一个地址后,总线上的每个器件都将头 7 位与它自己的地址
比较,如果一样,器件会判定它被主机寻址,其他地址不同的器件将被忽略后面的数据信号。至于是从机接收器还是从机发送器,都由 R/W 位决定的。
    从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的 7 位寻址位有4位是固定位,3 位是可编程位,这时仅能寻址8 个同样的器件,即可以有 8 个同样的器件接入到该 I2C 总线系统中。
(5)数据传输
    I2C 总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传送一个从机的地址(7 位),第 8 位是数据的传送方向位(R/W),用“0”表示主机发送(写)数据(W),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
    在总线的一次数据传送过程中,可以有以下几种组合方式:
a、主机向从机发送数据,数据传送方向在整个传送过程中不变

微信图片_20220626235531.png

    注意:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A 表示应答,A 非表示非应答(高电平)。S 表示起始信号,P表示终止信号。
b、主机在第一个字节后,立即从从机读数据

微信图片_20220626235520.png

c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复
产生一次,但两次读/写方向位正好反相

微信图片_20220626235514.png

    到这里我们就介绍完了I2C总线, 现如今大部分的MCU都自带I2C总线接口,STM32F1 芯片也不例外,STM32F1 芯片自带 2 个 I2C 接口,I2C1 和 I2C2,但是本章实验我们不使用 STM32F1自带的硬件 I2C,而采用软件模拟 I2C。主要原因是STM32F1 的硬件 IIC 设计的比较复杂, 而且稳定性不怎么好, 程序移植比较麻烦,而用软件模拟 IIC,最大的好处就是移植方便,同一个代码兼容所有单片机,任何一个单片机只要有 IO 口(不需要特定 IO),都可以很快的移植过去。有兴趣的朋友,可以结合 STM32F1中文参考手册学习下硬件 I2C。

收藏 评论0 发布时间:2022-6-26 23:56

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版