msp430中如何连续对位进行取反_MSP430系列通用串行通信模块的异步模式
2022-09-19 来源:csdn
1、MSP430串行通信概述
串口是系统与外界联系的重要手段,在嵌入式系统开发和应用中,经常需要使用上位机实现系统调试及现场数据的采集和控制。一般是通过上位机本身配置的串行口,通过串行通信技术,和嵌入式系统进行连接通信。
MSP430系列的每一种型号都可以实现串行通信功能:USART硬件直接实现。
片内具有硬件USART模块的MSP430系列单片机,由于系列不同片内可以包含一个USART模块(USART0),还可以包含多个USART模块(USART0、USART1、USART2)。USART模块可以自动从任何一种低功耗模式LPMx开始自动工作。所有USART0和USART1都可以实现两种通信方式:UART异步通信和SPI同步通信。另外,MSP430X15/16X系列单片机的USART0还可以实现I2C通信。其中,UART异步通信和SPI同步通信的硬件是通用的,经过适当的软件设计,这两种通信方式可以交替使用。
USART模块结构如图1所示。该模块包含4个部分:
波特率部分,控制串行通信数据接收和发送的速度。
接收部分,接收串行输入的数据。
发送部分,发送串行输出的数据。
接口部分,完成并/串、串/并转换。
图1:USART模块结构图
2、异步操作
MSP430串行异步通信模式通过两个引脚,即接收引脚URXD发送引脚UTXD与外界相连。
串行异步通信特点如下:
异步模式,包括线路空闲/地址位通信协议。
两个独立移位寄存器:输入移位寄存器和输出移位寄存器。
传输7位或8位数据,可采用奇校验或偶校验或者无校验。
从最低位开始的数据发送和接收。
可编程实现分频因子为整数或小数的波特率。
独立的发送和接收中断。
通过有效的起始位检测将MSP430从低功耗唤醒。
状态标志检测错误或者地址位。
2.1 异步通信字符格式
异步通信字符格式由4部分组成:起始位、数据位、奇偶校验位和停止位,如图2所示。其中用户可以通过软件设置数据位、停止位的位数,还可以设置奇偶位的有无。通过选择时钟源和波特率寄存器的数据来确定位周期。
图2:异步操作的字符格式
接收操作以收到有效起始位开始。起始位由检测URXD端口的下降沿开始,然后以3 次采样多数表决的方法取值。如果3次采样至少两次是0才表明是下降沿,然后开始接收初始化操作,这一过程实现错误起始位的拒收和帧中各数据的中心定位功能。MSP430可以处于低功耗模式,通过上述过程识别正确起始位之后,MSP430可以被唤醒,然后按照通用串行接口控制寄存器中设定的数据格式,开始接收数据,直到本帧采集完毕。
异步模式下,传送数据是以字符为单位来传送的。因为每个字符在起始位处可以通过起始位判别重新定位,所以传送时多个字符可以一个接一个地连续传送,也可以断续传送。并且同步时钟脉冲不传送到接收方,发、收双方各用自己的时钟源来控制发送和接收。
2.2 异步多机通信模式
在异步模式下,USART支持两种多机通信模式,即线路空闲和地址位多机模式。信息以一个多帧数据块,从一个指定的源传送到一个或多个目的位置。在同一个串行链路上,多个处理机之间可以用这些格式来交换信息,实现了在多处理机通信系统间的有效数据传输。它们也用于使系统的激活状态压缩到最低,以节省电流消耗或处理所用资源。控制寄存器的MM位用来确定这两种模式。这两种模式采用唤醒发送、地址特性(TXWake位) 和激活(RXWake位)等功能。URXWIE和URXIE位控制这些模式的发送和接收。USART可以识別数据块的起始,并能抑止接收端处理中断和状态信息,直到数据块的起始被识别。 在两种多处理机模式下USART数据交换过程可以用数据査询方式或中断方式来实现。
(1)线路空闲多机模式
在这种模式下,数据块被空闲时间分隔。在字符的第一个停止位之后,收到10个以上的1,则表示检测到接收线路空闲,如图3所示。
如果采用两位停止位,则第二个停止位被认为空闲周期的第一个标志。空闲周期的第一个字符是地址字符。RXWAKE位可用于地址字符的标志。当接收到的字符是地址字符时,RXWAKE被置位,并送入接收缓存。
图3:线路空闲多机模式
通常,如果接收控制寄存器的URXWIE置位,则字符在接收端以通常的方法组成字节,但并不将该字符移送接收缓存,也不产生中断;只有当接收到地址字符时,接收器才被激活,字符才被送达接收缓存,同时产生中断标志URXIFG=1。相应的错误标志也会被置位。应用软件可以收到地址,如果匹配,则处理:如果不匹配,则继续等待下一个地址字符的到来。
用发送空闲帧来识别地址字符的步骤如下:
TXWAKE=1,将任意数据写入UTXBUF(UTXIFG=1)。当发送移位寄存器为空时 (TXEPT=1), UTXBUF的内容将被送入发送移位寄存器,同时TXWAKE的值移入WUT。
如果此时WUT=1,则要发送的起始位、数据位及校验位等被抑制,发送一个正好11位的空闲周期。
在地址字符识别空闲周期后移出串行口的下一个数据是TXWAKE置位后写入UTXBUF中的第二个字符。当地址识别被发送后,写入UTXBUF中的第一个字符被抑制,并在以后被忽略。这时需随便往UTXBUF中写入一个字符,以便能将TXWAKE的值移入WUF中。
当有多机进行通信时,应该充分利用线路空闲多机模式,使用此模式可以使多机通信的CPU在接收数据之前首先判断地址,如果地址与自己软件中设定的一致,则CPU被激活接收下面的数据;如果不一致,则保持休眠状态。这样可以最大限度地降低UART的消耗。
(2)地址位多机模式
地址位多机模式的格式如图4所示。在这种模式下,字符包含一个附加的位作为地址标志。数据块的第一个字符带有一个置位的地址位,用以表明该字符是一个地址。当接收字符是地址时,RXWAKE置位,并且将接收的字符送入接收缓存URXBUF (当接收被允许时)。
图4:地址位多机模式
在USART的URXWIE=1时,数据字符在通常方式的接收器内拼装成字节,但它们不会被送入接收缓存,也不产生中断。只有当接收到一个地址位为1的字符时,接收器才被激活,接收到的字符被送往URXBUF,同时URXIFG被置位。如果有错误,则相应的错误标志被设置。应用软件在判断后作出相应的处理。在地址位多机模式下,通过写TXWAKE位控制字符的地址位。每当字符由UTXBUF传送到发送器时,TXWAKE位装入字符的地址位,再由USART将TXWAKE位清除。
2.3 串行操作自动错误检测
USART模块接收字符时,能够自动进行校验错误、帧错误、溢出错误和打断状态检测。 各种检测错误的含义和标志如下:
FE:标志帧错误。当一个接收字符的停止位为0并被装入接收缓存,接收的为一个错误的帧,那么帧错误标志被设置成1,即使在多停止位模式时也只检测第一个停止位。同样,丢失停止位意味着从起始位开始的同步特性被丧失,也是一个错误帧。在同步的4线模式时,因总线冲突使有效主机停止,并在STE引脚信号出现下降沿时使FE位设置为1。
PE:奇偶校验错误。当接收字符中1的个数与它的校验位不相符,并被装入接收缓存时,发生校验错误,设置PE为1。
OE:溢出错误标志。当一个字符写入接收缓存URXBUF时,前一个字符还没有被读出,这时前一个字符因被覆盖而丢失,发生溢出(同步与异步情况相同)。
BRK:打断检测标志。当发生一次打断同时URXEIE置位时,该位被设置为1,表示接收过程被打断过。RXD线路从丢失的第一个停止位开始连续出现至少10位低电平被识别为打断。
当上述任何一种错误出现,位RXERR置位,表明有一个或多个出错标志(FE、PE、OE和BRK等)被置位。
如果URXEIE=0并且有错误被检测到,那么接收缓存不接收任何数据。如果 URXEIE=1,接收缓存接收字符,相应的错误检测标志置位,直到用户软件复位或者接收缓存内容被读出时,才能复位。
2.4 波特率的产生
在异步串行通信中,波特率是很重要的指标,它一般表示为每秒钟传送二进制数码的位数。波特率反映了异步串行通信的速度。所以在进行异步通信时,波特率的产生是必须的。波特率发生器产生同步信号表明各位的位置。波特率部分由时钟输入选择和分频、波特率发生器、调整器和波特率寄存器等组成。串行通信时,数据接收和发送的速率就由这些构件控制,如图5所示。
图5:波特率发生器框架
幣个模块的时钟源來自内部3个时钟或外部输入时钟,由SSEL1和SSEL0选择,以决定最终进入模块的时钟信号BRCLK的频率。时钟信号BRCLK送入一个15位的分频器,通过一系列的硬件控制,最终输出两移位寄存器使用的移位时钟BITCLK信号。这个信号(BITCLK)的产生,由图5的下半部分可以看出,是分频器在起作用。当计数数器减计数到0时,输出触发器翻转,送给BITCLK信号周期的一半就是定时器(分频计数器)的定时时间。
下面介绍波特率的设置与计算。采集每位数据的时候,在每位数据的中间都要进行3次采样,以多数表决的原则进行数据标定和移位接收操作,如此依次采集。由此看出,分频因子要么很大,要么是整数,否则,由于采集点的积累偏移,会导致每帧后面的几位数据采样点不在其数据的有效范围内。
MSP430的波特率发生器使用一个分频计数器和一个调整器,能够用低时钟频率实现高速通信,从而在系统低功耗的情况下实现髙性能的串行通信。使用分频因子加调整的方法可以实现每一帧内的各位有不同的分频因子,从而保证每个数据中的3个采样状态都处于有效的范围内。
分频因子N由送到分频计数器的时钟(BRCLK)频率和所需的波特率来决定:
N = BRCLK/波特率
如果使用常用的波特率与常用晶体产生的BRCLK,则一般得不到整数的N,还有小数部分。分频计数器实现分频因子的整数部分,调整器使得小数部分尽可能准确。分频因子定义如下:
N=UBR + (M7+M6+...+M0) /8
其中:N为目标分频因子;UBR为UxBR0中的16位数据值;Mx力调整器寄存器 (UxMTCL)中的各数据位。
波特率可由下式汁算:
波特率 = BRCLK/N = BRCLK/ (UBR+ (M7+M6+...+M0) /8 )
波特率发生器可以简化为图6所示,由分频器与调整器组成。分频器完成分频功能,调整器的数据按每一位计算,将对应位的数据(0或1)加到每一次分频汁数器的分频值上。
图6:波特率发生器简图
关于调整器的工作原理,下面通过实际波特率的例子来说明。
例1 BRCLK=32768Hz,要产生 BITCLK=2400Hz,分频器的分频系数为 32768/2400 = 13.65。所以设置分频器的计数值为13。接下来用调整寄存器的值来设置小数部分的0.65。调整器是一个8位寄存器,其中每一位分别对应8次分频情况,如果对应位为0,则分频器按照设定的分频系数分频计数;如果对成位为1,则分频器按照设定的分频系数加1分频计数。按照这个原则,0.65X8=5,也就是说,8次分频计数过程中应该有5次加1计数,3次不加1计数。调整寄存器的数据由5个1和3个0组成。调整器的数据每8次周而复始循环使用,最低位最先调整,比如设置调整寄存器的值为6BH (01101011),当然也可以设置其他值,必须有5个1,而且5个2要相对分散。即分频器按顺序13、14、14、13、14、13、14、14来分频。在8位调整器调整位都使用后,再重复这一顺序。
例2 BRCLK=1.04MHz,要产生BITCLK=19200Hz,分频器的分频系数为54.61。MSP430 的USART采用分频因子54(36H)加上调整寄存器加载D5H来产生波特率,即分频器按顺序55、54、55、54、55、54、55、55、…来分频。在8位调整器整位都使用后,再重复这一顺序。
图7中列出了 ACLK=32768Hz, MCLK为32倍ACLK时,标准波特举所需的波特率寄存器和调整寄存器的数值。同时列出了接收时的误差。
图7:常用波特率及其对应设置参数与对应误差表
2.5 异步方式的中断
USART模块有接收和发送两个独立的中断源。使用两个独立的中断向量,一个用于接收中断事件,一个用于发送中断事件。USART模块的中断控制位位于特殊功能寄存器中,MPS430F4XX系列USART异步方式中断控制位如图8、9所示。
图8:MSP430F4XX系列USART0异步方式中断控制位
图9:MSP430F4XX系列USART1异步方式中断控制位
注意:MSP430X1XX系列USART异步方式中断控制位与特殊功能寄功器的对应关系和MSP430F4XX系列存在差别。
MSP430的异步收发器是完全独立操作的,但使用同一个波特率发生器,则接收器和发送器使用相同的波特率。
接收允许位URXE的置位或复位,将设置允许或禁止接收器从URXD数据线路接收数据。当禁止接收时,如果已经开始一次接收操作,则会在完成后停止下一•次 接收操作;如果无接收操作,则在进行中立即停止接收操作,连起始位的检测也 被禁止。
发送允许位UTXE的置位或复位,将设置允许或禁止发送器将串行数据数发送到线路。
当UTXE=0时,己被激活的发送并不停止操作,而将在完成发送已经写入发送缓存内的全部数据后被禁止。在UTXE=0之前写入发送缓存的数据有效。也就是说,当UTXE复位时,虽然发送缓存可写入数据,但数据不发送到串行线路。而一旦UTXE被置位,缓存内的数据立即发送到线路。
每当接收到字符,且装入接收缓存时,接收中断标志URXIFG被置位。此时可将数据由接收缓存取出。
3、异步通信寄存器
硬件USART方式实现串行通信时,允许7或8位串行位流以预先编程的速率或外部时钟确定的速率输入、输出MSP430。用户对USART的使用是通过对硬件原理和通信协议(UART异步通信协议,SPI同步通信协议和I2C协议)理解下,在一系列寄存器设置之后,由硬件自动实现数据的输入输出。
MSP430器件中有的型号有两个通信硬件模块USART0和USART1,因此它们有两套寄存器。
图10:USART0的寄存器
图11:USART1的寄存器
下面依次介绍各寄存器(x表示0和1)。
3.1 UxCTL 控制寄存器
USART模块的基本操作由此寄存器的控制位决定。各位定义如下:
PENA 校验允许位。
0 校验禁止;
1 校验允许。
校验允许时,发送端发送校验,接收端接收该校验。地址位多机模式中,地址位包含校验操作。
PEV 奇偶校验位,该位在校验允许时有效。
0 奇校验;
1 偶校验。
SPB 停止位选择。决定发送的停止位数,但接收时接收器只检测1位停止位。
0 1位停止位;
1 2位停止位。
CHAR 字符长度。
0 7位;
1 8位。
LISTEN 反馈选择。选择是否将发送数据由内部反馈给接收器。
0 无反馈;
1 有反馈,发送信号由内部反馈给接收器。
SYNC USART模块的模式选择。
0 UART模式(异步);
1 SPI模式(同步)。
MM 多机模式选择位。
0 线路空闲多机协议;
1 地址位多机协议。
SWRST 控制位。该位的状态影响着其他一些控制位和状态位的状态。在串行口的使用过程中,这一位是比较重要的控制位。一次正确的USART模块初始化应该是这样的顺 序:先在SWRST=1的情况下设置串口;然后设置SWRST=0;最后如果需要中断,则设置相应的中断使能。
3.2 UxTCTL 发送控制寄存器
该寄存器的各位定义如下(其中BIT1和BIT7两位在UART模式下没有用到):
CKPL 时钟极性控制位
0 UCLKI信号与UCLK信号极性相同;
0 UCLKI信号与UCLK信号极性相反;
SSEL1,SSEL0 时钟源选择位。这两位确定波特率发生器的时钟源。
0 外部时钟UCLKI;
1 辅助时钟ACLK;
2 子系统时钟SMCLK;
3 子系统时钟SMCLK。
URXSE 接收触发沿控制位。
0 没有接收触发沿检测;
1 有接收触发沿检测。
TXWAKE 传输唤醒控制。
0 下一个要传输的字符为数据;
1 下一个要传输的字符是地址。
TXEPT 发送器空标志。在异步模式与同步模式时不一样。
0 正在传输数据或者发送缓冲器(UTXBUF)有数据;
1 表示发送移位寄存器和UTXBUF空或者SWRST=1。
3.3 URCTL 接收控制寄存器
各位定义如下:
FE 帧错误标志位。
0 没有帧错误;
1 帧错误。
PE 校验错误标志位
0 校验正确;
1 校验错误。
OE 溢出标志位。
0 无溢出;
1 有溢出。
BRK 打断检测位。
0 没有被打断;
1 被打断。
URXEIE 接收出错中断允许位。
0 不允许中断,不接收出错字符并且不改变URXIFG标志位;
1 允许中断,出错字符接收并且能够置位URXIFG。
URXWIE 接收唤醒中断允许位,当接收到地址字符时,该位能够置位URXIFG,当URXEIE=0,如果接收内容有错误,该位不能置位URXIFG。
0 所有接收的字符都能够置位URXIFG;
1 只有接收到地址字符才能置位URXIFG。
图12说明了在各种条件下URXEIE和URXWIE对URXIFG的影响。
图12:在各种条件下URXEIE和URXWIE对URXIFG的影响
RXWAKE 接收唤醒检测位。在地址位多机模式,接收字符地址位置位时,该机呗唤醒,在线路空闲多机模式,在接收到字符前检测到URXD线路空闲时,该机被唤醒,RXWAKE被置位。
0 没有被唤醒,接收到的字符是数据;
1 唤醒接的字符是地址。
RXERR 接收错误标志位。
0 没有接收错误;
1 有接收错误。
3.4 UxBR0 波特率选择寄存器0
3.5 UxBR1 波特率选择寄存器1
UxBR0和UxBR1两个寄存器用于存放波特率分频因子的整数部分。其中UxBR0为低字节,UxBR1为高字节。两字节合起来为一个16位字,称为UBR。在异步通信时,UBR的允许值不小于3,即3≤UBR<0FFFFh。如果UBR<3,则接收和发送会发生不可预测的错误。
3.6 UxMCTL 波特率调整控制寄存器
如果波特率发生器的输入频率BRCLK不是所需波特率的整数倍,带有一小数,则整数部分写入UBR寄存器,小数部分由调整控制寄存器UxMCTL的内容反映。波特率由以下公式计算:
波特率 = BRCLK/(UBR +(M7+M6+...M0)/8)
其中M0,M1,...,M6及M7为调整控制寄存器UxMCTL中的各位。调整寄存器的8位分别对应8次分频,如果MI=1,则相应次的分频增加一个时钟周期;如果MI=0,则分频计数值不变。
3.7 URXBUF 接收数据缓存
接收缓存存放从接收移位寄存器最后接收的字符,可由用户访问。读接收缓存可以复位接收时产生的各种错误标志、RXWAKE位URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0。
当接收和控制条件为真时,接收缓存装入当前接收到的字符,如图13所示。
图13:当接收和控制条件为真时接收数据缓存结果
3.8 UTXBUF 发送数据缓存
发送缓存内容可以传送至发送移位寄存器,然后由UTXDx传输。对发送缓存进行写操作可以复位UTXIFGx。如果传输7位数据,发送缓存内容最高位为0。
4、异步操作应用举例
例: MSP430F149在ACLK = LFXT1 = 32768Hz,MCLK=SMCLK = UCLK0 = DCOCLK = 1048576Hz频率驱动下以115200波特率异步串行通信,采用中断方式接收并发送接收到的数据。
计算波特率分频因子:1048576Hz/115200~9.1(009h|08h)。
相关程序如下:
/*************main程序*************/
#include
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP14PF;
UTCTL0 = SSEL1; //UCLK = SMCLK
UBR00 = 0x09; //在1MHz下进行115200波特率通信
UBR10 = 0x00; //在1MHz下进行115200波特率通信
UMCTL0 = 0x0A; //波特率调整
UCTL0 = CHAR; //8位character *SWRST*
ME1 |= UTXE0 + URXE0; //使能USART0 TXD/RXD
IE1 |= URXIE0; //使能USART0 RX中断
P2SEL |= 0x30; //P2.4,5用作USART0 的TXD/RXD
P2DIR |= 0x10; //P2.4输出
_EINT( );
for ( ; ; )
{
_BIS_SR(CPUOff); //进入LPM0
_NOP( );
}
}
/*************中断接收程序*************/
#pragma vector = UART0RX_VECTOR
__interrupt void USART0_RX(void)
{
while ((IFG1 & UTXIFG0) == 0); //USART0接收缓存有数据吗?
TXBUF0 = RXBUF0; //读出接收到的数据
}
同理,当ACLK = UCLK0 = LFXT1 = 32768Hz,MCLK = SMCLK = DCO~800K,波特率为2400时,试下上述同样功能,只需改变相关波特率寄存器设置:
UBR00 = 0x0D; //32K/2400=13.65
UBR10 = 0x00;
UMCTL0 = 0x6B; //波特率调整
同理,当ACLK = LFXT1 = 32768Hz,MCLK = SMCLK =UCLK0 = DCOCLK = 1048576Hz,波特率为9600时,相关波特率寄存器设置:
UBR00 = 0x0D; //1048576Hz/9600大约为109.23
UBR10 = 0x00; //1MHz 9600
UMCTL0 = 0x81; //波特率调整