本帖最后由 Shuyang 于 2019-3-5 13:48 编辑
7.3 USCI的UART模式
MSP430的串行通信外设叫做USCI(universal serialcommunication interface)。USCI又分为两个版本,USCI_A和USCI_B。USCI_A可配置为UART、LIN、IrDA、SPI模式。USCI_B可配置为SPI和I2C模式。MSP430G2553单片机中带1个USCI_A模块和一个USCI_B模块。
用USCI模块实现UART其实很简单,只要配置好初始化参数之后,将要发送的数据写入发送缓冲器TXBUF,或是从接收缓冲期RXBUF中读取收到的数据即可。
7.3.1 USCI_A UART的配置流程
MSP430单片机上电以后,单片机会自动将USCI的复位控制位UCSWRST置为1。这个操作将自动将USCI中断相关的寄存器(包括UCAxRXIE、UCAxTXIE、UCAxRXIFG、UCRXERR、UCBRK、UCPE、UCOE、UCFE、UCSTOE及UCBTOE)复位。我们在使用USCI模块前要手动将UCSWRST置0,然后USCI模块才能正常工作。对USCI进行配置的推荐流程如下。
1) 令UCSWRST=1,对USCI模块进行复位; 2) 改写相关寄存器(UCAxCTL0、UCAxCTL1等),对USCI进行初始化; 3) 配置相关I/O口(MSP430G2553中P1.1/UCA0RXD和P1.2/UCA0TXD); 4) 令UCSWRST=0; 5) 配置UCAxRXIE和UCAxTXIE寄存器,使能USCI中断。
7.3.2 USCI_A UART初始化
对USCI_A模块进行初始化是通过UCAxCTL0和UCAxCTL1这两个寄存器进行的。一般来说,UART数据位设为8位,奇偶校验不选,停止位设为1位。另外需要设置好时钟来源和波特率。
再来看UCAxCTL1的定义:
1) 配置数据帧格式
我们将数据位设为8位,奇偶校验不选,停止位设为1位。通过上面的寄存器定义可以看出,只要UCAxCTL0和UCAxCTL1全部保持默认即可。其中只有UCSSELx与时钟有关,我们稍后再来介绍。
2) 时钟选择
我们将数据位设为8位,奇偶校验不选,停止位设为1位。通过上面的寄存器定义可以看出,只要UCAxCTL0和UCAxCTL1全部保持默认即可。其中只有UCSSELx与时钟有关,我们稍后再来介绍。
USCI模块的时钟BRCLK可以从MCLK、SCMLK和ACLK中选择。需要注意的是BRCLK的频率与通信波特率有关。如果使用MCLK或SMCLK,可以获得比较高的波特率;但如果使用ACLK,可以获得更低的功耗,这是因为只有在使用ACLK时才能进入更低功耗的LPM3模式。一般来说如果使用32.768kHz的晶振时,最高的波特率是9600。
3) 波特率设置
波特率(Baud rate)是指数据传输的速率(即载波频率)。最常用的标准波特率是110、300、1000、1200、2400、4800、9600、19200及115200。
在USCI模块中,波特率是通过时钟BRCLK得来的。USCI模块中的寄存器UCAxBR0、UCAxBR1和UCAxMCTL负责从不同的时钟频率下产生标准的波特率。
UCOS16可以控制调至模块的两种模式,分别为低频模式和高频模式。一般比较常用的是低频模式。在此模式下波特率和时钟频率的关系由下面公式计算:
算出来的N往往不是整数。不过没关系,UCBRx和UCBRSx分别负责表示N的整数部分和小数部分,以近似得到最接近的波特率。算得N之后,可以分别得到UCBRx和UCBRSx的值如下:
UCBRx= INT(N) UCBRSx= round( ( N-INT(N) ) x 8 )
其中,INT(N)表示N的整数部分,round()表示对括号里的数进行四舍五入。
通过以上关系式,我们可以得出在常用的时钟频率和波特率情况下,寄存器设置值如下表所示。
例如使用32.768kHz晶振情况下,如果想要设置波特率为9600,通过上式分别计算出UCBRx=3和UCAxMCTL=3,寄存器配置代码如下: - UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
- UCA0BR1 = 0x00;
- UCA0MCTL = 0x06; // Modulation UCBRSx = 3
复制代码
7.3.3 收发数据
使用USCI模块来收发数据只需读写接收缓冲器UCAxRXBUF和发送缓冲期UCAxTXBUF就可以了。
当UCAxRXBUF接收到完整数据后,会触发UCAxRXIFG中断标志位,表明CPU应尽快将UCAxRXBUF中的数据“取走”,否则将会被下一次进来的数据覆盖掉。在程序中需要使能Rx中断。
将数据写入UCAxTXBUF寄存器,USCI模块会自动把数据发出去。当UCAxTXBUF为空时(数据已移入移位寄存器,可以不管了),触发UCAxTXIFG中断标志位,表明可以往UCAxTXBUF里面放下一个数据了。Tx中断同样需要在程序中使能。
7.3.4 使用UART和电脑通信
使用UART协议可以和电脑进行通信,接收电脑键盘的输入并发送数据在电脑屏幕上显示。MSP430G2553LaunchPad的USB口带有虚拟串口功能,可以通过USB接口虚拟串口,与电脑连接。
要在电脑上读取串口数据,还需要一个串口调试软件。市面上有很多类似的软件,在这里推荐使用PuTTY,它是一个免费软件,下载链接为 www.putty.org。
在LaunchPad上,我们需要将右侧5个跳线帽中左边2个横过来插,这样就可以使能硬件UART。
接好跳线帽后将LaunchPad通过USB线与电脑连接,然后需要确定LaunchPad的虚拟串口在电脑上的端口号。打开设备管理器,在Ports(COM& LPT)下找到MSP430 Application UART,后面括号中的COMx就是端口号。把这个端口号记下来,稍后会用到。
下面打开PuTTY软件,在软件中选择Serial,在Serial line中填入刚才记下来的端口号,在Speed一栏填写波特率,然后点击“Open”,就可以打开串口调试界面。
打开后会看到一个命令行界面,现在就可以与LaunchPad进行通信了。用电脑键盘输入字符,会以ASCII码的形式发给单片机,单片机发过来的数据也会显示在调试窗口中。ASCII码和字符的转换表请见 www.asciitable.com。
|