GD32硬件I2C外设详解

简介

I2C总线是PHLIPS公司推出的一种双线式半双工串行总线,是具备多主机系统所需的总线裁决和高低速器件同步功能的高性能串行总线。用于连接微控器及外围设备。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度;

物理层

它只使用两条总线线路 :一条双向串行数据线(SDA),一条串行时钟线(SCL)。见下图。

GD32硬件I2C外设详解_第1张图片

每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。多主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。具有三种传输模式 :标准模式的传输速率为 100 Kbit/s ,快速模式为 400 Kbit/s ,高速模式下可达 3.4 Mbit/s,但目前大多12C设备尚不支持高速模式。片上的滤波器可以滤去总线数据线上的毛刺波以保证数据完整。连接到相同总线的 IC 数量受到总线的最大电容 400 pF 限制。

I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。基本上谁控制时钟线谁就是主设备,IIC的SCL必须由主机发送,否则大乱。从机收到(听到)自己的地址才能发送应答信号(必须应答)表示在线。

GD32硬件I2C外设详解_第2张图片

每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱, I2C总线要通过总线仲裁,以决定由哪一台主机控制总线。

协议层

I2C的协议包括起始和停止条件、数据有效性、响应、仲裁、时钟同步和地址广播等环节,使用 GD32集成的硬件I2C接口,并不需要用软件去模拟 SDA 和SCL 线的时序。

GD32硬件I2C外设详解_第3张图片

GD32硬件I2C外设详解_第4张图片

这两幅图表示的是主机和从机通信时 SDA 线的数据包序列。

  1. SCL线为高电平期间,SDA线由高变低表示起始信号;启动信号是一种电平跳变时序信号,而不是一个电平信号;其中 S 表示由主机的I2C接口产生的传输起始信号(S),这时连接到I2C总线上的所有从机都会接收到这个信号。
  2. 起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号(SLAVE_ADDRESS),在I2C总线上,每个设备的地址都是唯一的。当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据I2C协议,这个从机地址可以是 7 位或 10 位。
  3. 在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机。该位为 1 时,则相反。
  4. 从机接收到匹配的地址后,主机或从机会返回一个应答(A)或非应答信号,只有接收到应答信号后,主机才能继续发送或接收数据。2C总线上所有数据都是8位字节传送,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK),表示应答器接收到了该字节。
  5. 若配置的方向传输位为写数据,广播完地址,接收到应答信号后,主机开始正式向从机传输数据(DATA),数据包的大小为 8 位。主机每发送完一个数据,都要等待从机的应答信号(A),重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当数据传输结束时,主机向从机发送一个停止传输信号(P),表示不再传输数据。SCL线为高电平时,SDA线由低变高表示终止信号。停止信号也是一种电平跳变时序信号,而不是一个电平信号。I2C总线进行数据传输时,时钟信号位高电平期间,数据线上的数据必定保持稳定,只有时钟信号为低电平时,数据线上的电平才允许变化。
  6. 若配置的方向传输位为读数据,广播完地址,接收到应答信号后,从机开始向主机返回数据(DATA),数据包大小也为 8 位。从机每发送完一个数据,都会等待主机的应答信号(A),重复这个过程,可以返回 N 个数据,这个 N 也没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号,则从机自动停止数据传输。

GD32的I2C接口特性

  1. GD32的中等容量和大容量型号的芯片均有多达两个的I2C总线接口。
  2. 能够工作于多主模式或从模式,分别为主接收器、主发送器、从接收器及从发送器。
  3. 支持标准模式 100 Kbit/s 和快速模式 400 Kbit/s,不支持高速模式。
  4. 支持 7 位或 10 位寻址。前四位鉴定器件类别,一般是固定的;后三位可以编程,故同类器件一般最多挂2的3次方8个。
  5. 内置了硬件 CRC 发生器 / 校验器。
  6. I2 C 的接收和发送都可以使用 DMA 操作。
  7. 支持系统管理总线(SMBus)2.0 版。

 I2C 架构

I2C的所有硬件架构就是根据 SCL 线和 SDA 线展开的(其中 SMBALERT 线用于 SMBus)。

SCL 线的时序即为I2C 协议中的时钟信号,它由I2C 接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。而 SDA 线的信号则通过一系列数据控制架构,在将要发送的数据的基础上,根据协议添加各种起始信号、应答信号、地址信号,实现以 I 2 C 协议的方式发送出去。读取数据时则从 SDA 线上的信号中取出接收到的数据值。发送和接收的数据都被保存在数据寄存器(DR)上。

GD32硬件I2C外设详解_第5张图片

 I2C总线的数据传送

数据位的有效性规定

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

GD32硬件I2C外设详解_第6张图片

起始和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。开始信号为SDA线由高电平拉低,接着SCL线开始输出同步时钟信号;传输结束后SCL线停止同步时钟输出,接着SDA线也由低拉高,发出结束信号。

GD32硬件I2C外设详解_第7张图片

起始条件:SCL高电平期间,SDA从高电平切换到低电平

终止条件:SCL高电平期间,SDA从低电平切换到高电平

起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。每当发送器件传输完一个字节的数据后,后面必须紧跟一个校验位,这个校验位是接收端通过控制SDA(数据线)来实现的,以提醒发送端数据我这边已经接收完成,数据传送可以继续进行。

数据传送格式

字节传送与应答

每一个字节必须保证是8位长度。发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

GD32硬件I2C外设详解_第8张图片

发送应答与接收应答

发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。

如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。

当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。

总线的寻址

I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。

寻址字节的位定义

D7~D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。谁写数据谁控制sda总线。

GD32硬件I2C外设详解_第9张图片

主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。

从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。

仲裁

