S5PV210开发 -- 串口驱动开发
如需轉載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78579074
上篇文章講的 UART,更多的是硬件相關的知識。接下來進入正題了,串口驅動開發(fā)。
一、閱讀原理圖
我們用的是 UART2 串口,則接收管腳 XuRXD2 復用 GPA1_0,發(fā)送管腳 XuTXD2 復用 GPA1_1
二、S5PV210 UART
?
(1)通用異步接收器和發(fā)送器的概述 ?(p-853)
S5PV210中的通用異步接收器和發(fā)送器(UART)提供四個獨立的異步和串行輸入/輸出(I / O)端口。所有端口都以基于中斷或基于DMA的方式運行模式。 UART產生一個中斷或DMA請求來傳送數(shù)據(jù)到CPU和UART。
 UART支持高達3Mbps的比特率。每個UART通道包含兩個FIFO來接收和傳輸數(shù)據(jù):
 ch0中的256個字節(jié),ch1中的64個字節(jié)以及ch2和ch3中的16個字節(jié)。
 UART包括可編程波特率,紅外(IR)發(fā)送器/接收器,一個或兩個停止位插入,5位,6位,7位或8位數(shù)據(jù)寬度和奇偶校驗。每個UART包含一個波特率發(fā)生器,一個發(fā)送器,一個接收器和一個控制單元,如圖1-1所示。
?
波特率發(fā)生器使用PCLK或SCLK_UART。發(fā)送器和接收器包含F(xiàn)IFO和數(shù)據(jù)移。要發(fā)送的數(shù)據(jù)被寫入Tx FIFO,并被復制到發(fā)送移位器。數(shù)據(jù)是由發(fā)送數(shù)據(jù)引腳(TxDn)移出。接收到的數(shù)據(jù)從接收數(shù)據(jù)引腳(RxDn)移位,從移位器復制到Rx FIFO。
?
(2)通用異步接收器和發(fā)送器的關鍵特性
?
基于DMA或基于中斷的操作的RxD0,TxD0,RxD1,TxD1,RxD2,TxD2,RxD3和TxD3
 帶有IrDA 1.0的UART Ch 0,1,2和3
 具有256字節(jié)FIFO的UART Ch 0,具有64字節(jié)FIFO的Ch 1,具有16字節(jié)FIFO的Ch2和3
 用于自動流量控制的UART Ch 0,1和2與nRTS0,nCTS0,nRTS1,nCTS1,nCTS2和nRTS2
 支持握手發(fā)送/接收。
?
?
?
(3)UART描述
以下各節(jié)將介紹UART操作,如數(shù)據(jù)傳輸,數(shù)據(jù)接收,中斷生成,波特率生成,環(huán)回模式,紅外模式和自動流量控制。
?
?
《1》數(shù)據(jù)發(fā)送
傳輸?shù)臄?shù)據(jù)幀是可編程的。 它由一個起始位,五到八個數(shù)據(jù)位,一個可選的奇偶校驗組成位和由行控制寄存器(ULCONn)指定的一到兩個停止位。 變送器也可以產生一個強制串行輸出為邏輯0狀態(tài)一個幀傳輸時間的中斷條件。 這個塊傳送當前發(fā)送字之后的中斷信號被完全發(fā)送。 中斷信號后傳輸時,發(fā)送器不斷向Tx FIFO發(fā)送數(shù)據(jù)(Tx保持寄存器,如果是非FIFO模式)
?
?
《2》數(shù)據(jù)接收
與數(shù)據(jù)發(fā)送類似,用于接收的數(shù)據(jù)幀也是可編程的。 它由一個5位的起始位組成8個數(shù)據(jù)位,一個可選的奇偶校驗位以及線路控制寄存器(ULCONn)中的一到兩個停止位。 收件人檢測溢出錯誤,奇偶校驗錯誤,幀錯誤和中斷情況,每個錯誤標志都會設置一個錯誤標志。
 ? ? 溢出錯誤(Overrun error)表示新數(shù)據(jù)在舊數(shù)據(jù)讀取之前覆蓋舊數(shù)據(jù)。
 ? ? 奇偶校驗錯誤(Parity error)表示接收器檢測到意外的奇偶校驗條件。
 ? ? 幀錯誤(Frame error)表示接收到的數(shù)據(jù)沒有有效的停止位。
 ? ? 中斷條件(Break condition)表示RxDn輸入保持邏輯0狀態(tài),以進行多個幀傳輸時間。
 如果在3個字的時間內沒有收到任何數(shù)據(jù),則會發(fā)生接收超時情況(此時間間隔符合設置字長度位),FIFO模式下Rx FIFO不為空。
?
后面內容有點多... ?就不一一翻譯了。想了解更多,自己看。
三、UART 相關配置
(1)配置串口管腳
上面提到了,S5PV210 中的通用異步接收器和發(fā)送器(UART)提供四個獨立的異步和串行輸入/輸出(I / O)端口。根據(jù)原理圖可以看出,我們用的是 UART2 串口,則接收管腳 XuRXD2 復用 GPA1_0,發(fā)送管腳 XuTXD2 復用 GPA1_1
查看GPA1寄存器(p-135)
端口組GPA1控制寄存器有六個控制寄存器,分別是GPA1CON,GPA1DAT,GPA1PUD,GPA1DRV,GPA1CONPDN和端口組GPA1控制寄存器中的GPA1PUDPDN。
《1》GPA1CON 寄存器 ?(配置寄存器) 將其配置成UART2收/發(fā)模式
GPA1CON, R/W, Address = 0xE020_0020
GPA1CON[1] [7:4] 0100 = UART_AUDIO_TXD
 GPA1CON[0] [3:0] 0100 = UART_AUDIO_RXD
設置:
GPA1CON 地址為 0xE020_0020,然后要將 GPA1CON[7:0] 進行位操作,使其變?yōu)?010 0010,即UART2收發(fā)模式。
位操作方法,參看:C語言再學習 -- 位操作
? ? GPA1CON &= ~(0xff<<0); ?//清空bit 0-7
? ? GPA1CON |= 0x22; ?//設置 0010 0010 ?接受 發(fā)送
《2》GPA1PUD 寄存器(上下拉電阻控制寄存器 )
GPA1PUD, R/W, Address = 0xE020_0028
GPA1PUD[n] [2n+1:2n] 00 = Pull-up/ down disabled
設置:
GPA1PUD 地址為 0xE020_0028,我們不需要上下拉,因此:?
GPA1PUD [1:0] ?00 = Pull-up/ down disabled
GPA1PUD [3:2] ?00 = Pull-up/ down disabled
位操作方法:
? ? GPA1PUD &= ~(0x0f<<0);//0000 禁止上拉下拉
(2)配置串口寄存器
在 p-864 有一個?REGISTER MAP,可以看一下。太長了只粘貼一部分。
?
S5PV10 UART 相關寄存器有如下幾個,下面我們會一一講解的:
《1》UART 行控制器 ULCONn?
UART模塊中有四個UART行控制寄存器,分別是ULCON0,ULCON1,ULCON2和ULCON3
我們用的是 UART2,所以使用?
ULCON2, R/W, Address = 0xE290_0800
?
設置:
ULCON2 地址為 0xE290_0800
數(shù)據(jù)位寬度為 8bit,停止位 1位,無校驗位,正常模式。
即設置數(shù)據(jù)格式寄存器?ULCON2 = 000 0011 = 0x03 ??
位操作方法:
ULCON2 = 0x03;
《2》UART 模式控制寄存器 UCONn
UART模塊中有四個UART控制寄存器,分別是UCON0,UCON1,UCON2和UCON3
我們用的是 UART2,所以使用?
UCON2, R/W, Address = 0xE290_0804
?
設置:
UCON2 地址為 0xE290_0804
接收模式選擇輪詢,發(fā)送模式也選擇輪詢,正常發(fā)送暫停信號,回環(huán)模式為正常,時鐘源選擇 PCLK
即模式控制寄存器 UCON2 = 00 0101 = 0x05;
位操作方法:
UCON2 = 0x05;
需要知道的小知識點:
在收發(fā)模式里有中斷、輪詢、DMA這些有什么區(qū)別呢?
參看:后續(xù)補充!!
再者,時鐘源選擇里有 PCLK、SCLK_UART 這又是什么呢?
參看:后續(xù)補充!!
《3》UART FIFO 控制寄存器UFCONn
UART模塊中有四個UART FIFO控制寄存器,分別是UFCON0,UFCON1,UFCON2和UFCON3
我們用的是 UART2,所以使用?
UFCON2, R/W, Address = 0xE290_0808
設置:
UFCON2 地址為 0xE290_0808
 禁止 FIFO,即FIFO 控制寄存器?UFCON2 = 0x00;
