在本篇文章中,我们将介绍数字通信以及串行外设接口(Serial Peripheral Interface,简称SPI通信)的基础知识。主要包括通信结构和所需的数字线路。许多精密模拟器件在微控制器(称为控制器)和被控设备(称为外设)之间具有数字接口。以精密模数转换器(ADC)为例,外设ADC测量输入电压,而控制器微控制器通过数字通信读取该数据。以精密数模转换器(DAC)为第二个例子,控制器微控制器向DAC写入一个数字字,以设置输出电压。在这两种类型的设备中,这种通信可能是双向的。
许多精密数据转换器可能需要一些配置和编程。需要对设备进行写入和读取操作,因此需要数字通信。为了使两个设备之间能够进行通信,需要一个共同的标准,以便控制器和外设能够相互理解。
通信是通过二进制表示的字进行传输的。这些通信位由1和0组成,通常被组织成8位一组,称为一个字节。为了方便,字节可以被组织成两个数字十六进制数。通常,在微控制器(控制器)和外设之间发送和接收数据时,会使用多个字节。多个字节可能用于表示模数转换器(ADC)的输出数据、数模转换器(DAC)的输出电压,或者向数据转换器发送命令和配置信息。
数字通信可以采用多种形式,但主要有两种结构经常被使用。首先,通信可以是并行的,其中每位数据使用一条线路。例如,一个字节同时通过八条并行数字线路传输。其次,通信可以是串行的,其中所有数据位都在同一条数字线路上。在串行通信中,数据位是按顺序一个接一个地发送的。
在现代设备中,串行通信使用更为广泛,减少了控制器与外设之间的通信线路数量。这里的图示展示了数据从控制器传输到外设的过程,但从外设传输数据回控制器则需要单独的线路。对于精密数据转换器,大多数都使用串行通信的形式。
大多数设备厂家使用两种不同串行接口标准中的一种,即4线串行外设接口(SPI)或2线I2C。
控制器和外设之间的线路被驱动到两个电压水平之一。如果电压接近0,则该线路被解码为数字0。如果电压接近数字电源电压,则该线路被解码为数字1。请注意,控制器和外设都需要就这些电平达成一致,以确保通信能够被正确解码。数字输出必须被驱动到足够高的电平以被解码为数字1,并且被驱动到足够低的电平以被解码为数字0。
数据手册定义了数字输出的最小高电平输出电压和最大低电平输出电压。此外,数据手册还定义了定义高电平的最小输入电压和定义低电平的最大输入电压。它们的通信标准根据数字电源电压定义了这些电平。如果控制器和外设的数字电源电压不匹配,则可能会出现通信问题。此时,可能需要使用电平转换设备来桥接从一个电源电压到另一个电源电压的通信。
通信还需要控制器和外设之间有一个共同的时序。这两个设备必须在时序上达成一致,即知道外设应该在何时读取电压水平,以确定位传输何时发生。通常,会使用来自控制器的串行时钟来定义通信的时序。读取位可能在串行时钟的上升沿或下降沿进行。在此示例中,数据是在串行时钟的下降沿读取的。
在精密数据转换器中最常用的串行接口是一种称为串行外设接口(Serial Peripheral Interface,简称SPI)的标准。SPI有两条控制线。控制器(通常是微控制器或数字信号处理器)控制外设选择和用于数据同步的串行时钟。一个SPI总线可以控制多个外设,但只能有一个控制器。每个外设都需要从控制器接收自己的外设选择线。
此外,还有两条数据线。一条线用于从控制器发送数据到外设,另一条线用于从外设发送数据到控制器。数据传输可以是全双工的,这意味着可以使用相同的SCLK脉冲为数据时钟,同时在两个方向上传输数据。接下来将描述SPI的四条线。
SS上划线(Slave Select,从机选择)是外设选择线。这条线用于选择要进行通信的外设。如果SPI总线上有多个设备,则每个设备都有自己的外设选择线。外设选择线通常用作低电平有效,用一条上划线表示。
当设备被选中时,外设选择线变为低电平以激活通信。当设备未被选中时,外设选择线被设置为高电平。外设选择线也可能被标记为SSEL、CS、CS#(CS bar,即CS上加一条上划线表示低电平有效)、CE、nSS或SS#。在德州仪器(TI)的许多精密模数转换器(ADC)中,这条芯片选择线通常被标记为CS#(CS上加一条上划线),用作低电平有效。在许多精密数模转换器(DAC)中,这条线通常被标记为SYNC#(SYNC上加一条上划线),同样用作低电平有效。
SCLK是串行时钟。如前所述,SCLK由控制器使用,用于同步控制器和外设之间发送的数据。SCLK起源于控制器,并发送给所有外设。这个串行时钟并不总是处于工作状态,它可能作为高电平或低电平信号处于空闲状态。数据在串行时钟的上升沿或下降沿被送入控制器或外设。SCLK线也可能被标记为SCK。
MISO(Master In Slave Out,主入从出)是控制器输入、外设输出线。这条线用于从外设设备发送数据到控制器。如果控制器未通过外设选择线选择该设备为活动状态,则这条线会变为高阻抗状态(Hi-Z),允许包含多个设备的系统共享这条线。
外设设备在MISO线上发送数据,并与SCLK同步。在外设设备上,它可能被称为SOMI、SDO、DO、DOUT或SO。这条线在控制器设备上连接到一个标有SDI、DI或DN的串行接口上。在许多精密数据转换器中,通常将此数字输出标记为DOUT。
控制器和外设的数据可以在SCLK的上升沿或下降沿上进行读取。此外,时钟极性在定义数据进出设备的领先边和滞后边时非常重要。这使得SPI通信具有多种模式。
有两个参数用于确定操作模式。第一个参数是CPOL,它决定了串行时钟的时钟极性。当CPOL等于0时,时钟在空闲状态下为低电平。此时,领先边是上升沿,滞后边是下降沿。当CPOL等于1时,时钟在空闲状态下为高电平。此时,领先边是下降沿,滞后边是上升沿。
第二个参数CPHA决定了数据是在哪个时钟相位被采集的。当CPHA等于0时,数据在时钟脉冲的领先边被采集。当SS#(片选信号的低电平有效形式)被拉低时,第一个数据位会在SCLK的滞后边准备好。当CPHA等于1时,数据在SCLK的滞后边被采集。在这两种时钟相位模式下,数据都是在前一个时钟边沿准备好的。
CPOL和CPHA的组合允许SPI有四种操作模式。本篇文章中的表格展示了SPI模式0到3。每种模式都为SPI通信定义了不同的时钟极性和相位。请注意,不同的SPI设备和微控制器制造商可能对SPI模式编号有不同的定义。要确定时钟极性和相位信息,请查阅控制器和外设的数据手册。
SPI可以用于与多个设备进行通信,这可以通过两种不同的方式实现。首先,由于SPI使用外设选择线,控制器可以与多个设备进行通信。每个外设都从控制器接收自己的外设选择信号,而其余线路是共享的。
当某个设备的外设选择线被选中时,其余的SPI线路处于活动状态。当外设选择线未被选中时,SPI线路将被忽略。当未被选中时,每个外设的MOSI和SCLK线路都会被忽略,而每个MISO线路会变为高阻抗状态(Hi-Z),这样活动的外设就可以驱动MISO线路,而不会与其他试图驱动同一线路的外设发生冲突。
在某些系统中,单个SPI总线驱动一个外设,而其他外设则以菊花链的方式连接在一起。在菊花链系统中,SCLK(串行时钟)和外设选择线可以由所有外设共享。然而,控制器仅连接到第一个外设的单个MOSI(主出从入)线。第一个外设的MISO(主入从出)线连接到下一个外设的MOSI线。这样,所有外设就从一个MISO线连接到下一个MOSI线,形成了链条。
对于最后一个外设设备,其MISO线连接到控制器。来自所有设备的数据都通过链条传递,并在最后由最后一个外设收集。并不是所有设备都能通过菊花链SPI连接进行控制和读取。设备必须专门为此种通信方式而设计。
以下是一个SPI数据通信的示例,它来自于某精密模数转换器(ADC)的通信。这是一款16位ADC,使用SPI模式1,其中CPOL等于0,CPHA等于1。在这种情况下,SCLK在空闲状态下为低电平,数据在SCLK的滞后边被输入和输出设备。
在16位数据传输周期中,两个字节的数据被时钟信号输入到一个配置寄存器中。同时,16位的ADC数据被时钟信号从设备中输出。该ADC具有一个16位的配置寄存器,其设置如表格所示。这些配置寄存器的值将设备编程为描述中所示的设置。在此示例中,我们希望写入设备的设置值为81C3(十六进制)。
继续以上面的ADC为例,这是其16位数据传输周期,展示了SPI线路的情况。同样,SCLK在空闲状态下为低电平,数据在SCLK的下降沿传输。向设备写入数据是通过MOSI完成的,或者在这个设备上,对应的引脚标记为DN。配置寄存器被设置为81C3(十六进制)。
同时,数据从ADC中被时钟信号输出。在这里,一个随机的输出数据字被时钟信号从设备中输出。观察DOUT线,输出的二进制数据被读取为E476(十六进制)。
2583