IIC总线解析

IIC即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、高性能同步串行总线。具备多主机+多从机总线组网功能。

基本概念

IIC总线只有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,IIC总线支持所有IIC工艺的制造的器件,所有连接IIC总线上的设备的串行数据都可以接到SDA数据线上。这些设备有存储器、LCD驱动器、AD转换器、DA转换器,也可以是计算机IIC总线通过上拉电阻(一般为4.7KΩ)接正电源,当总线空闲时,两根线均为高电平。

简单的说,IIC总线是一种半双工同步通信总线,其带有数据应答,支持总线挂载多设备(一主多从、多主多从)。在进行硬件连接时,所有I2C设备的SCL连在一起,SDA连在一起。SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右。软件配置时,设备的SCL和SDA均要配置成开漏输出模式。由下图可以清晰的看出其硬件连接方式:
在这里插入图片描述

IIC总线通信规则

起始位和终止位规定

起始位:时钟线SCL为高电平期间,数据线SDA由高电平向低电平变化,即出现一个下降沿。
终止位:时钟线SCL为高电平期间,数据线SDA由低电平向高电平变化,即出现一个上升沿。
在这里插入图片描述
如图,左边为起始位,右边为终止位。

数据传输基本单元

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
在这里插入图片描述

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
在这里插入图片描述
“发送一个字节”和“接收一个字节”中的“发送”和“接收”是对于主机而言的,发送是主机将数据发送给从机,所以SCL低电平时应是主机将数据位放在SDA线上,SCL高电平时从机读取数据位。
接收则是相反的,在接收数据时应是主机读取数据位,所以这时发送数据的就是从机,将发送一个字节时的对象反过来即是接收一个数据时的时序,即SCL低电平时从机将数据放在SDA线上,SCL高电平时主机读取数据位。

应答位

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
在这里插入图片描述
注:“发送应答”和“接收应答”中的“发送”和“接收”也是对于主机而言的。
释放SDA指的的将SDA线置回高电平

数据位有效性规定

IIC总线在进行数据传输时,时钟线SCL上的时钟信号为高电平期间,数据线SDA上的数据必须保持稳定,只有在SCL线时钟为低电平时,SDA线数据允许变化。

由发送一个字节和接收一个字节的时序我们可以看出,时钟线SCL低电平时,是由主机或从机将数据位放到SDA线上,SCL低电平时是从机或主机读取数据的时间,在读取数据时为保证数据的有效性,所以需要SDA数据保持稳定。

数据帧格式

利用IIC总线传输数据的字节数(帧数)是没有限制的。但每一个字节必须保证是8位长度,传送数据时,先送最高位MSB,即高位先行。每一个被传送的字节后面必须跟随一个应答位。

IIC总线数据传输时序

指定地址写

主机发出启动后,先发送第一个8位数据,该8位数据又7位从机地址+1位读写位(0表示写,1表示读)组成,从机应答后,主机发出8位数据1,数据1可以是从机的寄存器地址,也可以是从机的指令信号,从机应答,主机发出8位数据,从机应答,主机终止传输。
下图表示指定地址写的时序,绿色背景是主机发出的数据,白色背景是从机发送的数据。
在这里插入图片描述
实例如下:
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
在这里插入图片描述
上面一段时序表示,主机向编号为0XD0的从机写内容,写入的位置为0X19寄存器,写入的内容为0XAA。

当前地址读

主机发出启动,先发送第一个8位数据,该8位数据又7位从机地址+1位读写位(0表示写,1表示读)组成,从机应答后,从机发出数据,主机不应答,主机终止传输。
下图表示当前地址读的时序,绿色背景是主机发出的数据,白色背景是从机发送的数据。
在这里插入图片描述
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
在这里插入图片描述
上面一段时序表示,主机向编号为0XD1的从机写读内容,读取到的内容为0X0F。

指定地址读

指定地址读时序就是将指定地址写和当前的地址读的时序相结合得到的,在指定地址写时序中,当主机向从机发送数据1时,就是指定了地址,然后重新发出启动信号,主机向从机发送当前地址读的时序,这时读取到的数据就是数据1指定的地址数据。
下图表示指定地址读的时序,绿色背景是主机发出的数据,白色背景是从机发送的数据。
在这里插入图片描述
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
在这里插入图片描述
上面一段时序表示,主机向编号为0XD0的从机读内容,读取数据的位置为0X19寄存器,读出的内容为0XAA。

