【F28335】串行通信I2C

顾老师的课本上,后边章节讲eCAN总线,还有一章讲如何将程序烧写到Flash中,暂时不做整理。
本篇文章对《手把手教你学DSP——基于TMS320F28335》书中关于I2C的部分进行整理,书中知识点比较杂乱,简单过一遍,对I2C总线基本原理有个基本了解即可。
下一步计划,结合例程代码对知识点做分析。

15.1 I2C总线概述

  • Inter-Integrated Circuit = I2C,也有简写为IIC的,是一种串行通信总线,使用多主从架构,由飞利浦公司开发。它是同步通信的一种特殊形式,具有接口线少、控制方式简单、器件封装形式小、通信速率较高等优点。可以实现同步通信。
  • I2C总线的2根信号线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。
  • 连接到总线上的任一个器件输出的低电平都能使总线的信号变低,即各器件的SDA及SCL都是线与关系。

1.I2C总线的主机和从机

  • 每个连接到I2C总线上的器件都有唯一的地址。
  • 主机与其他器件间的数据传送可以由主机发送数据到其他器件,这时主机即发送器。从总线上接收数据的器件为接收器
  • 主机不一定是发送器,主机的主要特征是:初始化发送产生时钟信号终止发送的器件。
  • 被主机寻址的器件即为从机,同样它也可以是发送器或者接收器。
  • 对于多主机系统,可能同时有几个主机企图启动总线传送数据。为了避免混乱,I2C总线要通过总线总裁,以决定由哪一个主机控制总线。请添加图片描述

2.I2C数据位的有效性规定

  • I2C总线进行数据传输时,SCL时钟信号为高电平时,SDA数据线上的数据必须保持稳定,只有时钟线上的信号为低电平时,数据线上的高电平或者低电平状态才允许变化
    请添加图片描述

3.I2C的起始与停止

  • I2C总线中唯一违反上述数据有效性的是被定义为起始信号(S)和停止(P)信号。
  • SCL时钟信号线为高电平时,SDA数据信号线由高电平变为低电平的变化表示起始信号——S
  • SCL时钟信号线为高电平时,SDA数据信号线由低电平变为高电平的变化表示停止信号——P
    请添加图片描述
  • 起始和停止信号都是由主机发出的,起始信号产生后,总线就处于被占用的状态;
  • 停止信号产生后,总线就处于空闲状态。
  • 连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到I2C总线上的起始和停止信号。
  • 对于不具备I2C总线硬件接口的单片机说,为了检测起始位和终止信号,必须保证每个时钟周期内对数据线SDA采样2次。

4.I2C的数据传送

  • 接收器收到一个完整数据字节后,有可能需要处理其他事情,无法立刻接收下一个字节,这时接收器可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器准备好接收下一个字节时,再释放SCL线为高电平,从而使数据传送可以继续进行。

5.数据传送格式

(1)字节传送与应答

  • 每一个字节必须保证是8位长度。
  • 数据传送时,先传送最高位MSB,每一个被传送的字节后面必须跟随一位应答位ACK(即1帧数据共有9位)。
  • 应答ACK是接收器将SDA拉低,非应答NACK是将SDA拉高。
  • 由于某种原因从机不对主机寻址信号应答时,它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。
  • 如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节产生非应答NACK来通知主机,主机则应发送终止信号以结束数据的继续发送。
  • 当主机接收数据时,它收到最后数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的非应答来实现的。然后从机释放SDA数据线,以允许主机产生停止信号。
    请添加图片描述

