引言
串行外围设备接口SPI(Serial Peripheral Interface)是Motorola公司推出的一种同步串行接口,因其硬件功能强,与SPI有关的软件就相当简单,可使单片机有更多的时间处理其他任务。由TI公司推出的MSP430系列单片机(MCU)是具有精简指令集的16位单片机。它以极低的功耗、丰富的片内外设、卓越的工作性能和方便灵活的开发手段,得到了越来越广泛的应用;同时,MSP430系列单片机中大部分具有支持SPI的片内串行通信接口[1]。本文给出了MSP430F449与MSP430F149单片机之间基于SPI总线的三线主从式通信的设计方法。
1 硬件连接
1.1 SPI接口
SPI接口要求设备按照主从方式进行配置,且同一时间内只能有一个主器件。一般情况下,实现SPI通信需要3~4根线:第1根是同步时钟(SCK)线,用于实现主器件和从器件在MISO和MOSI线上串行数据传输的同步;第2根是主输出/从输入(MOSI)线,用于主器件的输出或者从器件的输入;第3根是主输入/从输出(MISO)线,用于主器件的输入或者从器件的输出;第4根是从选择(NSS)线(可选)。实际上,当SPI工作在三线方式时,NSS线被禁用;当其工作在四线方式时,NSS线用于使能从器件[2]。本文介绍的是SPI在三线方式时的工作情况。根据MISO线及MOSI线上的数据在SCK的时钟极性(CPOL)和时钟相位(CPHA)的不同,SPI可以分为SPI0、SPI1、SPI2、SPI3四种工作模式。工作时序如图1所示。
图1 SPI总线工作时序
1.2 硬件电路
图2 主从MCU的硬件连接电路
MSP430F449和MSP430F149均有两个串行通信模块USART0、USART1,均可设定在SPI方式下进行工作。以MSP430F449作为主机,MSP430F149作为从机,二者分别通过串行通信模块USART0、USART1进行SPI通信,每次数据的发送均由作为主机的MSP430F449发起。MCU之间的硬件连接电路如图2所示。SPI通信一般为点对点的通信,在多个从器件的情况下,可在硬件上设定各个从器件的地址,用译码器对从器件进行选择,确定和哪一个从器件进行通信。TI公司推出的54BCT244是8位三态驱动/缓存芯片,用于提高MSP430F449的驱动能力,实现数据的缓存。
2 软件设计
针对MSP430系列单片机的开发平台(称为“IAR Embedded Workbench EW430”,简称为“EW430”)支持汇编语言和C语言的编写。在此,使用C语言对两款单片机进行编程。
2.1 初始化
串口通信模块的功能很强,设置灵活。初始化主要包括控制部分、波特率部分、接收和发送部分的设置。UxCTL(x=0或者1)寄存器是一个8位寄存器。通过对该寄存器的设置,可确定通信模式、通信协议和校验位的选择。通过寄存器UxCTL设置串行通信模块时,要复位寄存器UCTL0中的SWRET位,允许串行通信模块正常工作。当该寄存器中的SYNC位为0时,MCU设置为SPI模式。波特率由作为主机的MSP430F449决定。波特率的设置主要包括时钟的选择和波特率的调整。主机选择辅助时钟ACLK为时钟源,从机MSP430F149直接选定外部时钟UCLK为时钟源。U1BR0、U1BR1和U1MCTL寄存器用来确定波特率。波特率的调整非常灵活,U1BR0寄存器和U1BR1寄存器用来粗调波特率,确定波特率的整数部分。其中U1BR0为低字节,U1BR1为高字节,结合起来是一个16位的字,为UBR。U1MCTL寄存器用来细调波特率,确定波特率的小数部分。波特率的计算公式为:
波特率=BRCLK/(UBR+(M7+M6+…+M0)/8)其中,M7、M6和M0为UxMCTL寄存器的相应位。当需要设置时,相应位为1,否则为0。
下面是SPI的初始化设置程序:
主机MSP430F149
void M_Spi_Init (void) {
U0CTL&=~SWRST;//SWRET复位,USART0
//模块允许
U0CTL=CHAR+SYNC+MM;//SPI主模式,8位数据
U0TCTL=STC+SSEL0;//选定ACLK作为时钟源
//三线SPI模式
U0BR0=0x04;//波特率分频因子为4
U0BR1=0x00;
U0MCTL=0x00;
ME1|=USPIE0;//SPI0模块允许
P3SEL|=0x0b;//P3.1~P3.3 被模块占用
P3SEL&=~ BIT2;//P3.2为输入模式
P3DIR|=0x0E;
//P3.1(SIMO0)、P3.3(UCLK0) 设为输出模式
IFG1 &=~URXIFG0;
IE1|=URXIE0;//接收中断允许
}
从机MSP430F149
void S_Spi_Init (void) {
UCTL1&=~SWRST;
UCTL1=CHAR+SYNC;//USART1模块允许
//主从式三线方式
UTCTL1=STC;
ME2=USPIE1;
P5SEL|=0x0F;
P5DIR&=0xF4;
P5DIR|=0x04;
IE2|=URXIE1;
}
2.2 收/发数据的实现
通信模块在不使用时可以关闭,以降低功耗;而在接收和发送每一字节数据时都可以触发中断,从而使CPU退出低功耗模式[3]。UxRXBUF寄存器是用来接收数据的寄存器。接收数据时,从该寄存器读出数据。UxTXBUF寄存器是用来发送数据的寄存器,当有数据需要发送的时候,将数据写入该寄存器。收发过程中要注意: ① 当有多个从器件时,主MCU和一个从MCU通信完成后,考虑到硬件电路中芯片元件的关断及导通时间,要经过一定的延时才能和第二个从MCU进行通信,否则会出现从器件无响应的状况。② SPI通信过程中,发送和接收中断有两个独立的中断控制位控制,即可以由URXIFG或者UTXIFG来实现。一般使用前者。接收到数据后,在接收中断中写入TXBUF。③ SPI主从式通信有一个显著特点是,从器件不能够主动发起传输,必须要由主器件来控制。解决的办法是,每隔一段时间就由MSP430F449向MSP430F149进行查询;另外也可以通过其他I/O线向MSP430F449提出中断请求,使其作出响应。④ SPI是全双工串行接口,在发送数据的同时也在接收数据,即使对方没有发送数据。比如有时MSP430F449向MSP430F149发送数据时,尽管从机没有数据要送给主机,MSP430F449还是会接收来自MSP430F149的 U1TXBUF寄存器的数据并作数据处理。为了避免主机作无用的工作,当从机没有数据要发送时,可将U1TXBUF寄存器写入0xFF;在MSP430F449收到1帧数据均为0xFF字节的情况下,可不作任何处理。
MSP430F449的SPI通信主要软件流程如图3所示。
图3 MSP430F449的SPI通信流程
在实验中发现,SPI通信作为芯片级的通信,在较好的电磁环境中一般不会发生数据的传输错误,误码率极低;但是为了使命令和数据的发送更为准确,在某些场合UCLK引脚可拉高,以保证通信自始至终UCLK引脚无意外的脉冲引入,可有效避免因异常时钟信号引起误码。在软件中设置合理的波特率和数据帧格式,也可极大提高数据传输的准确性。
RS485通信的帧格式如下:
源地址: 发送该帧数据的单片机地址。
目标地址: 接收该帧数据的单片机地址。
数据长度: 数据帧中,该数据帧携带的数据个数,不包括控制字段和校验码。
校验码: 采用的是CCITT的CRC校验方法,对整个帧(除校验码本身)进行校验,生成多项式为G(X)=x16+x15+x2+1。
3 实际应用与小结
在基于MSP430系列单片机的采集系统中,MSP430F449作为主机,负责数据的存储、键盘控制、液晶显示和远程通信等功能;MSP430F149作为从机,进行数据的采集与分析。二者通过三线主从式的SPI通信进行命令发布与数据交流,硬件电路简单,通信快速、准确,效果良好,可满足工程需要。