I2C是一个多主机总线协议,因此当多个主机同时申请总线的控制权时,则需要对其进行仲裁,以决定哪一个主机获得总线的控制权。

I2C的仲裁比较特别,跟DMA的仲裁不同,DMA的仲裁是通过检查优先级的方式来进行的,而I2C的仲裁是通过比较实际输出电平的方式进行的。

在每一位数据的发送期间,当SCL为高时,每个主机都检查SDA电平是否和自己发送的相同。理论上讲,如果两个主机所传输的内容完全相同,那么他们能够成功传输而不出现错误。如果一个主机发送高电平但检测到SDA电平为低,则认为自己仲裁失败并关闭自己的SDA输出驱动,而另一个主机则继续完成自己的传输。

响应:

数据地址的传输都需带响应,响应包括应答和非应答。无论是主机还是从机,接收到地址和数据后,希望对方继续发送就回复应答,不希望对方发送了回复不应答,接收方回复不应答后主机发送停止信号。发送方每传输完一个字节后释放sda的控制权交给接收方,也就是传输数据时每9个时钟的时候接收方会控制sda,这时候sda为高表示非应答,为低表示应答。

主机在向总线发送开始信号并成功获得总线控制权后,将会向总线发送对应从机的地址,这个地址所有的从机都会接收,然后从机将收到的地址与自己的地址比较,若地址一致则该从机将会向总线发送ACK信号,也就是确认应答,表示可以开始通信;而其他的从机将会忽略总线上的信号,直到下一个开始信号来临。

主机与从机每传输一组数据,从机接收后都必须发送ACK信号,表示接收成功。

数据帧格式

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

在总线的一次数据传送过程中,可以有以下几种组合方式:

1.主机向从机发送数据,数据传送方向在整个过程中不变;

2.主机在第一个字节后,立即从从机读数据。

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

主机发送数据流程

  1. 使能I2C外设时钟,配置时钟相关寄存器来确保正确的I2C时序;
  2. 软件将START位置1,在I2C总线上产生一个START起始位,SBSEND置1,进入主机模式;
  3. 写一个7位地址位或带有地址头的10位地址位到数据寄存器,SBSEND置0,若是10位地址,那么先写入高地址ADD10SEND置1,发送后再写入低地址ADD10SEND置0;
  4. I2C开始发送地址或者地址头到总线上,ADDSEND置1,软件将ADDSEND置0;
  5. I2C进入数据发送状态,软件写第一个字节数据到数据寄存器,此时,写入数据寄存器的字节被立即移入内部移位寄存器,TBE置1;

6.移位寄存器非空,I2C开始发送数据到总线;

7.在第一个字节的发送过程中,软件可以写第二个字节到数据寄存器,TBE置0;

8.任何时候TBE被置1,软件都可以向数据寄存器写入一个字节,只要还有数据待发送。

9.在倒数第二个字节发送过程中,软件写入最后一个字节数据到数据寄存器来清除TBE标志位;

10.最后一个字节发送结束后,I2C主机将BTC位置1,因为移位寄存器和数据寄存器此时都为空;

1.软件将STOP位置1来发送一个STOP结束位,此后TBE和BTC状态位都将被置0。

scl时钟周期

scl的时钟和时钟控制寄存器ccr的值有关。

  • 有普通模式和快速模式,对应100k和400k
  • 快速模式下scl的占空比可选,低/高=2和低/高=16/9两种可选。
  • 计算公式

GD32硬件I2C外设详解_第10张图片

例如:PCLK1=36MHz,配置400Kbit的速率,计算方法如下:

PCLK时钟周期 TPCLK1 = 1/36000000

目标SCL时钟周期 TSCL = 1/400000

低/高=2模式下 :

SCL时钟周期内的高电平时间 THIGH = TSCL/3

SCL时钟周期内的低电平时间 TLow = 2*TSCL/3

计算CCR的值 CCR =  THIGH/TPCLK1 = 30

主机发送方

简要流程:

  1. 使能I2C外设时钟,配置时钟相关寄存器来确保正确的I2C时序;
  2. 软件将START位置1,在I2C总线上产生一个START起始位,SBSEND置1,进入主机模式;
  3. 写一个7位地址位或带有地址头的10位地址位到数据寄存器,SBSEND置0,若是10位地址,那么先写入高地址ADD10SEND置1,发送后再写入低地址ADD10SEND置0;
  4. I2C开始发送地址或者地址头到总线上,ADDSEND置1,软件将ADDSEND置0;
  5. I2C进入数据发送状态,软件写第一个字节数据到数据寄存器,此时,写入数据寄存器的字节被立即移入内部移位寄存器,TBE置1;
  6. 移位寄存器非空,I2C开始发送数据到总线;
  7. 在第一个字节的发送过程中,软件可以写第二个字节到数据寄存器,TBE置0;
  8. 任何时候TBE被置1,软件都可以向数据寄存器写入一个字节,只要还有数据待发送。
  9. 在倒数第二个字节发送过程中,软件写入最后一个字节数据到数据寄存器来清除TBE标志位;
  10. 最后一个字节发送结束后,I2C主机将BTC位置1,因为移位寄存器和数据寄存器此时都为空;
  11. 软件将STOP位置1来发送一个STOP结束位,此后TBE和BTC状态位都将被置0。
说明:
SBSEND全称Start Bit Send,“起始位发送”标志位。
ADDSEND全称Address Send,“地址发送”标志位,同样ADD10SEND就是“10位地址发送”标志位
TBE全称Transfer Buffer Empty,“发送缓冲区空”标志位。
BTC全称Byte Transfer Complete,“字节传输完成”标志位。

GD32硬件I2C外设详解_第11张图片

你可能感兴趣的:(嵌入式开发,单片机,嵌入式硬件)