STM32 的IIC

硬件结构

STM32内部集成了硬件IIC收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担。
在这里插入图片描述
上图为STM32 IIC功能框图,硬件IIC外部引脚有SDA和SCL,SCL提供时钟信号,SDA负责接收和发送信号。
SDA输入和输出重要的两个寄存器为数据寄存器和数据移位寄存器,与USART结构类似,发送数据时,数据寄存器中的数据先传输到数据移位寄存器中,数据移位寄存器将数据一位一位通过SDA口送出,当前一个字节的数据传输完成后,数据寄存器中的新数据才会被送到数据移位寄存器。接收数据时,SDA口接收进来的数据将数据移位寄存器填满后会被送到数据寄存器。
由上图可以看出,发送数据时,数据移位寄存器中数据左移将最左端的数据送出;接收数据时,接收到的数据是从右端送入,然后不断左移填满一个字节。这也说明了IIC通信是高位先行。

硬件发送时序

STM32的IIC外设支持7位/10位地址模式,我们主要关注7位地址模式即可。STM32主发送器传送序列图如下:
在这里插入图片描述
首先STM32的IIC外设发出起始信号,此时产生EV5事件,SB=1表示起始条件已发送, 软件读取SR1寄存器后,写数据寄存器的操作将清除该位,所以不需要手动清除该位。
系统检测到起始条件发送后会将从机地址数据送到数据寄存器DR中,之后硬件会自动将该数据送到数据移位寄存器中并将其发送出去。发送完成后检测应答位,如无应答则进行响应中断操作(前提是中断要配置),有应答则发送时序继续进行。
下一步就到了EV6事件,ADDR=1在主模式下表示地址发送结束,EV6事件结束后接着就是EV8_1事件,移位寄存器空,数据寄存器空,将数据写入到数据寄存器DR。
之后为EV8事件,移位寄存器非空,数据寄存器空,此时表示数据寄存器中的数据已经被送到数据移位寄存器中,数据移位寄存器正在向外发送数据1,清空该事件。发送完成后接收应答。若仍是EV8事件即移位寄存器空数据寄存器空则继续发送下一个数据。
若是EV8_2事件表示系统请求设置停止位,主机发出终止信号,传输结束。

硬件接收时序

STM32的IIC主接收器传送序列图如下
在这里插入图片描述
接收时序前一部分和发送时序相同。首先STM32的IIC外设发出起始信号,此时产生EV5事件,SB=1表示起始条件已发送,系统检测到起始条件发送后会将从机地址数据送到数据寄存器DR中,之后硬件会自动将该数据送到数据移位寄存器中并将其发送出去,主机接收应答,之后EV6事件,ADDR=1在主模式下表示地址发送结束。
EV6_1事件,没有对应的事件标志,只适于接收1个字节的情况。恰好在EV6之后(即清除了ADDR之后),要清除响应和停止条件的产生位。发生EV6_1事件时表示数据移位寄存器正在接收数据。数据接收完成后主机发出应答。
EV7事件,读取数据寄存器DR,此时数据移位寄存器中的数据已经被送到数据寄存器中了,EV7事件发生时正在读取该数据,读取完成后清除该事件并发出应答。若下一个事件仍是EV7事件则表示接收下一个数据,若是EV7_1事件RxNE=1数据寄存器非空,读取数据寄存器中的数据读取完成后清除该事件,然后设置无应答和发出终止请求。最后系统发出终止信号。接收完成。

总结

STM32的硬件IIC的发送和接收时序和软件IIC中的发送和接收数据时序是完全相同的,只不过硬件IIC设置了许多的标志位,通过这些标志位的改变来自动实现时序的推进。

IIC总线是由数据线SDA和时钟线SCL构成的同步串行半双工总线,每一位数据都要由一个时钟脉冲进行对应,当时钟周期为低电平时,数据是不能被传输的。IIC总线空闲时,数据线SDA和时钟线SCL都为高电平,只有总线空闲时,主机才能使用IIC总线收发数据。数据传输期间,时钟SCL为高电平则SDA必须保持稳定,只有在SCL为低电平时才允许SDA变化。

SCL高电平期间,SDA通过下降沿和上升沿来表示启动和停止,启动和停止信号都由主机产生。
由于IIC时序较为简单和灵活,所以也可以用软件来模拟IIC,只需要设置相对应的引脚电平和IIC的各种时序相同即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tao'note

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值