位操作方法:
UFC0N2 = 0X00;
《4》UART 收/發(fā) 狀態(tài)寄存器?UTRSTATn
UART模塊中有四個UART Tx / Rx狀態(tài)寄存器,分別是UTRSTAT0,UTRSTAT1,UTRSTAT2和UTRSTAT3
我們用的是 UART2,所以使用?
UTRSTAT2, R, Address = 0xE290_0810
設置:
UTRSTAT2 地址為 0xE290_0810?
接收緩沖區(qū)數(shù)據(jù)準備好,緩沖區(qū)為空;發(fā)送緩沖區(qū)寄存器為空。即?UTRSTAT2 = 10 = 0x02;
只有收發(fā)緩沖區(qū)為空,才能進行收發(fā)。所以首先要先判斷?UART 收/發(fā) 狀態(tài)寄存器 UTRSTATn
位操作方法:
UTRSTAT2 = 0x02;
《5》UART 發(fā)送緩沖寄存器(保持寄存器和FIFO寄存器)UTXHn
UART模塊有四個UART發(fā)送緩沖寄存器,分別是UTXH0,UTXH1,UTXH2和UTXH3。
UTXHn包含傳輸數(shù)據(jù)的8位數(shù)據(jù)。
我們用的是 UART2,所以使用?
UTXH2, W, Address = 0xE290_0820
設置:
UTXH2 地址為 0xE290_0820
比如發(fā)送的數(shù)據(jù):55,則 UTXH2 = 0101 0101 = 0x55;
?
發(fā)送移位器:發(fā)送緩沖寄存器中的數(shù)據(jù)并不是直接傳送到輸出管腳TXD2(GPA1_1),還必須先送到發(fā)送移位器(Transmit shifter),然后再由Transmit shifter通過移位操作,將數(shù)據(jù)一位一位的發(fā)送到TXD2管腳上。
《6》UART接收緩沖寄存器(保持寄存器和FIFO寄存器)URXHn
UART模塊中有四個UART接收緩沖寄存器,分別是URXH0,URXH1,URXH2和URXH3。
 URXHn包含接收數(shù)據(jù)的8位數(shù)據(jù)。
