MSP430的不同型號,其串行通訊工作模式是一樣的。以MSP430G2553為例進行說明。MSP430G2553是20個引腳的16位單片機。具有內置的16位定時器、16k的FLASH和512B的RAM,以及一個通用型模擬比較器以及采用通用串行通信接口的內置通信能力。此外還具有一個10位的模數(A/D)轉換器。這里我們詳細說明MSP430G2553串口通信。其引腳排布如圖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模式有如下特點:
1、SPI模式支持3線和4線模式;
2、支持主機與從機模式;
3、接受和發送有各自獨立的發送移位寄存器和緩沖器;
4、接受和發送都有獨立的中斷能力;
5、移位時鐘的極性和相位可編程;
6、字符長度可以是7位或者8位。
SPI工作在全雙工下,即主機發送的同時也接收數據,傳輸的速率由編程決定。4線SPI模式用附加數據線,允許從機數據的發送和接收。其信號如下: SIMO:從進主出,主機模式下,數據輸出;從機模式下,數據輸入。SOMI:從出主進,主機模式下,數據輸入,從機模式下,數據輸出。UCLK:USART SPI模式時鐘,信號有主機輸出,從機輸入。CLK時鐘只能由主機提供。STE:從機模式發送接收允許控制腳,用于4線模式。
(一)SPI初始化
SPI當中不需要波特率調整,所以UxMCTL=0x0000,SPI的初始化及其復位和UART公用一套寄存器。
在初始化或者重新配置USART的SPI時,必須按照以下順序進行:
1、UxCTL寄存器的第0位SWRST置位;
2、在SWRST置位的條件下,初始化所有的SPI寄存器,包括UxCTL寄存器;
3、通過置位模塊使能寄存器MEx的URXEx和UTXEx位使能SPI的接受和發送使能模塊;
4、通過軟件復位UxCTL寄存器的第0位SWRST;
5、通過中斷使能寄存器IEx的URXIEx和UTXIEx來使能發送和接受中斷。
三、寄存器及其功能
(1)控制寄存器UxCTL
控制寄存器內的信息決定了USART的基本操作。如:選擇通信協議、通信模式和校驗位。在SWRST復位使USART復位操作禁止前,各位應根據選擇的模式進行編程。
(2)發送控制寄存器UxTCTL(未作說明的位未用)
寄存器UxTCTL控制與發送操作相關的USART硬件。
?。?)接收控制寄存器URCTL
URCTL 控制與接收操作相關的USART硬件并保存由最新寫入URXBUF的字符引起的出錯狀況和喚醒條件。若FE、PE、OE、BRK、RXERR 或 RXWake 中的任何一位置位,通過接收下一個字符不能使其復位。它們的復位要通過訪問接收緩存URXBUF、USART的軟件復位SWRST、系統復位PUC或用指令修改。
?。?)波特率選擇寄存器和調制控制寄存器
波特率產生器利用波特率選擇寄存器UxBR1和UxBR0,以及調整控制寄存器UxMCTL,來產生串行數據流的位定時。UxBR0、UxBR1這兩個寄存器是用于存放波特率分頻因子的整數部分,若波特率發生器的輸入頻率BRCLK不是所需波特率的整數倍,帶有小數,則整數部分寫入UxBR寄存器,小數部分則由調整寄存器UxMCT的內容反映。波特率由以下公式計算:
波特率=BRCLK/(UBR+(M7+M6+ …M0)/8)
接收緩存存放移位寄存器最后接收的字符,可由用戶訪問,讀接收緩存可以復位接收時產生的各種錯誤標志、RXWAKE位和URXIFGx位。如果傳輸7位數據,接收緩存內容右對齊,最高位為0。當收接和控制條件為真時,接收緩存裝入當前接收到的字符。
發送緩存含有當前要由發送器發送的數據。UTXIFG 標志表示UTXBUF已準備好接收下一個要發送的字符。將數據寫入UTXBUF初始化發送功能。如果發送移位寄存器為空或即將為空,數據的發送立即開始。只有當UTXBUF為空時,數據才能寫入緩存,否則可能發送不可預料的字符。
例子:
#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 (?。↖FG2&UCA0TXIFG)); // 等待發送完成
//UCA0TXBUF = UCA0RXBUF; // TX -》 RXed character
temp=UCA0RXBUF;
}
/******************************UART發送字節函數*************************/
void UartPutchar(unsigned char c)
{
while(?。↖FG2 & UCA0TXIFG)); //待發送為空
UCA0TXBUF=c;
IFG2 &=~UCA0RXIFG;
}
/*********************************UART接收字節數據******************/
unsigned char UartGetchar()
{
unsigned char c;
while(?。↖FG2 & UCA0RXIFG)); //等待接收完成
c=UCA0RXBUF;
IFG2 &=~UCA0TXIFG;
return c;
}
/******智能控制工作室*******/
評論