专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

MSP430单片机串口通信详解

作者:未知   来源:不详   点击数:  更新时间:2014年08月31日   【字体:
#include"msp430G2553.h"
 
#include "in430.h"
void UartPutchar(unsigned char c);
unsigned char UartGetchar();
unsigned char temp=0;
unsigned char number[2]={0};
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1DIR|=BIT6;
  P1OUT&=~BIT6;
  P1SEL = BIT1 + BIT2;                      // P1.1为 RXD, P1.2为TXD
  P1SEL2 = BIT1 + BIT2;                     // P1.1为 RXD, P1.2为TXD
  UCA0CTL1 |= UCSSEL_2;                     // 选择时钟BRCLK
  UCA0BR0 = 106;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS2 + UCBRS0;               // 波特率=BRCLK/(UBR+(M7+...0)/8)
  UCA0CTL1 &= ~UCSWRST;  
  // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断
  IE2 |= UCA0RXIE;                          // 使能接收中断
 while(1)
  { 
   //UartPutchar(9);
   // display_int(temp,0);
    __delay_cycles(10000);
  }
}
/**********************************UART接收中断*************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  //while (!(IFG2&UCA0TXIFG));                // 等待发送完成
  //UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  temp=UCA0RXBUF;
}
 
/******************************UART发送字节函数*************************/
void UartPutchar(unsigned char c)
{
 while(!(IFG2 & UCA0TXIFG));  //待发送为空
 UCA0TXBUF=c;
 IFG2 &=~UCA0RXIFG;
}
/*********************************UART接收字节数据******************/
unsigned char UartGetchar()
{
  unsigned char c;
  while(!(IFG2 & UCA0RXIFG)); //等待接收完成
  c=UCA0RXBUF;
  IFG2 &=~UCA0TXIFG;
  return c;
}
/******智能控制工作室*******/
   MSP430g2553串口通信
MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。
串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。
一、UART模式
在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。
(一)UART的初始化
单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。
通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL
数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。
接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0才能进行发送。
二、SPI模式
   USTAR下的SPI模式有如下特点
1SPI模式支持3线和4线模式;
2支持主机与从机模式;
3接受和发送有各自独立的发送移位寄存器和缓冲器;
4接受和发送都有独立的中断能力;
 5移位时钟的极性和相位可编程;
