- 嵌入式软件设计(第2版)
- 康一梅
- 3883字
- 2025-02-19 20:05:01
1.3.1 片级总线
一个嵌入式计算机系统的硬件由处理器与存储器等构成,大多数处理器都需要扩展存储器,这些处理器芯片(MCU、MPU等)与存储器芯片(RAM、EEPROM)之间的通信是通过片级总线来实现的。在嵌入式软件的设计和开发中,处理器通过对总线上的设备编址来唯一标识每一个设备,与总线上的设备进行通信时,线序(芯片上的接口)与时序(脉冲周期、上升沿、下降沿)直接影响软件能否正确读写数据。
串行总线是指数据一位一位地顺序传送,其特点是通信线路简单,只需要一对传输线就可以实现双向通信。本节重点介绍常用的SPI串行总线和I2C串行总线的总线结构、接口定义与工作模式。
1. SPI串行总线
SPI(Serial Peripheral Interface,同步串行外设接口)是由Motorola公司首先提出的全双工三线同步外设接口,采用主从(Master-Slave)模式架构,支持多从设备模式应用,一般只支持单主设备。SPI总线大量应用于主设备与EEPROM、RTC、ADC和显示驱动器之类的慢速外设通信。
SPI总线是一个4线的串行通信接口总线,用于IC器件之间的连接。它也是一个同步的串行数据连接,支持在CPU和其他支持SPI的设备之间进行低(或中)带宽的网络连接。SPI总线基本上是一个简单的同步串行接口,可用很少的信号线连接外部低速的设备。它工作在主从模式下,当两个设备通过SPI总线连接时,一个是主设备,另一个是从设备,主设备驱动串行时钟。使用SPI时,可同时接收和发送数据,即SPI总线接口是全双工的接口。
SPI总线有如下特性:
·具有全双工,3线同步传输;
·工作在主从设备模式下;
·同步通信由主设备发起;
·时钟相位和极性可编程;
·带有写冲突保护和总线竞争保护机制。
(1)SPI总线结构
SPI总线的内部硬件实际上是个简单的移位寄存器,时钟由主设备(Master)控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后。命令代码和数据值都是串行传输的。
SPI设备可以只是一个移位寄存器,也可以是一个独立的子系统。移位寄存器的长度不是固定的,不同设备可能不同。正常来说,移位寄存器是8位的,或者是8位的整数倍。移位寄存器的长度不一定遵循这个规范,比如两个级联的EEPROM就可以存储18位数据。
SPI要求两条控制线SCLK(时钟)、CS(片选)和两条数据线SDI(数据输入)、SDO(数据输出)。CS对应被选中的外设。这个引脚大多时候是低电平有效的。若没被选中,SDO线是高阻的,故是未被激活的。主设备决定它要连接的是哪个外设。无论设备有没有被选中,时钟线SCLK都会被接入该设备。时钟信号用于数据通信的同步。Motorola公司将这些数据线命名为MOSI和MISO,即Master-Out-Slave-In和Master-In-Slave-Out。片选线则称为SS(Slave-Select)。
大多数SPI设备都提供这四条线。有时候,SDI和SDO线会翻倍,比如National Semiconductor公司的温度传感器LM74;有时候,这些线中的一根会缺失。若某个外围设备不能被配置,它就不需要输入线,只需要输出线;一旦被选中,它就开始发送数据。有些ADC设备没有SDI线,比如Microchip的MCCP3001;有些设备是没有数据输出的,比如LCD控制器,它可以被配置,但不能发送数据或状态信息。
SPI主设备-从设备连接及通信环路示意图如图1-7所示。其中,图1-7a是主设备与从设备连接,图1-7b是主设备与从设备通信环路,从通信环路可以看到主从设备间的数据是如何通过移位寄存器交换数据的。

图1-7 SPI主设备-从设备连接及通信环路
可以将图1-8中的几个级联SPI设备看作一个大型设备,它们共用同一个片选信号。前一个设备的输出数据和下一个设备的输入数据绑定在一起,这样就形成了一个更宽的移位寄存器。

图1-8 主设备与级联SPI设备连接
如果独立从设备与主设备直接连接,则需要如图1-9所示的总线结构。这时主设备的SCKL时钟和SDI数据线都和每个从设备直接连接。此时,SDO数据线还是绑定在一起,然后一起返回给主设备。只有片选信号是独立连接到每一个SPI设备的。

图1-9 主设备与多个独立从设备连接
(2)SPI总线的工作模式与数据传输
Motorola公司没有定义任何通用的SPI时钟规范,但实际上,SPI总线有四种模式可以使用,这四种模式由时钟极性(Clock Polarity,CPOL)和时钟相位(Clock Phase,CPHA)组合决定。CPOL和CPHA的设置决定了数据采样的时钟沿。
SPI总线的模式有SPIO、SPI1、SPI2和SPI3四种工作模式,这四种工作模式的时钟极性和时钟相位组合如表1-3所示,SPI总线工作模式时序图如图1-10所示,其中使用最广泛的是SPI0和SPI3模式。
表1-3 SPI总线工作模式


