s3c6410 s3c2440串口發送接收數據的實現(輪詢)及相關寄存器
一 需要設置的寄存器(其實進入uboot后,串口已經設置好了,直接發送數據就行了,)
1)模式
UCON (輪詢,中斷,DMA等)
2)相關參數
ULCON0 定義了串口數據的幀格式,數據位長度,奇偶校驗位,停止位(8-N-1)
BRDIV 定義了波特率的計算公式所得結果的整數部分
UDIVSLOT0 定義了波特率的計算公式所得結果的小數部分
3)高級選項(串口的發送接收緩沖的大小(fifo)默認是1B,可改成64B
二 發送接收數據
相關的寄存器
UTXH0 UART channel 0 transmit buffer register
URXH0UART channel 0 receive buffer register(這兩個寄存器和51的SBUF相似)
UTRSTAT0 UART channel 0 Tx/Rx status register
[2:0]中
[2] 如果發送buffer空且發送移位器空時置1,反之置0
[1] 如果發送buffer空則置1;
[0] 如果接收buffer接收到有效數據,則置1,反之置0;
發送時看2位,接收時看0位;
2410下的發送接收函數(6410 和 2440 的串口實現基本一樣,改改地址就行,個別的寄存器值的計算不同)
void uart_putchar(unsigned char k)
{
while(!(UTRSTAT0&0x04)); //如果UTRSTAT 2位是0,則一直循環,直到為1(transmit buffer is empty,can transmit data)
UTXH0 = k;
}
unsigned char uart_getchar(void)
{
unsigned char c;
while(!(UTRSTAT0&1<<0)); // 如果UTRSTAT 0位是0(表示沒有有效數據),則一直循環,
c = URXH0;
return c;
}
這樣就可以發送一字節和接收一字節了,可以在寫自己的gets()puts()函數;
當然串口能工作是因為 uboot 已經做了很多工作(串口的初始化);現在可以讀出響應的寄存器值(都是正確的值,可以工作),
寫到自己的uart_init()函數中;
評論