(2)数据帧格式

  • I2C总线上传送的数据是广义的,既包括地址信号,又包括真正的数据信号。
  • 在起始信号S后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/W),用0表示主机发送数据(W),用1表示主机接收数据(R)。
  • 每次数据传送总是由主机产生的终止信号P结束,但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号P,马上再次发送起始信号S对另一从机进行寻址。
  • 在总线的一次数据传送过程中,可以有以下几种组合方式:
    • ①主机向从机发送数据,数据传送方向在整个传送过程中不变。

      • 灰底部分表示数据由主机向从机传送,无灰底部分表示数据由从机向主机传送。A表示应答信号ACK(低电平),A非表示非应答信号NACK(高电平)。S表示起始信号,P表示停止信号。
      • 从下图中可以看出,主机产生起始信号S:在SCL高电平时,SDA从高电平变为低电平,开始一次数据传输。
      • 接着主机发送8位数据(7位从机地址+1位数据传送方向(0——表示主机向从机发送数据)),当对应的从机接收到地址信号后,从机拉低SDA信号线表示接收到数据(应答A)。
      • 接着主机发送要发送给从机的8位数据到SDA,从机接收到数据后,拉低SDA线表示接收应答A,以此循环。
      • 当最后一次从机发送应答A或者非应答信号A非后,主机产生停止信号P以终止本次数据传输。
      • 停止信号P是:当SCL高电平时,SDA从低电平变为高电平。
        请添加图片描述
    • ②主机在第一个字节后,立即由从机读数据。在从机产生响应后,主机从发送器变为接收器,从机从接收器变为发送器。之后,数据由从机发送,主机接收,每个应答信号ACK由主机产生,但是时钟信号始终由主机产生。若主机要终止本次传输,则主机发送一个非应答信号NACK,接着主机产生停止信号。
      请添加图片描述

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

      • 从下图可以分析,
        • 主机产生一个起始信号S,接着发送7位从机地址+1位写信号(0),从机接收到信号后产生应答信号A,接着主机发送8位数据,从机可以产生应答信号或者非应答信号。
        • 主机没有产生停止信号P,而是重新产生一个起始信号S,接着重新发送7位从机地址+1位读信号(1),从机接收到信号后产生应答信号A,接着从机发送8位数据给主机。
        • 主机接收到数据后可以产生应答A,或者非应答A非,当产生非应答A非后,再由主机产生停止信号P以终止本次数据传输。
          请添加图片描述

6. 总线的寻址

  • I2C总线协议明确规定:采用7位的寻址字节。(寻址字节是起始信号后的第一个字节)
    请添加图片描述
  • D7~D1位组成从机的地址,D0表示数据传送的方向,当为0时表示主机向从机写数据,当为1时表示主机由从机读数据。
  • 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/W位将自己确定为发送器或者接收器。
  • 从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数量。比如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个相同的器件,即可以有8个同样的器件接入到该I2C总线系统中。
  • 寻址字节中的特殊地址如下表所示,固定地址编号0000和1111已被保留为特殊用途。
    请添加图片描述

7. I2C总线上的仲裁

  • SCL线的同步
  • SDA线的仲裁

15.2 F28335的I2C总线

1. F28335的I2C总线主要特征

  • 支持8位格式数据传输
  • 7位和10位地址模式
  • 通用拨叫功能
  • START字节模式
  • 支持多个主发送器和从接收器
  • 支持多个主接收器和从发送器
  • 数据传输速率10~400kbps
  • 一个16位接收FIFO和16位发送FIFO
  • CPU具有专用中断
  • 可以禁止和使能IIC
  • 自由数据格式模式

2. F28335的I2C总线不支持功能

  • 高速模式(HS模式)
  • CBUS兼容模式

3. F28335的I2C总线功能

  • 每个连接到I2C总线的器件(包括与I2C模块一起连接到总线的DSP)都有一个唯一的识别地址。
  • 根据器件功能的不同,每个器件都能够实现发送和接收功能。
  • 在进行数据传输时,连接到I2C总线的器件都可以作为主设备或者从设备,主设备负责初始化总线上的数据传输并产生时钟信号。
  • 在传输过程中,任何由该主设备寻址的设备都可以看作是从设备。
  • I2C总线支持多个主设备模式,在这种模式下,能够控制I2C总线的一个或多个设备都可以连接到同一条总线上。
  • 在进行数据传输时,I2C总线模块有一个数据引脚SDA和一个时钟引脚SCL。
  • SDA与SCL引脚都可以双向传输信号,在使用时必须通过一个上拉电阻给其加正电压。
  • 当总线空闲时,2个引脚均为高电平。
    请添加图片描述

(1)传输方式

  • 标准模式:发送n个数据,n指的是I2C模块寄存器设置的传输数据个数。
  • 重复模式:一直发送数据,直到软件停止强制产生一个停止信号或者一个新的启动信号。

