历史上的今天
返回首页

历史上的今天

今天是:2025年03月22日(星期六)

2021年03月22日 | 单片机SPI通信中数据流的同步问题研究

2021-03-22 来源:eefocus

SPI 是串行外设接口(Serial Peripheral Interface)的缩写,通常称为“同步外设接口”,是由Motorola公司开发的全双工同步串行总线。该总线大量用在微处理器及其外设器件的通信中。与SPI有关的软件设计比较简单,使CPU有更多的时间处理其他事务。现在,越来越多的单片机带有SPI,采用SPI的外围芯片也与日俱增。采用SPI通信可以简化电路设计,提高电路可靠性,降低系统成本。


1 SPI通信的基本方式


SPI通信总线定义了以下4个接口信号。


◇ SIMO: 从入/主出。


◇ SOMI: 从出/主入。


◇ SCK: 串行时钟。


◇ SS: 从属选择(在有些芯片中定义为STE信号)。



图1 SPI通信的2种通信模式


SPI通信有三线SPI和四线SPI两种模式。在三线SPI模式下,从属选择信号SS/STE不起作用;采用四线SPI模式时,SS/STE信号为高电平时禁止从机接收和发送数据,SS/STE信号为低电平时允许从机接收和发送数据。SPI通信是一种基于主从配置的通信,提供串行时钟信号的一方是主机,其他的为从机。图1为2种通信模式下2台单片机之间的连接图。如果一个系统中有多台从机,那么主机就要为每一台从机提供一个从属选择信号,以确保任一时刻只有一台从机起作用[1]。


在SPI通信中,数据是同步发送和接收的。在串行时钟信号的作用下,主机在通过SIMO信号线发送数据的同时,也在通过SOMI信号线接收从机发送的数据;从机在通过SIMO信号线接收数据的同时,也在通过SOMI信号线向主机发送数据。Motorola公司没有定义任何通用SPI的时钟规范,但是所有具有SPI功能的单片机中,都可以通过设置相应的寄存器来设置时钟极性和时钟相位。对时钟极性的设置决定了静止时SPI串行时钟的有效状态,而对时钟相位的设置则规定了处理器在何时发送和接收数据。之所以如此,是为了适应不同外设和线路的需要,因为有些外设在时钟信号的上升沿锁存数据,而有些外设则在时钟信号的下降沿锁存数据[2]。


SPI传输串行数据时,首先传输数据的最高位[2]。波特率可以达到几Mbps,实际速度不仅取决于SPI硬件,而且还受到软件设计的约束。


2 数据流的同步


同步串行通信的基本特点是: 同步串行通信是以字符块为信息单位传送的,而每帧信息包含成百上千个字符,因此,数据传送一旦开始,就要求每帧信息内部的每一位都要同步。也就是说,不仅字符内部的位传送是同步的,而且字符与字符之间的传送也必须是同步的,这样才能保证收/发双方对每一位都同步。显然,这种通信方式对时钟同步要求非常严格。为此,收/发两端必须使用同一时钟来控制数据块传输中字符与字符、字符内部位与位之间的同步[3]。


不论以何种方式进行通信,都必须制定一个通信协议。SPI通信也不例外。通信协议通常可以被分为3个部分[4]: 语法、语义和定时关系。这3部分分别规定了通信双方“如何讲”、“讲什么”以及“何时讲”的问题。


同步通信的通信协议比较简单。通常在数据块的前面冠以同步字符,在数据块的结尾加上差错控制字符就构成了同步通信的一帧数据[5]。通过选择工作模式,设置波特率、时钟极性和相位以及软件的设计,就可以实现数据流的同步。


在双机或一台单片机与一片外围芯片的SPI通信中常选择三线模式;而在多方SPI通信中则通常使用四线SPI模式,这时SS/STE信号线用来对从机进行选择。在一主多从的SPI通信中,主机必须为每一台从机或外围芯片提供一个SS/STE信号,使得任一时刻只有一台从机或外围芯片起作用[1]。如果所有的从机都只从主机接收数据,而不向主机发送数据,那么也可以使用三线SPI模式。SS/STE信号也可以用来对主机进行选择,不过通信将变得很复杂。选择正确的工作模式是进行可靠的SPI通信的前提。


SPI通信是在主机提供的时钟信号驱动下进行的,设置波特率就是设置主机提供的时钟信号的频率。因此,波特率的设置就显得相当重要,需要多方考虑。单片机与其外围器件进行通信时,一次可能只发送1个或2个字节的数据,可以把波特率设得高一些,只要不超过硬件允许的范围即可。如果是两台单片机之间进行通信,那么每次传送的往往是一组数据,否则就失去了同步通信的意义[3]。这种情况下,就必须考虑接收数据一方的运行速度。因为无论是采用查询还是中断方式接收数据,每收到1个字节或1个字的数据后,接收方的单片机就必须从接收缓冲寄存器中取一次数据。这个过程必须在下一个字节或字传送完毕前结束。也就是说,处理时间不能超过8个或16个串行时钟周期;否则,将会发生溢出错误。例如,完成这个过程需要4 μs,当接收缓冲寄存器为8位时,串行时钟的波特率就不能超过2 Mbps;当接收缓冲寄存器为16位时,串行时钟的波特率就不能超过4 Mbps。有的单片机片内RAM有限,没有足够的RAM空间用来保存中间数据,每收到1个字节或字的数据就必须处理一次。这样一来,串行时钟的波特率就需要设置得更低。


