TQ210——S5PV210串口通信
TQ210——S5PV210串口通信
?
1、? 串行與并行通信
? ? ? 串行通道中,有效信息被編碼后串行的從單根傳輸線上傳送出去。譬如發送ASCII字符’a’,我們可以將’a’對應的ASCII碼97(0x61)分作8個bit在傳輸線上順序依次傳輸。
? ? ? 與串行傳輸相對應的是并行傳輸,并行傳輸一般有多根并列的傳輸線可以同時傳輸多個bit數據。譬如8線的并行傳輸,可以同時傳輸8個比特。因此在線速相同的情況下并行傳輸效率更高,但同時布線成本更高。
? ? ? 串行硬件接口簡單,只需要 3 根線:一是底線,二是發送,三是接收。
? ? ? UART 使用標準的 TTL/CMOS 邏輯電平(0~5V)來表示數據,用 1 表示高 電平,用 0 表示低電平,為了增強數據的抗干擾能力、提高傳輸距離,通常將 TTL/CMOS 邏輯電平轉換成 RS232 邏輯電平,一般用 1 表示(-3~12V),用 0 表 示 (3~12V)
(1)、幀:因為串行通信只有一根傳輸線,單位時間內只能傳輸一個比特位,因此要對傳輸信息進行編碼發送。以常用的ASCII編碼為例,則傳輸一個字符的ASCII編碼稱為一幀。一幀信息包括起始位、數據位、校驗位、停止位等部分。
(2)起始位:一幀的開始標志。
(3)數據位:幀內有效數據,長度可配置為6、7、或8bit,一般ASCII編碼下均使用8bit數據位。
(4)校驗位:可選擇奇/偶/無校驗
(5)停止位:一幀的停止標志。停止位后傳輸線變為空閑狀態,一直到下一幀的起始位
(6)波特率:串行傳輸中傳輸線上每秒鐘傳輸的bit數稱為波特率(Baudrate),波特率越大傳輸速率越快,同時傳輸對誤差和干擾越敏感越容易出錯。
?
2、? S5PV210 —— UART(4個獨立的異步串行IO)
? ? ? S5PV210的UART支持查詢模式(Polling)、中斷模式(Interrupt)、DMA模式三種模式
? ? ? Polling模式可以用來實現stdio
? ? ? 中斷模式中,CPU可以在不影響主任務的情況下,使用中斷響應處理串行通信,因此可以用來實現高效的串行發送和接收。如果開啟FIFO模式,效率將更高。
? ? ? DMA模式中使用DMA通道來傳輸信息,適合批量數據的串行傳輸需要。
? ? ? S5PV210的UART模塊有兩個可選時鐘源:PCLKor SCLK_UART。我們大多數選擇 PCLK 作為波特 率發生器的時鐘源輸入。
?
3、? 寄存器
(1) ULCON
? ? ? ULCON中主要設置串行通信的數據格式,一般會設置為0x03(普通模式、無校驗、1停止位、8數據位)。
? ? ? UCON中主要設置Tx/Rx中斷類型(必須設置為Level,而不能是Pulse,這是S5PV210本身決定的)以及Rx/TxMode(如果不使用DMA,則一般會選擇Interruptrequest or polling mode),所以UCON的常規賦值為0x305。
?
(2)UFCON
? ? ? UFCON中設置Rx/TxFIFO enable/disable,用來使能或禁止FIFO模式
? ? ? 如果使能FIFO模式,則同時需要設置各串口的發送與接收FIFO的觸發等級
? ? ? 注意接收時,RxFIFO中的實際值大于RxFIFO的觸發等級時會觸發RxInterrupt;而發送時,TxFIFO中的實際值小于TxFIFO時即會觸發Tx Interrupt。因此一般會先填充TxFIFO然后再使用Tx Interrupt
?
(3)STATUS寄存器
? ? ? UTRSTATn寄存器中記錄發送(FIFO)空與接收ready狀態標志位。我們在發送前必須檢查發送空標志位,待其為1時才可發送;接收前必須檢查接收好狀態位,待其為1時才可去讀接收字符。
? ? ? UERSTATn寄存器記錄通信過程中的錯誤,如幀錯誤、奇偶校驗錯誤、覆蓋錯誤等。
? ? ? UFSTATn記錄FIFO模式下的相關狀態標志。
?
(4)發送/接受緩沖器
UART0~3各有一個發送緩沖寄存器和一個接收緩沖寄存器
UART發送時,將要發送的數據(一般為1Byte)放入UTXHn即可
UART接收時,從URXHn讀取接收到的數據
?
(5)波特率設置寄存器
? ? ? S5PV210的UART波特率設置寄存器與S3C2440等有很大不同,除UBRDIVn外增加了UDIVSLOTn寄存器作為精細調節以減小誤差。
對于UBRDIVn:
?????? DIV_VAL = (PCLK / (bps x 16))? ?1
?????? or DIV_VAL = (SCLK_UART / (bps x 16)) ? 1
對于UDIVSLOTn:
?????? DIV_VAL = UBRDIVn + (num of 1's inUDIVSLOTn)/16
?比如配置波特率為 115200bps,時鐘源選擇 PCLK=66MHz
DIV_VAL = (66000000/(115200 x 16))-1 =35.8 - 1 = 34.8
UBRDIV0 = 34 ( DIV_VAL 的整數部分)
(num of 1's in UDIVSLOTn)/16 = 0.8 ( DIV_VAL 的小數部分)
(num of 1's in UDIVSLOTn) = 12
UDIVSLOT0 = 0xDDDD (查表)
?
(6)UARTINTERRUPT1
? ? ? 當一個UARTinterrupt來臨時,會在UINTSP寄存器中產生一個相應bit的掛起標志。同時若UINTM中相應bit設置為中斷允許,則會在UINTP中產生一個中斷掛起。
(7)UARTINTERRUPT2
? ? ? UART使用的中斷共有4個,其中常用的是接收中斷RXD。串口模塊使能RXDInterrupt時,當串口接收到信息時則會觸發中斷,CPU響應中斷并從URXHn讀出數據。中斷機制的引入,使CPU具有了一邊執行主程序、一邊進行串口通信接收的宏觀上的并行能力。
?
4、串口編程操作步驟如下:
(1)、配置時鐘,選擇時鐘源
(2)、配置 ULCONn 寄存器:設置數據位、停止位、 校驗位、模式
(3)、配置 UCONn 寄存器:設置數據接收和發送模式、時鐘源
(4)、設置 UFCONn:啟用或靜止 FIFO
(5)、配置 UBRDIVn 和 UDIVSLOTn:計算波特率
(6)、發送數據:等待發送器為空,將要發送的 8 位數據賦給發送緩存寄存器 UTXHn
(7)、接收數據:等待接收緩沖區有數據可讀,從接收緩存寄存器 URXHn 中取出數據
?
.global _start _start:bl uart_init /* 串口初始化*/bl main /* 跳轉到C函數去執行*/ halt:b halt #define GPA0CON *((volatile unsigned int *)0xE0200000) #define ULCON0 *((volatile unsigned int*)0xE2900000) #define UCON0 *((volatile unsigned int*)0xE2900004) #define UFCON0 *((volatile unsigned int*)0xE2900008) #define UTRSTAT0 *((volatile unsigned int *)0xE2900010) #define UTXH0 *((volatileunsigned int *)0xE2900020) #define URXH0 *((volatile unsigned int*)0xE2900024) #define UBRDIV0 *((volatile unsigned int *)0xE2900028) #define UDIVSLOT0 *((volatile unsigned int*)0xE290002C)/* UART0初始化*/ void uart_init() {/*** 配置GPA0_0為UART_0_RXD** 配置GPA0_1為UART_0_TXD*/GPA0CON &= ~0xFF;GPA0CON |= 0x22;/* 8-bits/One stop bit/No parity/Normalmode operation */ULCON0 = 0x3 | (0 << 2) | (0<< 3) | (0 << 6);/* Interrupt request or polling mode/Normaltransmit/Normal operation/PCLK/*/UCON0 = 1 | (1 << 2) | (0 <<10);/* 靜止FIFO*/UFCON0 = 0;/*** 波特率計算:115200bps** PCLK = 66MHz** DIV_VAL = (66000000/(115200 x 16))-1 =35.8 - 1 = 34.8** UBRDIV0 = 34(DIV_VAL的整數部分)** (num of 1's in UDIVSLOTn)/16 = 0.8** (num of 1's in UDIVSLOTn) = 12** UDIVSLOT0 = 0xDDDD (查表)*/UBRDIV0 = 34;UDIVSLOT0 = 0xDDDD; }static void uart_send_byte(unsigned char byte) {while (!(UTRSTAT0 & (1 << 2))); /* 等待發送緩沖區為空*/UTXH0 = byte; /* 發送一字節數據*/ }static unsigned char uart_recv_byte() {while (!(UTRSTAT0 & 1)); /* 等待接收緩沖區有數據可讀*/return URXH0; /* 接收一字節數據*/ }void putchar(int c) {uart_send_byte(c);/* 如果只寫'\n',只是換行,而不會跳到下一行開頭*/if (c == '\n')uart_send_byte('\r'); }int getchar() {int c;c = uart_recv_byte();return c; }void puts(char *str) {char *p = str;while (*p)putchar(*p++);putchar('\n'); } #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int*)0xE0200064)int main() {int c;GPC0CON &= ~(0xFF << 12);GPC0CON |= 0x11 << 12; // 配置GPC0_3和GPC0_4為輸出GPC0DAT &= ~(0x3 << 3); // 熄滅LED1和LED2puts("UART Test in S5PV210");puts("1.LED1 Toggle");puts("2.LED2 Toggle");puts("Please select 1 or 2 to Togglethe LED");while (1){c = getchar(); // 從串口終端獲取一個字符putchar(c); // 回顯putchar('\r');if (c == '1')GPC0DAT ^= 1 << 3; // 改變LED1的狀態else if (c == '2')GPC0DAT ^= 1 << 4; // 改變LED2的狀態}return 0; }總結
以上是生活随笔為你收集整理的TQ210——S5PV210串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SBUS协议学习
- 下一篇: LACP链路聚合控制协议