(2)I2C总线的主要模块

  • 一个串行接口:一个数据引脚SDA和一个时钟引脚SCL
  • 数据寄存器和FIFO:用于暂时保存SDA引脚和CPU之间接收或者发送的传输数据。
  • 控制和状态寄存器
  • 外设总线接口:用以使CPU访问I2C模块寄存器和FIFO
  • 时钟同步器:用以完成来自DSP时钟发生器的I2C输入时钟和SCL引脚的时钟同步,在不同时中频率下实现与主设备的同步数据传输。
  • 分频预定标:将输入时钟分频产生I2C模块时钟
  • 噪声滤波器:对SDA和SCL引脚上的信号进行滤波。
  • 仲裁模块:完成I2C模块与其他模块之间的仲裁处理。
  • 中断产生逻辑:用以向CPU发送中断信号。
  • FIFO中断产生逻辑:可以使FIFO访问和I2C模块的数据接收和数据传输同步。
  • 如图15-5所示,在非FIFO模式下,在数据发送时,CPU向I2CDXR写数据,在接收数据时,CPU从I2CDRR中读数据。当I2C模块配置为发送器时,写入I2CDXR的数据被复制到I2CXSR,并逐位的移位到SDA引脚。当I2C模块配置为接受其实,接受的数据移位到I2CRSR,然后复制到I2CDRR。

4. 时钟产生

请添加图片描述

  • DSP时钟发生器从外部时钟源接收信号,并根据程序设置的频率产生I2C输入时钟,I2C输入时钟与CPU时钟相同,并在I2C模块内进行2次分频产生模块时钟和主时钟。
  • 模块时钟决定了I2C模块的运行频率。I2C模块内的一个可编程预订标器将I2C的输入时钟分频以产生模块时钟。为了确定分频值,可以初始化预订标寄存器的IPSC区域值,运算方法如下:模块时钟频率 = I2C / (IPSC + 1)
  • 注意,为符合所有I2C模块的事件标准,模块时钟必须被配置为7~12MHz的范围。
  • 只有当I2C模块处于复位状态时(IRS=0)才能初始化预订标。而只有当IRS由0变为1后,预订标产生的频率才起作用。当IRS=1时预订标频率无效时才能改变IPSC的值。
  • 当I2C模块配置为主机时,SCL引脚输出时钟信号,该时钟即为同步信号时钟,控制I2C主机和从机之间通信的时序。输入模块的时钟经过分频作为主机时钟信号,经过I2CCLKL的ICCL值对模块时钟信号的低电平部分进行分频,采用I2CCLKH的ICCH值对模块的时钟信号的高电平部分进行分频。

15.3 F28335的I2C总线操作

1.输入和输出电平

  • 主设备为每一个数据传输产生一个时钟脉冲。由于不同设备采用的技术标准不同,连接的I2C总线上的器件逻辑0和逻辑1是不固定的,由设备的VDD值决定。

2.数据位有效状态

  • 跟I2C总线的规定是一致的,在时钟信号为高电平的时候,SDA数据必须保持稳定。只有在SCL的时钟信号为低电平时,才能够改变SDA数据信号的高/低电平状态。
    请添加图片描述

3.I2C模块的主从操作模式

  • I2C模块支持4种数据传输模式,如果I2C模块工作在主机模式,则它首先为作为一个主发送器,发送一串地址给指定的从机。当需要发送数据给从机时,I2C仍保持在主发送器模式,当主机接收数据时,主机模式需变为主接收器模式。
  • 同理,如果I2C模块工作在从机模式时,首先它作为一个从接收器,从主模块发出的地址信号识别出为它的从机地址时,发送应答信号。如果接下来,主机需要通过I2C向该从机发送数据,该从机就保持为从接收器模式。如果主机请求I2C从机发送数据,则该从机变为从发送器模式。
    请添加图片描述
    请添加图片描述

4.I2C模块的启动和停止条件

  • 当模块配置为I2C总线的主机时,将由主机模块产生启动(START)信号与停止信号(STOP)
  • 在START信号之后,STOP信号之前,I2C总线处于繁忙状态,I2CSTR总线繁忙标志位BB为1。
  • 在STOP信号之后,下一个START信号之前,I2C总线处于空闲状态,BB为0。
  • 在发出START信号I2C模块开始数据传输时,I2CMDR中的主模式位MST和START条件位STT必须置1。
  • 当发出STOP信号I2C模块结束数据传输时,STOP条件位STOP必须置1。
  • 当BB位和STT位都设置为1时,产生重复START操作。
    请添加图片描述