我們用的是 UART2,所以使用?
URXH2, R, Address = 0xE290_0824
設置:
URXH2 地址為 0xE290_0824
比如接收到的數(shù)據(jù):55,則 URXH2 = 0101 0101 = 0x55;
?
接收移位器:從接收管腳RXD2上接收來的數(shù)據(jù)并不是直接放到接收緩沖寄存器,而是先一位一位的放到接收移位器中,當收滿一個字節(jié)后,再放到接收緩沖寄存器中。
《7》UART 通道波特率分頻寄存器?UBRDIVn
UART模塊中有四個UART通道波特率分頻寄存器,分別是UBRDIV0,UBRDIV1,UBRDIV2和UBRDIV3。
我們用的是 UART2,所以使用?
UBRDIV2, R/W, Address = 0xE290_0828
注意:當UART時鐘源是PCLK時,UBRDIVn必須大于比0(UBRDIVn> 0),如果UBRDIV的值為0,則UART波特率不受UDIVSLOT值的影響。
設置:
UBRDIV2 地址為 0xE290_0828
《8》UART通道分割插槽寄存器?UDIVSLOTn
UART模塊中有四個UART通道波特率分頻寄存器,分別是UDIVSLOT0,UDIVSLOT1,UDIVSLOT2和UDIVSLOT3。
我們用的是 UART2,所以使用?
UDIVSLOT2, R/W, Address = 0xE290_082C
?
================================================
需要知道的小知識點:
波特率,在UART里面是一個很重要的概念。
參看:串口通信 -- 百度百科
數(shù)據(jù)傳輸率
數(shù)據(jù)傳輸率是指單位時間內傳輸?shù)男畔⒘?#xff0c;可用比特率和波特率來表示。
⑴比特率:比特率是指每秒傳輸?shù)亩M制位數(shù),用bps(bit/s)表示。
⑵波特率:波特率是指每秒傳輸?shù)姆枖?shù),若每個符號所含的信息量為1比特,則波特率等于比特率。在計算機中,一個符號的含義為高低電平,它們分別代表邏輯“1”和邏輯“0”,所以每個符號所含的信息量剛好為1比特,因此在計算機通信中,常將比特率稱為波特率,即:
1波特(B)= 1比特(bit)= 1位/秒(1bps) 例如:電傳打字機最快傳輸率為每秒10個字符/秒,每個字符包含11個二進制位,則數(shù)據(jù)傳輸率為:10Baud。11位/字符×10個字符/秒=110位/秒=110bps。計算機中常用的波特率是:110、300、600、1200、2400、4800、9600、19200、28800、33600,目前最高可達56Kbps.
⑶位時間Td
位時間是指傳送一個二進制位所需時間,用Td 表示。Td = 1/波特率 = 1/B
例如:B=110波特/秒 , 則Td = 1/110 ≈ 0.0091s
發(fā)送時鐘和接收時鐘
在串行通信中,二進制數(shù)據(jù)以數(shù)字信號的信號形式出現(xiàn),不論是發(fā)送還是接收,都必須有時鐘信號對傳送的數(shù)據(jù)進行定位。在TTL標準表示的二進制數(shù)中,傳輸線上高電平表示二進制1,低電平表示二進制0,且每一位持續(xù)時間是固定的,由發(fā)送時鐘和接收時鐘的頻率決定。
⑴ 發(fā)送時鐘
發(fā)送數(shù)據(jù)時,先將要發(fā)送的數(shù)據(jù)送入移位寄存器,然后在發(fā)送時鐘的控制下,將該并行數(shù)據(jù)逐位移位輸出。通常是在發(fā)送時鐘的下降沿將移位寄存器中的數(shù)據(jù)串行輸出,每個數(shù)據(jù)位的時間間隔由發(fā)送時鐘的周期來劃分。
⑵ 接收時鐘
在接收串行數(shù)據(jù)時,接收時鐘的上升沿對接收數(shù)據(jù)采樣,進行數(shù)據(jù)位檢測,并將其移入接收器的移位寄存器中,最后組成并行數(shù)據(jù)輸出。
⑶?波特率因子
接收時鐘和發(fā)送時鐘與波特率有如下關系:F = n × B 這里F 是發(fā)送時鐘或接收時鐘的頻率; B 是數(shù)據(jù)傳輸?shù)牟ㄌ芈?#xff1b; n 稱為波特率因子。設發(fā)送或接收時鐘的周期為Tc,頻率為F的位傳輸時間為Td,則: Tc = 1/F , Td = 1/B 得到: Tc = Td /n 在實際串行通信中,波特率因子可以設定。在異步傳送時,n = 1,16,64,實際常采用n = 16,即發(fā)送或接收時鐘的頻率要比數(shù)據(jù)傳送的波特率高n倍。在同步通信時,波特率因子n必須等于1。
================================================
?
UART波特率配置:
 UART模塊中有四個UART波特率除數(shù)寄存器,分別是UBRDIV0,UBRDIV1,UBRDIV2和UBRDIV3。
 存儲在波特率除數(shù)寄存器(UBRDIVn)中的值:
DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16
 ?
PLCK:DIV_VAL = (PCLK / (bps x 16))?
 或者
