2011年7月16日 星期六

5) USART

USART 簡介

ATmega168/328 晶片上有一個 USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter),又稱 Serial Port,用來做序列通訊。如下圖所示,USART 使用 RXD 和 TXD 這兩支接腳來接收與傳送資料:

image

ATmega168/328 晶片的 RXD 和 TXD,就是 Arduino 的 RX (pin 0) 跟 TX (pin 1):

image
▲ Arduino 把 USART 轉成 USB 介面,所以我們才可以用 USB 跟 ATmega168/328 通訊

要使用 USART 通訊,你必須設定 baud rate, frame format (訊框格式),並且決定要不要啟用中斷。如果你使用中斷,還要提供 ISR 函式處理中斷。

USART 暫存器

底下摘要介紹 USART 的暫存器:

首先是 UBRR0L 和 UBRR0H – USART Baud Rate Registers:

image

顧名思義,這兩個暫存器是用來設定 Baud Rate 的,公式是:

ubbr 設定值 = (F_CPU/16/baud rate) – 1

其中 F_CPU 代表時脈頻率,以 Arduino UNO 或 Duemilanove 而言是 16000000,baud rate 是想要的速率,例如 9600, 19200, 38400, 57600… 等。

接著是 UCSR0A – USART Control and Status Register A:

image

在 UCSR0A 這個暫存器中,比較重要的是 RXC0, TXC0, UDRE0 這三個旗號:

  • RXC0: USART Receive Complete,當 receiver buffer 中有未讀取的資料時,這個旗號會豎起來,當資料被讀走時,旗號會清除。
  • TXC0: USART Transmit Complete,當 Shift Register 的資料被傳送出去,而且 transmit buffer (UDR0) 中也沒有資料時,這個旗號會豎起來。
  • UDRE0: USART Data Register Empty,當 transmit buffer (UDR0) 準備好放下一個要傳送的資料時,這個旗號會豎起來。

下一個是 UCSR0B – USART Control and Status Register B:

image

UCSR0B 暫存器比較重要的是 RXEN0 和 TXEN0,這兩個元位用來啟用接收器 (receiver) 和發射器 (transmitter),一般來說,我們會啟用這兩個元。

另外,RXCIE0, TXCIE0, UDRIE0 則是用來決定要不要啟用中斷的位元:

  • RXCIE0: USART Receive Complete Interrupt Enable 0
  • TXCIE0: USART Transmit Complete Interrupt Enable 0
  • UDRIE0: USART Data Register Empty Interrupt Enable 0

再來是 UCSR0C – USART Control and Status Register C:

image

UCSR0C 是用來設定通訊所用的 Frame format (訊框格式),比如同步/非同步傳輸, Parity, Stop bit 及 Data bits 等設定:

image

一般來說,大部份的情況下都是使用 N, 8, 1,也就是 No parity check, 8-bit Data, 1 stop bit。這也是 UCSR0C 的預設值。

最後是 UDR0 – USART I/O Data Register 0:

image

UDR0 暫存器比較簡單,它是用來放資料的暫存器。比較特別的是,transmitter 跟 receiver 共用 UDR0 暫存器。不過,對 UDR0 寫資料其實是放到 TXB 暫存器,而讀取 UDR0 時資料則是從 RXB 暫存器中取出。

0 意見: