第十章通用非同步收發傳輸器 (UART) 10.1 結構介紹 10.2 內部暫存器 10.3 初始化流程 10.4 UART 傳輸實驗 10.4.1 實驗目的 10.4.2 實驗設備 10.4.3 實驗描述 10.4.4 接線步驟 10.4.5 程式流程圖 10.4.6 程式碼 10.4.7 實驗結果
10.1 結構介紹 圖 10.1 為通用串行通信接口 _AX(USCI_Ax) 設為 UART 模式時的區塊結構圖, 主要分成接收器 ( 紅框 ) 傳送器( 藍框 ) 以及決定頻率的區塊, 在紅框與藍框的部分, 有很多連接到相同暫存器的部分, 主要是用來選擇 設定傳輸模式 圖 10.1 USCI_Ax UART 模式區塊結構圖
MSP430 有 4 個埠 (3 5 9 10) 用來進行當作通用串行通信接口 (USCI) 模組來支持多種串行通信模式 (UART SPI I2C) 在通用非同步收發傳輸模式中,MSP430 中 USCI_Ax 模組利用了兩個腳位來和外部的介面做連接 (UCAxRXD UCAxTXD) UART 模式的功能包括 : 有奇 偶 無同位檢查的 7 或 8 位元的資料傳輸 獨立的傳送 接收位移暫存器 分離的傳送 接收緩衝暫存器 資料傳輸可以選擇 LSB 或 MSB 接收器的啟動編緣檢測會從 LPMx 模式中自動喚醒 可程式化的鮑率 有錯誤偵測和抑制的狀態旗標 有位址偵測的狀態旗標 傳送與接收器有獨立的中斷 10.2 內部暫存器 下表為 USCI_Ax 暫存器, 接下來會依照範例程式, 介紹幾個主要常用的暫存器 表 10.1 USCI_Ax 暫存器
表 10.2 UCAxCTL0 控制常用暫存器功能說明 名稱 說明 UCPEN 同位檢查致能, 預設為 0, 關閉 UCMSB 決定是否為 MSB 傳送方式, 預設為 0, 採用 LSB UC7BIT 字元長度選擇 (0:8-bit 1:7-bit) UCSPB 停止 bit 數選擇 (0:1-bit 1:2-bit) UCMODE UART 模式選擇, 請設定為 00 UCSYNC 同步模式選擇, 要使用 UART 該 BIT 一定要設定成 0 表 10.3 UCAxCTL1 控制常用暫存器功能說明 名稱 說明 UCSSELx 時脈來源選擇 00 UCLK 01 ACLK 10 SMCLK 11 SMCLK UCSWRST 軟體重置致能 (0: 關閉 1: 開啟 ) 而 UCAxBR0 UCAxBR1 與 UCAxMCTL 是 3 個 8-bit 的暫存器, 用來決定鮑率, 而 UCAxRXBUF UCAxTXBUF 分別是接收與傳送資料的 8-bit 暫存器 在中斷部分, 由 UCAxIE 中的 UCTXIE UCRXIE 來決定是否啟動中斷 (0: 關閉 1: 啟動 ), UCAxIFG 中的 UCTXIFG UCRXIFG, 則是中斷旗標 (0: 沒中斷發生,1: 中斷發生 ) 10.3 初始化流程 要使用 UART 模式, 必須有下列設定 (1) 將 UCSWRST 設定為 1, 讓 USCI_Ax 處在重置狀態 (2) 設定所有的暫存器 甲 如表 10.2 的暫存器都依照預設值不修改的話, 即代表所設定的 UART 是沒有同位檢查, 以 LSB 方式傳送, 自元長度為 8 位元, 停止位元數為 1 的傳輸模式 乙 設定鮑率, 調整 UCSSELx 選擇想要的時脈來源後,UCAxBR0 UCAxBR1 與 UCAxMCTL 三個暫存器, 其關係如下 : 時脈 (8Mhz) / 鮑率 (57600) = 135.642 將 135 填入 BRx,UCAxBR0 為低位元,UCAxBR1 為高位元, 轉為 16 進制後再填入,BR0 = 0x87 BR1 = 0x00
而調變控制暫存器的數值算法, 則是將小數點進行下列運算得之 算出來的值, 並不一定是最佳的, 但基本上都是在這附近, 可以在實際測試後微調 (3) 設定腳位 (4) 將 UCSWRST 設定為 0 (5) 啟動 RX or TX 中斷置能與 GIE 中斷 10.4 UART 傳輸實驗 10.4.1 實驗目的用 UART Mode 串列通訊將資料傳送至另 PC 10.4.2 實驗設備電腦 x1 FETx1 RS232 線 x1 示波器 x1 10.4.3 實驗描述 a. ACLK = 32kHz, MCLK = SMCLK = DCO =~8MHz referenced by XT1. b. UART:8N1 57600. c. 利用超級終端機傳送 0x55 給 MSP430, 然後回傳 0xAA 10.4.4 接線步驟以排線自 P10 連接自 RS232_module, 給予 RS232_Power +3v & GND 圖 10.2 UART 傳輸實驗連接圖
10.4.5 程式流程圖 開始 Init MSP430 USCI A3 ISR 判斷旗標?(IFGA3 是 & UTXIFGA3) 否 傳送 Data RET 圖 10.3 UART 傳輸實驗流程圖 說明 : 上圖一開始先設定頻率, 依照頻率設定先設定 UCS 的暫存器, 將頻率設定成 ACLK = 32kHz, MCLK = SMCLK = DCO =~8MHz referenced by XT1, 之後設定 UART 腳位, 然後依照 10.3 所述, 照題目 B 項要求來設定 UART 暫存器 下圖為中斷函式, 等待 UART 中斷訊號發生, 比對收到的資料是否為 U, 之後判斷是否可以進行傳送, 如果可以的話, 傳送 0XAA
10.4.6 程式碼 Main.c #include <msp430x54x.h> void main() { WDTCTL = WDTPW+WDTHOLD; 註解 停止看門狗 P11DIR = 0x07; P11SEL = 0x07; 設定頻率輸出腳位 P7SEL = 0x03; UCSCTL6 &= ~XT1DRIVE_3; UCSCTL6 = XCAP_3 ; 設定 XT1 腳位設定驅動強度設定內部電容 UCSCTL0 = 0x00; UCSCTL1 = DCORSEL_4; 設定最低的 DCOx, MODx 選擇合適的頻率範圍 UCSCTL2 = 244 ; UCSCTL4 = SELA XT1CLK SELS DCOCLK SELM DCOCLK ; P10SEL = 0x30; P10DIR = BIT4; P10DIR &= ~BIT5; DCO = 244 * 32768Hz ~= 8MHz 設定三個 CLK 的來源 設定 UART 腳位 P10.4,5 = USCI_A1 TXD/RXD UCA3CTL1 = SWRT; UCA3CTL0 = UCMODE_0; 設定軟體重置設定模式 UCA3CTL1 = UCSSEL_2; UCA3BR0 = 0x87; UCA3BR1 = 0x00; UCA3MCTL = 0xB6; UCA3CTL1 &= ~SWRT; UCA3IE = UCRXIE; 選擇時脈來源設定鮑率 Modulation = 10110110 = 0xB6 關閉軟體重置啟動接收中斷致能 bis_sr_register(gie); } GIE 中斷啟動
#pragma vector=usci_a3_vector interrupt void USCI_A3_ISR (void) { if(uca3rxbuf == 0x55){ while (!(UCA3IFG& UCTXIFG)); UCA3TXBUF = 0xAA; } } 是否可以傳送傳送 0xAA
10.4.7 實驗結果 右圖為示波器連接 RX TX 的結果, 左圖為 IAR 除錯模式中斷時, 暫存器視窗的結果 圖 10.4 UART 傳輸實驗結果