SLCK_UART:DIV_VAL = (SCLK_UART / (bps x 16))?
簡單來說:
內部系統(tǒng)時鐘源 ? PCLK
 外部時鐘源 ? ? ? ? ?SCLK_UART
?
其中,除數(shù)應該是從1到(216-1)。
 使用 UDIVSLOT,可以更準確地生成波特率。
 例如,如果波特率是 115200 bps,SCLK_UART 是 40 MHz,則 UBRDIVn 和 UDIVSLOTn 是:
DIV_VAL = (40000000 / (115200 x 16)) -1
 = 21.7 -1
 = 20.7
?
UBRDIVn = 20(DIV_VAL的整數(shù)部分)
 (UDIVSLOTn中1的個數(shù))/ 16 = 0.7 ?(21.7 小數(shù)點后為 0.7)
 那么(UDIVSLOTn中的1的個數(shù))= 11 (取整數(shù)部分)
 所以,UDIVSLOTn 可以是16'b ? 1110_1110_1110_1010或 16'b 0111_0111_0111_0101 等
建議按照下表所述選擇UDIVSLOTn,即?UDIVSLOTn = 0xDDD5?
?
回到我們自己的開發(fā)板上來:
我們在?《2》UART 模式控制寄存器 UCONn 中有提到?PCLK、SCLK_UART,其中的我們選擇的是 PCLK。
?PCLK:DIV_VAL1) = (PCLK / (bps x 16) )?
?
?
=============================================
其中 PCLK 的值是怎么得到的呢?
查看芯片手冊?CLOCK DOMAINS?(p-353)?
S5PV210由三個時鐘域組成,即主系統(tǒng)(MSYS),顯示系統(tǒng)(DSYS)和外設系統(tǒng)(PSYS),如圖3-1所示。
 ?MSYS域包括Cortex A8處理器,DRAM內存控制器(DMC0和DMC1),3D內部SRAM(IRAM和IROM),INTC和配置接口(SPERI)。 Cortex A8僅支持同步模式,因此它必須與200MHz AXI總線同步運行。
 ?DSYS域包含顯示相關模塊,包括FIMC,FIMD,JPEG和多媒體IP(所有其他模塊)在X,L和T塊中提到的IP),如圖3-1所示。
 ?PSYS域用于安全性,I / O外圍設備和低功耗音頻播放。
 ?每個總線系統(tǒng)分別工作在200 MHz(最大),166 MHz和133 MHz。 有異步總線橋(BRG)在兩個不同的域之間。
?
在這里,得出 PCLK_PSYS 為 66 MHz。
=============================================
如果波特率是 115200 bps,PCLK 是 66 MHz,則 UBRDIV2 和 UDIVSLOT2 是:
?
DIV_VAL = (66000000 / (115200 x 16)) -1
 = 35.8 -1
 = 34
?
UBRDIV2 = 34(DIV_VAL的整數(shù)部分)
 (UDIVSLOTn中1的個數(shù))/ 16 = 0.8 ?(35.8 ?小數(shù)點后為 0.8)
 那么(UDIVSLOTn中的1的個數(shù))= 13 ?(四舍五入)