5.串行数据格式

  • I2C模块支持1~8位数据值。
  • 数据线SDA上的每一位与SCL上的一个脉冲相对应,且发送过程总是先发送最高有效位MSB。
  • 传输或接收的数据个数没有限制。
    请添加图片描述

(1)7位地址格式
- 在7位地址格式下,START信号之后的第一个字节包括7位从机地址和一位R/W位。R/W位确定数据传输的方向。
- 在每个字节传输完成之后,插入一个响应信号ACK专用的额外时钟周期。主机发送完第一个字节,从机发出响应信号后,根据R/W位的状态,在响应信号之后,主机或从机就会发送n位数据;n的值介于1~8之间,由寄存器I2CMDR的BC区确定。数据发送完成之后,接收器会插入一个响应位。
- 如果要选择7位地址模式,则向I2CMDR寄存器的XA位写入0以选择7位地址格式,并确认自由数据格式模式处于关闭状态(FDF=0,I2CMDR寄存器)。
请添加图片描述
(2)10位地址格式
- 10位地址模式与7位地址模式格式相似,但不同的是主机发送从机地址采用2个分离的字节传输。
- 第一个字节由11110B、10位从机地址的2个MSBs和R/W组成。
- 第二个字节是10位从机地址的剩余8位地址。
- 从模块在每2字节传输完成之后必须发送一个响应信号。主模块将第二个字节的地址写到从机时,主机可以写数据或者使用START信号重复操作改变数据传输方向。
- 如果要使用10位寻址格式,则向I2CMDR寄存器的XA位写入1,并确认自由数据格式处于关闭状态(FDF=0,I2CMDR寄存器)。
请添加图片描述
(3)自由数据格式
- 在自由数据格式下,START之后的第一个字节是一个数据字节。
- 在每个数据字节结束后插入一个响应位ACK位,数据字节的长度根据I2CMDR寄存器的BC区可以设置为1~8位,不发送地址或者数据方向信息。
- 因此,在该方式下发送器和接收器都必须支持自有数据格式,并且在数据传输过程中,数据传输的方向必须保持不变。
- 如果要选择自由数据格式,向I2CMDR寄存器的自由数据格式(FDF)位写1。
- 在LOOP-BACK循环测试模式下,不支持自由数据格式。
请添加图片描述
(4)重复START操作
- 在每个数据字节传输结束时,主机可以驱动另外的START操作。利用这个特点,主机可以与多个从机通信,而不需要通过STOP操作放弃总线控制权。数据字节的长度可以设置为1~8位,由I2CMDR寄存器的BC区选择。重复START操作可以使用7位数据格式、10位数据格式和自由数据格式。下图给了一个使用7位数据格式的重复START操作示例。

6.不响应(NACK)信号方式

  • 当I2C模块作为主/从接收器时,可以响应或者忽略发送器发送的位。为了忽略任何总线上发送的信号,I2C模块必须在总线响应过程中发送一个不响应信号NACK。
  • 下表总结了可以产生NACK信号的各种方式:
    请添加图片描述
    请添加图片描述

7.时钟同步

  • 在通常情况下,只有一个主设备产生时钟信号SCL,而在仲裁程序中可以有2个或者多个主设备。
  • 为了使输出数据具有可比性,时钟必须保持同步。
  • SCL的线与意味着一旦有一个设备在SCL产生低电平信号,则其他设备也被强制为低电平,即在这个由高变低的过程中,其他设备产生的时钟强制置低电平,并且只要有设备的时钟信号为低则SCL一直保持低电平。
  • 只有总线SCL的低电平状态结束,其他设备时钟的低电平状态才可以结束。在变换为高电平状态之前,首先获得一个SCL的同步信号。该同步信号低电平状态的长度由最慢的设备时钟信号决定,高电平状态的长度由最快的设备时钟信号决定。
  • 如果有设备需要将时钟信号强制拉低并且保持一个较长的时间,那么其他时钟发生器都进入等待状态。在这种状态下,从设备将主设备的工作时钟变慢,并为存储接收的字节或者发送字节创造了足够的时间。