6字符长度可以是7位或者8位。
SPI工作在全双工下,即主机发送的同时也接收数据,传输的速率由编程决定。4线SPI模式用附加数据线,允许从机数据的发送和接收。其信号如下: SIMO:从进主出,主机模式下,数据输出;从机模式下,数据输入。SOMI:从出主进,主机模式下,数据输入,从机模式下,数据输出。UCLKUSART SPI模式时钟,信号有主机输出,从机输入。CLK时钟只能由主机提供。STE:从机模式发送接收允许控制脚,用于4线模式。
(一)SPI初始化
SPI当中不需要波特率调整,所以UxMCTL=0x0000SPI的初始化及其复位和UART公用一套寄存器
在初始化或者重新配置USART的SPI时,必须按照以下顺序进行:
1UxCTL寄存器的第0位SWRST置位;
2在SWRST置位的条件下,初始化所有的SPI寄存器,包括UxCTL寄存器;
3通过置位模块使能寄存器MEx的URXEx和UTXEx位使能SPI的接受和发送使能模块;
4通过软件复位UxCTL寄存器的第0位SWRST;
5通过中断使能寄存器IEx的URXIEx和UTXIEx来使能发送和接受中断。
}
三、寄存器及其功能
通信模块寄存器如下:
3.1  USART0的寄存器
寄存器
缩写
读写类型
地址
初始状态
控制寄存器
U0CTL
读/写
070H
PUC后001H
发送控制寄存器
U0TCTL
读/写
71H
PUC后001H
接收控制寄存器
U0RCTL
读/写
72H
PUC后000H
波特率调整控制寄存器
U0MCTL
读/写
73H
不变
波特率控制寄存器0
U0BR0
读/写
74H
不变
波特率控制寄存器1
U0BR1
读/写
75H
不变
接收缓冲器
U0RXBUF
76H
不变
发送缓冲器
U0TXBUF
读/写
77H
不变
SFR 模块使能寄存器1
ME1
读/写
004H
PUC后000H
SFR 模块使能寄存器1
IE1
读/写
000H
PUC后000H
SFR 模块使能寄存器1
IFG1
读/写
002H
PUC后082H
1)控制寄存器UxCTL
控制寄存器内的信息决定了USART的基本操作。如:选择通信协议、通信模式和校验位。在SWRST复位使USART复位操作禁止前,各位应根据选择的模式进行编程。
表3.2  发送控制寄存器UxCTL
含义
使用
7(PENA)
校验允许位
0:校验禁止
1:校验允许
6(PEV)
奇偶校验位
0:奇校验
1:偶校验
5(SP)
停止位选择
0:1位停止位
1:2位停止位
4(CHAR)
字符长度
0:7位
1:8位
3(LISTEN)
反馈选择
(选择是否发送数据由内部反馈给接收器)
0:无反馈
1:有反馈
2(SYNC)
USART模块的模式选择
0:UART模式(异步)
1:SPI模式(同步)
1(MM)
多机模式选择位
0:线路空闲多机协议
1:地址位多机协议
0(SWRST)
控制位(上电置位)
0:USART禁止
1:USART允许
(2)发送控制寄存器UxTCTL(未作说明的位未用)
寄存器UxTCTL控制与发送操作相关的USART硬件。
表3.3  发送控制寄存器UxTCTL
含义
使用
7(CKPH)
时钟相位控制位
0:正常UCLK时钟
1:UCLK时钟延迟半个周期
6(CKPL)
时钟极性控制位
0:UCLKI信号与UCLK信号极性相同
1:UCLKI信号与UCLK信号极性相反
5(SSEL1)
时钟源选择
(确定波特率发生器的时钟源)
00:外部时钟UCLKI
01:辅助时钟ACLK
10:系统时钟MCLK
11:子系统时钟SMCLK
4(SSEL0)
1(STC)
发送控制位
0:SPI为4线模式
1:SPI为3线模式
0(TXEPT)
发送器空标志,在异步模式与同步模式时是不一样的
0:正在传输数据或者发送缓冲器(UTXBUF)有数据
1:表示发送移位寄存器和UTXBUF空或者SWRST=1
(3)接收控制寄存器URCTL
URCTL 控制与接收操作相关的USART硬件并保存由最新写入URXBUF的字符引起的出错状况和唤醒条件。若FE、PE、OE、BRK、RXERR 或 RXWake 的任何一位置位,通过接收下一个字符不能使其复位。它们的复位要通过访问接收缓存URXBUFUSART的软件复位SWRST系统复位PUC或用指令修改。
表3.4  接收控制寄存器URCTL
含义
使用
7(FE)
帧错误标志位
0:无帧错误
1:有帧错误
6(PE)
校验错误标志位
0:校验正确
1:校验错误
5(OE)
溢出标志位
0:无溢出
1:有溢出
4(BRK)
打断检测位
0:未打断
1:打断
3(URXEIE)
接收出错中断允许位
0:禁止中断,不接收出错字符,不改变URXIFG标志
1:允许中断,接收出错字符,置位URXIFG标志
2(URXWIE)
接收唤醒中断允许位
0:接收的所有字符都能够置位URXIFG
1:只有接收到地址字符才置位URXIFG
1(RXWake)
接收唤醒检测位
0:未被唤醒,接收到的字符是数据
1:唤醒,接收的字符是地址
0(RXERR)
接收错误标志位
0:未接收到错误
1:接收到错误
在各种条件下URXEIE和URXWIE对URXIFG的影响:
URXEIE
URXWIE
字符出错
地址字符
接收字符后的标志位URXIFG
0
X
1
X
不变
0
0
0
X
置位
0
1
0
0
不变
0
1
0
1
置位
1
0
X
X
置位( 接收所 有字符)
1
1
X
0
不变
1
1
X
1
置位
(4)波特率选择寄存器和调制控制寄存器
波特率产生器利用波特率选择寄存器UxBR1和UxBR0,以及调整控制寄存器UxMCTL来产生串行数据流的位定时。UxBR0UxBR1这两个寄存器是用于存放波特率分频因子的整数部分,若波特率发生器的输入频率BRCLK不是所需波特率的整数倍,带有小数,则整数部分写入UxBR寄存器,小数部分则由调整寄存器UxMCT的内容反映。波特率由以下公式计算:
波特率=BRCLK/(UBR+(M7+M6+ …M0)/8)
寄存器各位如下:
 位