当单片机与其外围芯片进行SPI通信时,应当根据外围芯片的时序来设置串行时钟的极性和相位。例如,某芯片在时钟信号的上升沿接收SPI线上的数据,那么主机就必须采用无延时的下降沿或有延时的上升沿时钟方式来发送SPI数据[1]。当两台单片机之间进行SPI通信时,双方对时钟信号极性和相位的设置必须相同。


在硬件连接方面,需要引起注意的问题是上电复位后引脚SS/STE上信号的极性。如果上电复位后,引脚SS/STE上为低电平,则有可能收到1位伪数据。在四线SPI模式下,如果在从机的SS/STE引脚上接一个上拉电阻,就可以避免这种情况的发生。


如果在通信过程中,出现串行时钟信号丢失或干扰,将造成数据流的不同步,通信的各方就收不到正确的数据。所谓“数据流不同步”是指数据的比特位发生了偏移。例如,发送的数据是0xA9和0x36,但是收到的却是0x52和0x6C,数据向右移了一位。一旦发生这种错误,仅靠硬件是无法纠正的,若不在软件中采取措施,则将一直错下去,永远收不到正确的数据。


采用软件纠错的关键在于找出偏移的位数,然后据此采取措施,得到正确的结果。一般说来,在通信数据中包含了一些特殊字符,用于标志数据流的开始和终止。处理数据时,首先寻找这些特殊字符。如果不能发现这些特殊字符,就说明数据发生了偏移,需要进行纠错处理。具体的处理办法如下: 假设数据以字节为单位,用前一个数据的后N位和后一个数据的前(8-N)位重新组成一个新的数据。其中,1≤N≤7。改变N的值,直到从重组的数据中发现特殊字符为止。此时的N值就是数据流发生偏移的位数,然后根据这个值对所收到的其他数据进行重组,就可以得到正确的结果。与此同时,如果还要发送数据,就要对发送出去的数据进行类似的处理。因为如果通信的一方收到的数据发生偏移,那么另一方收到的数据肯定也发生了相同的偏移。


通常要求系统上电复位后,从机先于主机开始工作。如果从机在主机之后开始工作,就有可能丢掉部分时钟信号,使得从机并不是从数据的第一位开始接收,造成数据流的不同步。可通过硬件延时或软件延时的方法,来确保从机先于主机工作。


3实例


现在以数字信号处理器TMS320LF2407A和单片机MSP430F135为例,说明如何确保SPI通信中数据流的同步。这里采用三线SPI模式,TMS320LF2407A设置为主机,MSP430F135设置为从机;双方的时钟极性和相位都设置为无延时的上升沿。TMS320LF2407A的主频为40 MHz,采用定时发送/接收数据的方式工作,每间隔800 μs发送一个字节,波特率为200 kHz。这样设置的原因是,MSP430F135的主频为8 MHz,片内的RAM只有512字节,没有足够的RAM用于保存中间数据,每接收一个字节就得进行一次处理,所以必须留有足够的时间给MSP430F135进行数据的处理。每一轮发送132字节,由4个引导字符0xFF加上128字节的数据组成。MSP430F135采用中断的方式接收/发送数据。


以下是用汇编语言编写的TMS320LF2407A的SPI通信初始化子程序:


SPI_INIT:


LDP#00E0h


SPLK#0007h,SPICCR


SPLK#0006h,SPICTL


SPLK#003Fh,SPIBRR


SPLK#0087h,SPICCR


RET


下面是用C语言编写的MSP430F135的SPI通信初始化子程序:


void SPI_init() {


UCTL0&=~SWRST;


UCTL0=CHAR+SYNC;


UTCTL0=0x02;


P3SEL|=0x0f;


P3DIR=0x04;


ME1=USPIE0;


IE1|=URXIE0;


}


在MSP430F135的接收数据处理程序中还包含了防止数据流发生偏移的措施,实现方法与前文所述相同。图2是接收数据处理程序的流程图。


上述程序是电镀用开关电源控制程序的一部分。DSP控制器TMS320LF2407A负责主电路的控制;单片机MSP430F135作为辅助控制器,负责键盘和液晶显示器的控制。两个微控制器之间通过SPI通信交换信息。实际应用表明,采用这种方法进行SPI通信是可靠的。


4 结论


SPI通信具有硬件连接简单、使用方便等优点。采取硬件和软件相结合的措施,可以确保SPI通信中数据流的同步,实现可靠通信。通过电镀用开关电源中数字信号处理器TMS320LF2407A和MSP430F135单片机之间SPI通信的实例, 验证了文中提出的三线模式SPI通信中, 防止和纠正比特位发生偏移的方法的有效性。



图2 接收数据处理程序流程图止和纠正比特位发生偏移的方法的有效性。


参考文献


