Exynos4412非同步串列埠通訊及實驗
阿新 • • 發佈:2019-01-25
通訊傳輸方式
這裡的空閒位起修正誤差的作用,在波特率設定暫存器會產生誤差。
RS-232序列介面標準詳細介紹 目前RS-232是PC機與通訊工業中應用最廣泛的一種序列介面。RS-232被定義為一種在低速率序列通訊中增加通訊距離的單端標準。 RS-232採取不平衡傳輸方式,即所謂單端通訊。
9針COM介面功能說明
資料通訊方式
64 bytes in Ch1 and Ch4
16 bytes in Ch2 and Ch3
控制器框架圖
以篇幅有限就不具體的把各個暫存器的設定貼出來了 根據查閱手冊波特率設定暫存器 下面計算假設串列埠時鐘SCLK_UART=40MHz,設定波特率為115200, 1.計算DIV_VAL DIV_VAL = (SCLK_UART/(bps * 16)) - 1 DIV_VAL = (40000000/(115200 * 16)) - 1 = 21.7 – 1 = 20.7 2.設定UBRDIVn = 20 (DIV_VAL的整數部分) 3.計算AC_VAL數值 UFRACVALn/16 = 0.7(DIV_VAL的小數部分) UFRACVALn=11.2 4.設定UFRACVALn = 11 根據以上資料配置串列埠通訊
具體實現程式碼如下 #include "exynos_4412.h"
void mydelay_ms(int time) {
int i, j;
while (time--) {
for (i = 0; i < 5; i++)
for (j = 0; j < 514; j++)
;
}
}
void putc(const char data) {
while (!(UART2.UTRSTAT2 & 0x2))
; //shifter check
UART2.UTXH2 = data;
if (data == '\n')
putc('\r');
}
void puts(const char *pstr) {
while (*pstr != '\0')
putc(*pstr++);
}
int uart_init() {
GPA1.CON = 0x22;
UART2.ULCON2 = 0x3; //8N1 與串列埠除錯工具設定相同
UART2.UCON2 = 0x5; //set polling mode
UART2.UBRDIV2 = 0x35; //波特率整數
UART2.UFRACVAL2 = 0x5; //baud-rate 小數部分
}
int main() {
uart_init();
char str[] = "hello uart test!\n";
while (1) {
puts(str);
mydelay_ms(800);
}
return 0;
}
- 序列通訊(二進位制) 序列傳送,資料是按順序一位一位傳送,一條資料線或差分線傳輸
- 並行通訊 資料各位同時傳送,多條資料線
這裡的空閒位起修正誤差的作用,在波特率設定暫存器會產生誤差。
RS-232序列介面標準詳細介紹 目前RS-232是PC機與通訊工業中應用最廣泛的一種序列介面。RS-232被定義為一種在低速率序列通訊中增加通訊距離的單端標準。
9針COM介面功能說明
腳位 | 中文說明 | 英文標識 |
1 | 資料載波檢測 | DCD |
2 | 接收資料 | RXD |
3 | 傳送資料 | TXD |
4 | 資料終端準備 | DTR |
5 | 訊號地 | GND |
6 | 資料裝置準備好 | DSR |
7 | 請求傳送 | RTS |
8 | 清除傳送 | CTS |
9 | 振鈴指示 | DELL |
- 單工 只能向一個方向進行資料傳輸
- 半雙工 雙向,同一時間內只能向一個方向傳輸
- 全雙工 雙向 ,同一時間內可以雙向通訊
- 輪詢 通過程式執行流,不停的檢測狀態暫存器的結果,對於不頻繁的外設效率低。
- 5組手法通道,同時支援中斷模式及DMA操作
- 通道0,1,2,3支援紅外模式
- 通道0帶256位元組的FIFO,通道1,4帶64位元組的FIFO,通道2,3帶16位元組FIFO
- 通道0,1,2支援自動流控功能
- 通道4支援GPS通訊和自動流控
- Baud-rate generator (波特率生成器)
- Transmitter (傳送器)
- Receiver (接收器)
- Control unit (控制單元)
64 bytes in Ch1 and Ch4
16 bytes in Ch2 and Ch3
控制器框架圖
以篇幅有限就不具體的把各個暫存器的設定貼出來了 根據查閱手冊波特率設定暫存器 下面計算假設串列埠時鐘SCLK_UART=40MHz,設定波特率為115200, 1.計算DIV_VAL DIV_VAL = (SCLK_UART/(bps * 16)) - 1 DIV_VAL = (40000000/(115200 * 16)) - 1 = 21.7 – 1 = 20.7 2.設定UBRDIVn = 20 (DIV_VAL的整數部分) 3.計算AC_VAL數值 UFRACVALn/16 = 0.7(DIV_VAL的小數部分) UFRACVALn=11.2 4.設定UFRACVALn = 11 根據以上資料配置串列埠通訊
- ULCONn 0x0000 Specifies line control 0x0000_0000 行控制暫存器
- UCONn 0x0004 Specifies control 0x0000_3000 控制位暫存器
- UBRDIVn 0x0028 Specifies baud rate divisor 0x0000_0000 波特率高位
- UFRACVALn 0x002C Specifies divisor fractional value 0x0000_0000 波特率低位
- UTRSTATn 0x0010 Specifies Tx/Rx status 0x0000_0006 傳送/接收狀態監測 傳送狀態監測:緩衝區為空才能傳送資料(等待發送緩衝區傳送完資料為空)否則要等緩衝區傳送完資料才能操作緩衝區。 接受狀態監測:緩衝器非空的時候才能接受資料(讀接受緩衝區資料)否則等緩衝區接收完資料才能操作緩衝區
- UTXHn 0x0020 Specifies transmit buffer Undefined 指定傳送緩衝區
- URXHn 0x0024 Specifies receive buffer 0x0000_0000 接受緩衝區
具體實現程式碼如下 #include "exynos_4412.h"
void mydelay_ms(int time) {
int i, j;
while (time--) {
for (i = 0; i < 5; i++)
for (j = 0; j < 514; j++)
;
}
}
void putc(const char data) {
while (!(UART2.UTRSTAT2 & 0x2))
; //shifter check
UART2.UTXH2 = data;
if (data == '\n')
putc('\r');
}
void puts(const char *pstr) {
while (*pstr != '\0')
putc(*pstr++);
}
int uart_init() {
GPA1.CON = 0x22;
UART2.ULCON2 = 0x3; //8N1 與串列埠除錯工具設定相同
UART2.UCON2 = 0x5; //set polling mode
UART2.UBRDIV2 = 0x35; //波特率整數
UART2.UFRACVAL2 = 0x5; //baud-rate 小數部分
}
int main() {
uart_init();
char str[] = "hello uart test!\n";
while (1) {
puts(str);
mydelay_ms(800);
}
return 0;
}