按照上表所述選擇UDIVSLOT2,即?UDIVSLOT2 = 0xDFDD
(3)總結
《1》GPA1CON 寄存器 ?(配置寄存器) 將其配置成UART2收/發(fā)模式
GPA1CON 地址為 0xE020_0020
GPA1CON &= ~(0xff<<0); ? ?//清空bit 0-7
GPA1CON |= 0x22; ? ?//設置 0010 0010 ?接受 發(fā)送
《2》GPA1PUD 寄存器(上下拉電阻控制寄存器 )
GPA1PUD 地址為 0xE020_0028
GPA1PUD &= ~(0x0f<<0); ?//0000 禁止上拉下拉
《3》UART 行控制器 ULCONn (數(shù)據(jù)位寬度為 8bit,停止位 1位,無校驗位,正常模式)
ULCON2 地址為 0xE290_0800
ULCON2 = 0x03;
《4》UART 模式控制寄存器 UCONn(接收/發(fā)送模式選擇輪詢,正常發(fā)送暫停信號,回環(huán)模式為正常,時鐘源選擇 PCLK)
UCON2 地址為 0xE290_0804
UCON2 = 0x05;
《5》UART FIFO 控制寄存器UFCONn(禁止 FIFO)
UFCON2 地址為 0xE290_0808
UFC0N2 = 0X00;
《6》UART 收/發(fā) 狀態(tài)寄存器 UTRSTATn(接收緩沖區(qū)數(shù)據(jù)準備好,緩沖區(qū)為空;發(fā)送緩沖區(qū)寄存器為空)
UTRSTAT2 地址為 0xE290_0810?
UTRSTAT2 = 0x02;
《7》UART 發(fā)送緩沖寄存器(保持寄存器和FIFO寄存器)UTXHn
UTXH2 地址為 0xE290_0820
char c = 'A';
UTXH2 = C;
《8》UART接收緩沖寄存器(保持寄存器和FIFO寄存器)URXHn
URXH2 地址為 0xE290_0824
char d;
 d = URXH2 & 0xFF;