图1-10 CPHA = 0/CPHA = 1时,SPI总线数据传输时序图
1)CPOL决定空闲时时钟的电平,CPOL对传输协议没有重大影响。
·若CPOL = 0,串行同步时钟的空闲状态为低电平;
·若CPOL = 1,串行同步时钟的空闲状态为高电平。
2)CPHA决定从时钟的第几个跳变沿开始数据采样,CPHA能够配置用于选择两种不同的传输协议之一进行数据传输。
·若CPHA = 0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;
·若CPHA = 1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
2. I2C串行总线
I2C总线是一个简单的双向总线。消费电子、通信和工控系统一般都有智能控制,如使用微处理器进行控制。这些智能控制单元有通用的电路,如LCD驱动、I/O端口、RAM、EEPROM和一些数据转换电路,也有一些面向应用的电路,如数字解调和数字信号处理等。为了充分利用这些设计的相似之处,使硬件工作更高效、电路更简单,通过I2C总线对这些IC进行控制非常方便。
I2C总线具有以下特点:
·仅有两条总线信号线:SDA(串行数据信号线)和SCL(串行时钟信号线)。
·每个连接在此总线上的设备都是可编址的。采用I2C总线连接的设备处于主从模式,主方既可接收数据,也可发送数据。
·一个真正的多总线。包含冲突检测和竞争功能,从而确保当多个主方同时发送数据时不会造成数据冲突。
·串行的8位双向数据传送总线。在标准模式下,数据传输速率为100kbit/s;在快速模式下,数据传输率为400kbit/s;在高速模式下,数据传输率为3.4Mbit/s。
I2C总线是一种用于IC器件之间进行连接的二进制总线。通过两根信号线(SDA和SCL)传输信息。通过地址识别连接此总线接口的设备,如存储器、键盘等。图1-11是I2C总线的结构和数据传输规范。
SDA和SCL都是双向的I/O线,它们通过上拉电阻连接到正电源。当总线空闲时,两条信号线(SDA和SCL)都是高电平,连接在总线上的器件的输出极必须是开路或集电极开路,以实现线与功能。

图1-11 I2C总线的结构和数据传输规范
(1)I2C总线物理层
I2C总线只使用了两条信号线,串行数据信号线用于数据传送,串行时钟信号线用于指示什么时候数据线上的数据是有效数据。图1-12是一个典型的I2C总线系统结构。网络中的每一个节点都被连接到SCL和SDL信号线上,某些节点可以起到总线主控器的作用,总线上可以有多个主控器。其他节点可以起到响应总线主控器请求的总线受控器作用。

图1-12 I2C总线系统结构
图1-13展示了I2C总线的电路接口。总线没有规定逻辑“0”和“1”所使用电压的高低,以便双极性电路或MOS电路都能够连接到总线。所有的总线信号都使用开放集电极或开放漏电极电路。通过一个上拉电阻使信号的默认状态保持为高电平,当传输逻辑为“0”时,每一条总线所连接的晶体管起到下拉该信号电平的作用。开放集电极或开放漏电极信号允许一些设备同时写总线而不会引起电路故障。

图1-13 I2C总线的电路接口
I2C总线被设计成多主控器总线结构,不同节点中的任何一个控制器可以在不同的时刻起到主控器的作用,因此,总线上不存在一个全局的主控器在SCL上产生时钟信号。当输出数据时,主控器会同时驱动SDL信号和SCL信号。当总线空闲时,SDL和SCL都保持高电位。当总线上有两个节点试图同时改变SDL或SCL到不同电位时,开放集电极或开放漏电极电路能够防止出错,但是每一个主控器在传输时必须监听总线状态以确保报文之间互不影响,如果主控节点收到了不同于它要传送的值时,它就知道报文发送过程中产生了互相干扰。
(2)I2C总线数据链路层
每一个连接到I2C总线上的设备都有唯一的地址。设备的地址都由系统设计者确定,通常是I2C驱动程序的一部分。在标准的I2C总线定义中,设备地址是7位二进制(扩展的I2C总线允许10位地址)。
总线事务包含一系列单字节传送和位于一个或多个数据字节之后的地址传送。I2C形成了一种数据推移设计风格。当一个主控器试图写受控器时,它传送的数据后面带有受控器地址。因为受控器不能主动执行数据传输,所以主控器需要读受控器时,必须发送一个带有受控器地址的读请求让受控器传送数据。主控器的地址传送包括7位地址和表示数据传输方向的一个位:0代表从主控器写到受控器,1代表从受控器读到主控器。图1-14描述了I2C地址传送格式。

图1-14 I2C地址传送格式
总线事务由一个开始信号启动,以一个结束信号完成,步骤如下:
·开始信号通过保留SCL为高电平并且在SDL上发送1到0的转换产生;
·结束信号通过设置SCL为高电平并且在SDL上发送0到1的转换产生。
注意,开始信号和结束信号必须成对出现。主控器可以在数据传送后发送开始信号来先写后读(或者先读后写),接着是另一个地址的传送,然后是更多的数据传送。I2C总线主控器数据传送基本状态如图1-15所示。

图1-15 I2C总线主控器数据传送基本状态
总线对每个报文发送要进行仲裁。在发送时,发送节点监听总线,如果节点试图发送一个逻辑“1”,但却监听到总线上是另一个逻辑“0”时,它会立即停止发送并且把优先权让给其他发送节点。在许多情况下,仲裁在传送地址部分时完成。但是,仲裁也可以在数据部分继续。如果两个节点都试图向同一地址发送相同数据,那么它们之间不会互相影响且最后都会成功发送报文。
(3)I2C总线应用接口
在嵌入式系统中采用I2C接口可以用软硬件配合来实现。在图1-16所示的例子中,CPU执行一个程序把从硬件接口获取的1位二进制数据合并成字节,I2C的硬件接口负责生成一个二进制数据和时钟信号。应用程序通过调用驱动程序来发送地址和数据字节等,它产生SCL和SDL信号、确认信号等。中断用来识别二进制位的开始,但在主控模式下,如果没有其他挂起任务可以执行,那么也可以采用轮询I/O,因为主控器启动的是自己的传输任务。

图1-16 嵌入式系统中的I2C接口