[1] 刘和平,严利平,张学锋,等 .TMS320LF240X DSP结构、原理及应用[M]. 北京:北京航空航天大学出版社,2002.


[2] 胡大可. MSP430系列FLASH型超低功耗16位单片机[M]. 北京:北京航空航天大学出版社,2002.


[3] 刘乐善,欧阳星明,刘学清. 微型计算机接口技术及应用[M]. 武汉:华中科技大学出版社,2000.


[4] 求是科技.单片机通信技术与工程实践[M]. 北京:人民邮电出版社,2005.


[5] 王保义,张少敏. 接口与通信[M]. 北京:中国电力出版社,2006.


李忠桥(硕士研究生),主要研究方向为电源技术;游小杰、郑琼林(博士生导师),主要研究方向为交流传动。


推荐阅读

史海拾趣

Collins Electronics Corp公司的发展小趣事

随着科技的飞速发展,Collins Electronics Corp意识到技术创新是企业持续发展的关键。他们投入大量资源进行研发,推出了一系列具有创新技术的电子产品。其中,他们开发的一款新型高频无线电收发器,因其传输速度快、信号稳定而广受好评。这项技术不仅为公司带来了可观的利润,还推动了整个电子行业的技术进步。

Array Microsystems Inc公司的发展小趣事

在取得初步成功的基础上,Array Microsystems Inc深知技术创新是企业持续发展的核心动力。因此,公司加大了对研发的投入力度,不断推出新的阵列传感器产品和技术。这些新产品不仅具有更高的性能和更低的成本,还满足了市场不断变化的需求。通过持续的创新和研发,Array Microsystems Inc在电子行业中保持了领先地位。

Fermionics Lasertech Inc公司的发展小趣事

在电子科技日新月异的今天,Fermionics Lasertech Inc公司由一群热衷于激光技术研究的科学家和工程师创立。他们致力于开发新型激光器,以满足电子制造行业对高精度加工的需求。在经历无数次实验和失败后,他们终于研发出了具有划时代意义的超精密激光切割设备,这一技术突破为公司赢得了第一笔大额订单,也为公司的后续发展奠定了坚实的基础。

Diodes公司的发展小趣事

在竞争激烈的电子行业中,合作共赢是企业发展的重要途径。Diodes公司始终坚持合作共赢的理念,与众多上下游企业建立了紧密的合作关系。例如,在供应链方面,Diodes与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量保障;在销售方面,Diodes与多家分销商建立了战略合作伙伴关系,共同开拓市场、推广产品。这些合作关系不仅为Diodes带来了更多的商业机会和市场份额,也促进了整个产业链的健康发展。

DELTA公司的发展小趣事

Delta公司始终将技术创新作为推动企业发展的核心动力。公司不断投入巨资进行技术研发和创新,积极引进先进技术和设备,培养高素质的研发人才。这些努力使Delta在电源管理、能源管理、智能绿生活等领域取得了多项技术突破和专利成果,不仅提升了公司的核心竞争力,还引领了整个行业的发展方向。

GE Power Electronics Inc公司的发展小趣事
选用质量可靠、性能稳定的元件,如高精度电位器、低噪声放大器等。

问答坊 | AI 解惑

单片机控制开关电源的程序!

单片机怎么控制开关电源啊…

查看全部问答>

广告灯

4. 广告灯的左移右移 1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。 ...…

查看全部问答>

基于CP2102的USB接口设计

基于CP2102的USB接口设计…

查看全部问答>

求protel2004的单片机的PCB封装库

哪位仁兄有单片机的封装库啊?万分感激!!!!…

查看全部问答>

听说这的牛人很多~特来求救!!!!!!!!!!!!

就是关于用vhdl做的一个数字密码锁。。具体要求如下: 1.4位密码十进制数(0-9) 2.密码设置键 开锁键 清屏键 3.显示:4位密码led(开锁时可见。密码设置为x),锁状态1红(lock)1绿(open)密码错误1红(闪烁) 4.密码错误,报警(声音) 5. ...…

查看全部问答>

【已解决】TIM4的Remap死活不干活,请求协助!!!

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    GPIO_InitStructure.GPIO_Speed =&n ...…

查看全部问答>

UM0721(USBOTGFSlibrary)提供的源码有问题?

UM0721文档里说,打开Project\\RVMDK\\下的keil工程后是这样: 下载 (10.29 KB) 2010-7-8 21:03 下载的um0721.zip解压缩后的确也有这些文件,但是用Keil4那个Uv2工程文件打开却是这样的: 下载 (2.53 ...…

查看全部问答>

怀疑买到的STM32F103VET6是翻新货

最近在淘宝上买到了几片STM32F103VET6的片子,焊在板子上后发现PD8脚作为GPIO的上拉输入无效,读取电平总是高电平,换了另一片后任然是这个问题,换上STM32F103VCT6是没问题的,然后怀疑是这批片子是翻新的,它的外观也和以前买到的ST的ARM不 ...…

查看全部问答>

【课后练习】LaunchPad课后练习四之LCD1602

1.      简单介绍下1602 1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行 ...…

查看全部问答>