8.仲裁

  • 如果2个或者更多个主发送器要同时向同一个总线发送数据,就需要启动总线仲裁程序。通过仲裁决定如何选取串行数据总线上的数据。一个主发送器将SDA置为高电平,被另一个将SDA置低电平的主发送器控制。也就是说,传输最低二进制串行数据流的设备具有优先权。如果2个或多个设备发送的数据首字节相等,则仲裁结果将继续选取随后的数据字节。
  • 如果I2C模块丢失主机模式,它就转变为从接收器模式,发送仲裁丢失标志AL,并产生一个仲裁丢失中断请求。
  • 如果在串行传输过程中,向SDA发送重复START或者STOP操作指令时一个仲裁程序也在运行,其主发送器必须在同一个位置以固定格式发送重复START或STOP操作指令,不能在以下数据信号之间产生仲裁:
    • 重复START信号与一个数据位之间
    • STOP信号与一个数据位之间
    • 重复START信号与STOP信号之间

9.I2C模块产生的中断请求

  • I2C模块可以产生7种基本的中断请求,其中有2种中断用来确定CPU何时写入传输数据以及何时读出传输数据。如果用FIFO进行传输和发送的操作,也可以调用FIFO中断。I2C基本中断配置于PIE8组的中断1(I2CINT1A_ISR),FIFO中断配置于PIE8组的中断2(I2CINT2A_ISR)。

(1)I2C模块的基本中断

  • I2C模块的中断请求如下表,所有的中断都汇集到仲裁器,通过仲裁判断之后再向CPU发出一个I2C中断请求。在状态寄存器I2CSTR中给每个中断请求都分配了一个标志位,在中断使能寄存器I2CIER中给每个中断分配了一个使能位。当产生一个中断请求时,其标志位就会置位,如果此时中断使能位为0,则不响应中断请求。如果使能位为1,则该请求作为一个I2C中断发送到CPU。
  • I2C中断时CPU的可屏蔽中断之一。如果CPU能够响应该中断,便执行响应的中断服务程序I2CINT1A_ISR。I2C中断的I2CINT1A_ISR通过读取中断源寄存器I2CISRC中的响应信息来确定中断源,然后执行中断服务子程序。
  • CPU读取中断源寄存器I2CISRC之后,将进行以下步骤:
    • ①清除I2CSTR寄存器中响应的中断源标志位,但是I2CSTR中的ARDY、RRDY、XRDY位不清除。当需要清除时,向该位写1。
    • ②通过仲裁确定剩下的其他中断请求中哪个优先级最高,在寄存器I2CISRC中做出标记,并将该中断请求发送给CPU。
      请添加图片描述
      请添加图片描述请添加图片描述

(2)I2C模块的FIFO中断

  • 除了7个基本I2C中断之外,每个发送FIFO与接收FIFO都能够产生一个中断I2CINT2A。可以配置发送FIFO在发送一定数量的字节之后产生一个中断,字节个数最多为16。可以配置接收FIFO在接收一定数据量的字节之后产生一个中断,字节数最多为16。
  • 这两个中断经过或操作到一个可屏蔽CPU中断。中断服务子程序通过读取FIFO中断标志位来确定该中断属于哪个中断源。

10.I2C模块复位/禁止

  • 可以通过两种方式复位/禁止I2C模块:
    1. 将I2C模式寄存器I2CMDR的I2C复位位IRS置0。I2CSTR中的所有状态均被强制恢复到默认值,I2C模块保持禁止直到IRS位变为1。SDA和SCL引脚均为高阻抗状态。
    2. 通过将XRS引脚拉低初始化DSP。该操作复位整个DSP,并使DSP保持复位状态直到引脚电平被拉高。当释放XRS引脚是,所有I2C模块寄存器复位到其默认状态,IRS位被强制置0从而复位I2C模块。I2C模块保持复位状态直到IRS位置1。
    3. 在配置或者重新配置I2C模块是IRS必须保持为0。将IRS强制置0可以节省电能或清除错误状态。
  • 44
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值