1. 程式人生 > >Exynos4412非同步串列埠通訊及實驗

Exynos4412非同步串列埠通訊及實驗

通訊傳輸方式
  1. 序列通訊(二進位制) 序列傳送,資料是按順序一位一位傳送,一條資料線或差分線傳輸
  2. 並行通訊 資料各位同時傳送,多條資料線
比較:序列通常傳輸速度比較慢,成本低,適用於計算機間的遠距離傳輸。並行傳輸速率高,成本也高,適用於近距離裝置傳輸,當然了還有RS-485,RS-422,使用了序列差分通訊匯流排,傳輸速率快,抗干擾性能好,同時傳輸距離遠。 同步傳輸與非同步傳輸
這裡的空閒位起修正誤差的作用,在波特率設定暫存器會產生誤差。
RS-232序列介面標準詳細介紹 目前RS-232PC機與通訊工業中應用最廣泛的一種序列介面。RS-232被定義為一種在低速率序列通訊中增加通訊距離的單端標準。
RS-232採取不平衡傳輸方式,即所謂單端通訊。
9COM介面功能說明
腳位 中文說明 英文標識
 1 資料載波檢測  DCD
 2 接收資料  RXD
 3 傳送資料  TXD
 4 資料終端準備  DTR
 5 訊號地   GND
 6 資料裝置準備好  DSR
 7 請求傳送  RTS
 8 清除傳送  CTS
 9 振鈴指示  DELL
資料通訊方式
  1. 單工 只能向一個方向進行資料傳輸
  2. 半雙工 雙向,同一時間內只能向一個方向傳輸
  3. 全雙工 雙向 ,同一時間內可以雙向通訊
資料通訊的傳輸模式
  1. 輪詢 通過程式執行流,不停的檢測狀態暫存器的結果,對於不頻繁的外設效率低。
send {     while(1)     {      邏輯判斷       操作 } } 2.中斷 3.DMA(直接記憶體訪問) UART通用非同步接收器和傳送器 Exynos4412uart的特點
  1. 5組手法通道,同時支援中斷模式及DMA操作
  2. 通道0,1,2,3支援紅外模式
  3. 通道0帶256位元組的FIFO,通道1,4帶64位元組的FIFO,通道2,3帶16位元組FIFO
  4. 通道0,1,2支援自動流控功能
  5. 通道4支援GPS通訊和自動流控
As shown in Figure 28-1, each UART contains:
  1.  Baud-rate generator (波特率生成器)
  2.  Transmitter (傳送器)
  3.  Receiver (接收器)
  4.  Control unit (控制單元)
各通道大小 256 bytes in Ch0
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 根據以上資料配置串列埠通訊
  1. ULCONn 0x0000 Specifies line control 0x0000_0000 行控制暫存器
  2. UCONn 0x0004 Specifies control 0x0000_3000 控制位暫存器
  3. UBRDIVn 0x0028 Specifies baud rate divisor 0x0000_0000 波特率高位
  4. UFRACVALn 0x002C Specifies divisor fractional value 0x0000_0000 波特率低位
  5. UTRSTATn 0x0010 Specifies Tx/Rx status 0x0000_0006 傳送/接收狀態監測    傳送狀態監測:緩衝區為空才能傳送資料(等待發送緩衝區傳送完資料為空)否則要等緩衝區傳送完資料才能操作緩衝區。 接受狀態監測:緩衝器非空的時候才能接受資料(讀接受緩衝區資料)否則等緩衝區接收完資料才能操作緩衝區
  6. UTXHn 0x0020 Specifies transmit buffer Undefined  指定傳送緩衝區    
  7. 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;
}