寄存器
7
6
5
4
3
2
1
0
UxBR0
UxBR1
UxMCT
M7
M6
M5
M4
M3
M2
M1
M0
(5)接收数据缓存URXBUF
7
6
5
4
3
2
1
0
 
接收缓存存放移位寄存器最后接收的字符,可由用户访问,读接收缓存可以复位接收时产生的各种错误标志、RXWAKE位和URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0。当收接和控制条件为真时,接收缓存装入当前接收到的字符。
条件
结果
URXEIE
URXWIE
装入URXBUF
PE
FE
BRK
0
1
无差错地址字符
0
0
0
1
1
所有地址字符
X
X
X
0
0
无差错字符
0
0
0
1
0
所有字符
X
X
X
(6)发送数据缓存UTXBUF
7
6
5
4
3
2
1
0
 
发送缓存含有当前要由发送器发送的数据。UTXIFG 标志表示UTXBUF已准备好接收下一个要发送的字符。将数据写入UTXBUF初始化发送功能。如果发送移位寄存器为空或即将为空,数据的发送立即开始。只有当UTXBUF为空时,数据才能写入缓存,否则可能发送不可预料的字符。
 
表1.1  MSP430G2553引脚功能表
引脚号
引脚名
引脚功能描述
1
DVCC
接电源
2
DVSS
接地
3
P1.0
通用I/O口、ADC10模拟输入A0(1) 、Comparator_A+,CA0输入、TIMER _A时钟信号TACLK输入、ACLK信号输出
4
P1.1/RXD
通用I/O 口、Timer0_A,捕捉:CCI0A输入,比较:Out0输出/ BSL发送、UART模式中USCI_A0接收数据输入、SPI模式中USCI_A0受控器数据输出/主控器输入、ADC10模拟输入A1 、Comparator_A+,CA1输入
5
P1.2/TXD
通用I/O 口、Timer0_A,捕获:CCI1A输入,比较:Out1输出、UART模式中USCI_A0发送数据输出、SPI 模式中USCI_A0受控器数据输入/主控器输出、ADC10模拟输入A2、Comparator_A+,CA2输入
6
P1.3
通用I/O 口、ADC10,转换时钟输出(1)、ADC10模拟输入A3、ADC10负基准电压、Comparator_A+,CA3输入、Comparator_A+,输出
7
P1.5
通用I/O 口、Timer0_A,比较:Out0输出/ BSL接收、USCI_B0时钟输入/输出、USCI_A0受控器发送使能、ADC10模拟输入A5、Comparator_A+,CA5输入、JTAG测试模式选择输入终端
8
P2.0
通用I/O 口、Timer1_A,捕获:CCI0A输入,比较:Out0输出
9
P2.1
通用I/O 口、Timer1_A,捕获:CCI1A输入,比较:Out1输出
10
P2.2
通用I/O 口、Timer1_A,捕获:CCI1B输入,比较:Out1输出
11
P2.3
通用I/O 口、Timer1_A,捕获:CCI0B输入,比较:Out0输出
12
P2.4
通用I/O 口、Timer1_A,捕获:CCI2A输入,比较:Out2输出
13
P2.5
通用I/O 口、Timer1_A,捕获:CCI2B输入,比较:Out2输出
14
P1.6
通用I/O 口、Timer0_A,比较:Out1输出、、ADC10模拟输入A6、Comparator_A+,CA6输入、SPI模式中USCI_B0受控器输出/主控器输入、I2C 模式中的USCI_B0SCLI2C 时钟、JTAG测试数据输入或测试时钟输入
15
P1.7
通用I/O 口、ADC10模拟输入A7、Comparator_A+,CA7输入、Comparator_A+,输出、SPI模式中的USCI_B0受控器输入/主控器输出、I2C 模式中的USCI_B0SDAI2C 数据输入、JTAG测试数据输出终端或测试数据输入
16
RST
复位、不可屏蔽中断输入、编程及测试期间的两线制(Spy-Bi-Wire) 测试数据输入/输出
17
TEST
为端口1上JTAG引脚选择测试模式、器件保护熔丝连接至TEST、编程及测试期间的Spy-Bi-Wire测试时钟输入
18
P2.6/XOUT
晶体振荡器的输出终端、通用I/O 口
19
P2.7/XIN
晶体振荡器的输入终端、通用I/O 口、Timer0_A,比较:Out1输出
20
DVSS
接地
 
 
关闭窗口