《9》UART 通道波特率分頻寄存器?UBRDIVn(設置波特率為 115200)
UBRDIV2 地址為 0xE290_0828
UBRDIV2 = 34;
《10》UART通道分割插槽寄存器 UDIVSLOTn
UDIVSLOT2 地址為 0xE290_082C
UDIVSLOT2 = 0xDFDD;
四、編寫驅動程序
?
此處用到關鍵字 volatile,參看:C語言再學習 -- 關鍵字volatile
和預處理器 #define,參看:C語言再學習 -- C 預處理器
對比:S5PV210開發(fā) -- GPIO
(1)頭文件 uart.h
#ifndef __UART_H__ #define __UART_H__ #define GPA1CON *((volatile unsigned int *)0xE0200020) #define GPA1PUD *((volatile unsigned int *)0xE0200028) #define ULCON2 *((volatile unsigned int *)0xE2900800) #define UCON2 *((volatile unsigned int *)0xE2900804) #define UFCON2 *((volatile unsigned int *)0xE2900808) #define UTRSTAT2 *((volatile unsigned int *)0xE2900810) #define UTXH2 *((volatile unsigned int *)0xE2900820) #define URXH2 *((volatile unsigned int *)0xE2900824) #define UBRDIV2 *((volatile unsigned int *)0xE2900828) #define UDIVSLOT2 *((volatile unsigned int *)0xE290082C)#define PCLK 66000000//66MHzextern void uart0_init(void); extern void uart_test(void); extern void uart_putc(char ); extern void uart_puts(char *); extern char uart_getc(void); extern void uart_gets(char *, int);#endif(2)uart.c
#include "uart.h" void uart2_init(void) {/*配置GPA1_0 GPA1_1管腳為uart功能*///配置串口管腳GPA1CON &= ~(0xff<<0);GPA1CON |= 0x22;//禁止兩個管腳內部上拉下拉電阻GPA1PUD &= ~(0x0f<<0);//配置串口寄存器/*8N1 115200 輪詢*/ULCON2 = 0x03;UCON2 = 0x05;UFCON2 = 0x00;UBRDIV2 = PCLK/(115200*16) - 1;/*reference P879*/ UDIVSLOT2 = 0xDFDD; }void uart_putc(char c) {/*判斷UTXH2中是否為空* UTRSTAT2 bit2 1,空0,非空*/while(!(UTRSTAT2 & 0x02)) ; UTXH2 = c;if(c == '\n'){uart_putc('\r');} } void uart_puts(char *s) {while(*s){uart_putc(*s);s++;} }void uart_test(void) {/*輸出數(shù)據(jù)到PC*/uart_puts("\n helloworld! \n"); }char uart_getc(void) {/** UTRSTAT2 bit0 1,代表接收到數(shù)據(jù)* 0,沒有接收到數(shù)據(jù)* */while(!(UTRSTAT2 & 0x01));return (char)(URXH2&0xff); }void uart_gets(char *buf, int max) {int i = 0;char tmp = 0;while(i < (max-1)){tmp = uart_getc();/*回顯*/uart_putc(tmp);buf[i] = tmp;if(tmp == '\r'){break;}i++;}/*"abc\r" "abc\0"*/buf[i] = '\0'; }(3)main.c
#include "uart.h"#define CMD_MAX_LEN 32char cmd[CMD_MAX_LEN]; int main() {/*8n1 115200 輪詢模式*/uart2_init();while(1){/*發(fā)送命令提示符*/uart_puts("\narmshell##");/*接收PC機端的輸入*/uart_gets(cmd, CMD_MAX_LEN);/*執(zhí)行用戶命令*/}return 0; }(4)Makefile
NAME=uart BIN=$(NAME).bin OBJ=main.o uart.o ELF=$(NAME).elfCFLAGS=-nostdlib LDFLAGS=-nostdlib -nostartfiles$(BIN):$(ELF)arm-none-linux-gnueabi-objcopy -O binary $(ELF) $(BIN) $(ELF):$(OBJ)arm-none-linux-gnueabi-ld $(LDFLAGS) -T uart.lds $(OBJ) -o $(ELF)%.o:%.carm-none-linux-gnueabi-gcc $(CFLAGS) -c $< -o $@ clean:rm -f $(OBJ) $(ELF) $(BIN)(5)uart.lds
ENTRY(main)SECTIONS {. = 0xc0008000;.text :{main.o(.text)*(.text)}.data :{*(.data)}.bss :{*(.bss)} }五、編譯下載到開發(fā)板并執(zhí)行
使用 tftp 將 uart.bin下載到 SDRAM 的 0xc0008000 位置
? ? tftp c0008000 uart.bin
? ? go c0008000
?
OK,此時可以回顯 armshell##,輸入32bit字符回車。
六、問題分析
不知道有沒有人發(fā)現(xiàn)寄存器配置是有問題的。哪里有問題呢?
。
。
。
。
答案是:波特率
這里的UART很明顯是RS232通信。其最大傳輸速率為20Kbps。
因此波特率怎么用的是 115200bps呢?應該為 9600bps才對吧?
?
然后網上有看到這樣一句話:
RS232協(xié)議并未規(guī)定最大傳輸速率,而是規(guī)定“速率低于20kb/s時,傳輸距離可以到15m”。隨著距離減小,這個速率可以提高。RS232中一個波特包括一個bit。所以波特率與比特率相等。而隨著現(xiàn)在電子科技發(fā)展,芯片驅動接受能力增強。這個速率也在提高,現(xiàn)在PC機都到921600了。不要為“最大傳輸速率”的定義糾結。 協(xié)議并未規(guī)定最大傳輸速率,而是規(guī)定“速率低于20kb/s時,傳輸距離可以到15m”。隨著距離減小,這個速率可以提高。RS232中一個波特包括一個bit。所以波特率與比特率相等。而隨著現(xiàn)在電子科技發(fā)展,芯片驅動接受能力增強。這個速率也在提高,現(xiàn)在PC機都到921600了。不要為“最大傳輸速率”的定義糾結。?
我還是不甘心,繼續(xù)查維基百科:
目前的最新版本是由美國電信工業(yè)協(xié)會(TIA, Telecommunications Industry Association,由EIA所分出的一個組織)所發(fā)行的TIA-232-F,它同時也是美國國家標準ANSI/TIA-232-F-1997(R2002),此標準于2002年受到再確認。在 1997年由TIA/EIA發(fā)行當時的編號則是TIA/EIA-232-F與ANSI/TIA/EIA-232-F-1997。在此之前的版本是TIA/EIA-232-E。[1]
?
最新標準是 TIA-232-F,谷歌這個標準:
參看:Interface Circuits for TIA/EIA-232-F
閱讀翻譯 TIA/EIA-232-F Electrical Specification 這部分內容:
?
所有的232電路傳送電壓信號,而連接器引腳處的電壓不是超過±25 V.所有的引腳必須能夠承受任何其他引腳的短路
 而不會遭受永久性的損害。每一行應該有一個最小負載3kΩ,最大負載7kΩ,通常是接收器電路的一部分。
