Atmel Tiny 88 Single-wire Software UART
Introduction
Single-wire Software UART 的特性:
- 使用軟體開發的 UART
- 半雙工單線傳輸
- 使用中斷驅動事件
- 支援傳輸速度為 9600@1MHz 的系統時脈
- 所有的 AVR 晶片所需要的外部中斷及一個 8-bit 的計數比較器
UART 的簡介:
Frame -
Transmission -
Reception -
Error Condition -
<情況一>
程式碼說明:
Baud rate 設定 -
/**
* Baud rate settings (WAIT_ONE - PRESCALER):
* Baud Rate 1MHz 2Mhz 4MHz 8MHz
* 4800 207 - 1 51 - 8 103 - 8 (207 - 8)
* 9600 103 - 1 207 - 1 51 - 8 103 - 8
* 19200 NA 103 - 1 207 - 1 51 - 8
* 28800 NA NA 138 - 1 34 - 8
* 38400 NA NA 103 - 1 207 - 1
* Please note that the UART consumes about all CPU resources
* when WAIT_ONE*PRESCALER<100.
*/
#if (F_CPU == 1000000)
/**
* Half bit period compare setting.
* See the application note for calculation of this value.
* Make sure timer prescaler is set to the intended value.
*/
#define WAIT_ONE 103
/* Prescaler setting. Must be set according to the baud rate setting. */
#define PRESCALER 1
#elif (F_CPU == 2000000)
/* Half bit period compare setting. See the application note for calculation
* of this value. Make sure timer prescaler is set to the intended value.
*/
#define WAIT_ONE 207
/* Prescaler setting. Must be set according to the baud rate setting. */
#define PRESCALER 1
#elif (F_CPU == 4000000)
#define WAIT_ONE 103
#define PRESCALER 1
#endif
Baudrate
|
4800
|
9600
|
19200
|
28800
|
38400
| |
1MHz
|
Prescaler
|
1
|
1
|
N/A
|
N/A
|
N/A
|
Compare
|
207
|
103
|
N/A
|
N/A
|
N/A
| |
Error
|
-0.16%
|
-0.16%
|
N/A
|
N/A
|
N/A
| |
2MHz
|
Prescaler
|
8
|
1
|
1
|
N/A
|
N/A
|
Compare
|
51
|
207
|
103
|
N/A
|
N/A
| |
Error
|
-0.16%
|
-0.16%
|
-0.16%
|
N/A
|
N/A
| |
4MHz
|
Prescaler
|
8
|
8
|
1
|
1
|
1
|
Compare
|
103
|
51
|
207
|
138
|
103
| |
Error
|
-0.16%
|
-0.16%
|
-0.16%
|
-0.08%
|
-0.16%
| |
8MHz
|
Prescaler
|
8
|
8
|
8
|
8
|
1
|
Compare
|
207
|
103
|
51
|
34
|
207
| |
Error
|
-0.16%
|
-0.16%
|
-0.16%
|
-0.82%
|
-0.16%
|
Hardware 設計 -
- single-wire 接腳需要使用外部 pull-up。因為 AVR 的內部阻抗約 15-40KΩ,無法做高速傳輸,而且 UART 需要 -15V 到 15V 的工作電壓,所以建議使用外部 pull-up 到外部的工作電壓。
- single-wire 要能設為 Open-collector 的輸出。
- single-wire 在接收到資料時,需要可以產生中斷。
Register 說明 -
- SW_UART_TX_BUFFER_FULL - 資料已準備好要傳送,設定為1。使用 SW_UART_transmit 函式來傳送資料。
- SW_UART_RX_BUFFER_FULL - 接收到有效的資料,設定為1。使用 SW_UART_Receive 函式來接收資料。
- SW_UART_RX_BUFFER_OVERFLOW - 接收緩衝器發生資料 Overflow,設定為1。
- SW_UART_FRAME_ERROR - 接收到 start bit 的準位是 High 或者 stop bit 準位為 Low 的資料。
- UART counter - 提供給 UART driver 軟體來控制狀態並且得知位元是要傳送或接收。
UART Function 說明 -
- SW_UART_Enable - 啟動 SW UART 功能
- SW_UART_Transmit - SW UART 傳送功能
- SW_UART_Receive - SW UART 接收功能
- External_SW_UART_ISR - INT0 的中斷服務程式
- Timer_Compare_SW_UART - CTC 的中斷服務程式,其中 UART Tansmit Handler 和 UART Receive Handler 在下方會有詳細的流程圖。
- UART Transmit Handler 的流程 -
- UART Receive Handler 的流程
SampleCode
- 我的板子使用的外部中斷是 INT1,sample code 是 INT0。
- 我使用的晶片的 Tiny88,有些暫存器名字不同,更改成 Tiny88 暫存器。
- 編譯器使用 Atmel Studio v7,修改部分宣告語法。
下載 SampleCode
Reference Document
- doc8008.pdf - ATtiny 88 datasheet
- AVR274.pdf - AVR274 : Single-wire Software UART on tinyAVR and megaAVR devices
留言
張貼留言