USART 簡介
ATmega168/328 晶片上有一個 USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter),又稱 Serial Port,用來做序列通訊。如下圖所示,USART 使用 RXD 和 TXD 這兩支接腳來接收與傳送資料:
ATmega168/328 晶片的 RXD 和 TXD,就是 Arduino 的 RX (pin 0) 跟 TX (pin 1):
▲ Arduino 把 USART 轉成 USB 介面,所以我們才可以用 USB 跟 ATmega168/328 通訊
要使用 USART 通訊,你必須設定 baud rate, frame format (訊框格式),並且決定要不要啟用中斷。如果你使用中斷,還要提供 ISR 函式處理中斷。
USART 暫存器
底下摘要介紹 USART 的暫存器:
首先是 UBRR0L 和 UBRR0H – USART Baud Rate Registers:
顧名思義,這兩個暫存器是用來設定 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:
在 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:
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:
UCSR0C 是用來設定通訊所用的 Frame format (訊框格式),比如同步/非同步傳輸, Parity, Stop bit 及 Data bits 等設定:
一般來說,大部份的情況下都是使用 N, 8, 1,也就是 No parity check, 8-bit Data, 1 stop bit。這也是 UCSR0C 的預設值。
最後是 UDR0 – USART I/O Data Register 0:
UDR0 暫存器比較簡單,它是用來放資料的暫存器。比較特別的是,transmitter 跟 receiver 共用 UDR0 暫存器。不過,對 UDR0 寫資料其實是放到 TXB 暫存器,而讀取 UDR0 時資料則是從 RXB 暫存器中取出。
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。