邏輯0由5V和15V之間的驅動電壓和邏輯1表示在-5V和-15V之間。在接收端,電壓在3V和15V之間代表0和在-3V和-15V之間的電壓代表1。電壓在±3V之間是不確定的,位于過渡區(qū)域。這有效地給了接收器的最小2 V噪聲容限。
最初的電纜長度在RS-232-C中定義為15米;然而,這已經在EIA-232-D和TIA / EIA-232-E中進行了修改,現(xiàn)在已經進行了修改更正確地指定為2500 pF的最大容性負載。這等同于到約15到20米的線路長度,取決于電纜電容。如前所述,232指定了信號的最大轉換速率驅動器輸出為30 V /μs。這個限制與問題多與導線電纜中導體之間的串擾有關。越快越好過渡邊緣,串擾量越大。這個限制,連同司機和接收機使用一個共同的信號地和事實由地電流引入的相關噪聲嚴重限制了最大值數(shù)據(jù)吞吐量。為此,232標準規(guī)定了20 kbit / s的最大數(shù)據(jù)速率。該標準還規(guī)定了單位間隔與上升時間之間的關系通過過渡區(qū)(3 V到-3 V)或tt。這是主要的區(qū)別D和E修訂版。圖2 中更清楚地顯示了這一點。EIA-232-D和數(shù)據(jù)速率高達8 kbit / s,規(guī)定了轉換時間與單位間隔或比特時間tb為最大數(shù)據(jù)速率的4%。在8 kbit / s以上,轉換時間放寬到最大5μs,與數(shù)據(jù)速率無關。都C和E修訂版將tt / tb的比率指定為4%,一直到20 kbit / s。
可以用4%的數(shù)字進一步推斷這一點。最大轉換率為30 V /μs,最大可達數(shù)據(jù)速率為200 kbit / s; 然而,在實踐中,
 這被限制在120kbit / s左右。一些軟件程序運行在傳輸速率為116 kbit / s。此外,在更長的線路長度,最大線路驅動器的驅動電流成為影響數(shù)據(jù)速率的主要特征,取代了30-V /μs的壓擺率。隨著線路長度的增加,負載電容也增加,需要更多的電流保持不變過渡時間。
圖4中顯示的曲線表示維持電源所需的驅動電流4%的關系在不同的數(shù)據(jù)速率。在當今的低功耗系統(tǒng)中,這個水平的輸出電流在大約20kbit / s以上是不可持續(xù)的。在實踐中,對于更高的數(shù)據(jù)速率,線路長度通常限制在3米左右。大多驅動可以在這條線路上處理更高的傳輸速率嚴重影響電力供應。還顯示了 256kbit / s 的曲線數(shù)據(jù)速率超過了30V /μs的限制。如前所述,需要高數(shù)據(jù)速率(> 200 kbit / s)在整個行業(yè)中廣泛流行。
計算最大線路長度
 到目前為止,已經討論了負載電容方面的線路長度。 為了實際目的,我們不能考慮把這個負載電容的值變成真實的線路長度。 該標準規(guī)定最大線路電容為2500 pF。該對于20pF的接收機,輸入電容將2480pF作為最大線路
 電容。
 接下來,必須考慮使用的電纜類型。 標準232電纜由多家廠商提供有互電容的每米大約100 pF,但必須增加雜散電容。 流浪電容變化很大,取決于線是否是屏蔽。對于屏蔽電纜,雜散電容通常是互電容的兩倍。如圖5所示,對于屏蔽電纜,最大線路長度為20米;對于非屏蔽電纜,它是40多米。
?
這么看來,短距離情況下,RS232使用115200波特率也是可以的。
如需轉載請注明出處:https://blog.csdn.net/qq_29350001/article/details/78579074
總結
以上是生活随笔為你收集整理的S5PV210开发 -- 串口驱动开发的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: S5PV210开发 -- UART 详解
 - 下一篇: 互联网晚报 | 04月07日 星期四 |