您的位置:首页 > 运维架构 > 网站架构

深入理解ARM体系架构(S3C6410)---UART实例

2013-08-24 11:39 891 查看


转自:http://blog.csdn.net/muge0913/article/details/7393199


深入理解ARM体系架构(S3C6410)---UART实例

本系列文章由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7393199

作者:张同浩,邮箱:muge0913@sina.com

1、  概括OVERVIEW

S3C6410提供了4个独立的异步串行口,每个独立的串行口可以工作在中断模式或DMA模式下。也就是说UART能够产生一个中断或DMA请求。UART可以提供最高3Mbps。每个UART包含2个64位的FIFO,分别用于接收,发送缓冲。

S3C6410 UART 包括可编程的波特率,红外发射接收,1或2个停止校验位,5,6,7,8数据位,和奇偶检验。每个UART包含一个波特率发生器,接收发送和控制单元。

波特率可以由PCLK,EXT_UCLK0或EX_UCLK1锁定。发送接收器分别包含了一个64位FIFO和一个数据移位器。通过向FIFO写入数据,再把FIFO中的数据拷贝到数据移位器中,从而通过TxDn引脚被发送出去。接收数据与之相反:RxDn->datashifter->FIFO.

2、  特性FEATURES

RxD0, TxD0, RxD1, TxD1, RxD2, TxD2, RxD3and TxD3支持DMA格式和中断格式。

UART 0,1,2,3支持红外通信和64位FIFO

UART 0,1支持nRTS0, nCTS0, nRTS1, and nCTS1

支持高速操作。

支持握手操作。



下面将描述数据的发送和接收,中断的产生,波特率的产生,回环模式,红外模式,和自动流控制模式。

3 、 数据发送DATA TRANSMISSION

发送的数据帧是可以编程的,其中包括一个开始位,5~8位数据位,奇偶校验位和1或2个停止位。这些都可以通过线性控制器ULCONn控制。发送器可以产生终止条件,这终止条件能强制在一个帧数据发送时间内使串口输出0状态。

The data framefor transmission is programmable. It consists of a start bit, 5 to 8 data bits,an optional parity bit and 1 to 2 stop bits, which can be specified by the linecontrol register (ULCONn).
The transmitter can also produce the breakcondition, which forces the serial output to logic 0 state for one frametransmission time. This block transmits break signals after the presenttransmission word is transmitted completely. After the break signal transmission,it
continuously transmits data into the Tx FIFO (Tx holding register in thecase of Non-FIFO mode).

4、 数据接收DATA RECEPTION

接收的数据帧是可以编程的,其中包括一个开始位,5~8位数据位,奇偶校验位和1或2个停止位。这些都可以通过线性控制器ULCONn控制。接收器能检测到溢出错误,奇偶校验错误,帧错误,和终止条件。每一个错误都可以设置一个错误标志。

overrun error指的是在一个以前的数据还没有被读走之前新的数据就把此数据覆盖了。

parity error指的是接收器检测到一个非预料的奇偶条件。

frame error指的是收到的数据没有停止位。

break condition指的是RxDn在超过一个数据帧的时间始终保持0状态。

当接收器在三个字的时间内(其间隔根据字长位的设置)没有收到任何数据且RxFIFO为空,产生超时条件。
 

5、 自动流控制AUTO FLOW CONTROL(AFC)

S3C6410中的UART0 和UART1 支持有nRTS和nCTS信号自动控制流。这样,它能连接至外部的UART。如果用户想连接UART到Modem。

则必须通过设置UMCONn禁止自动流并且通过软件来控制nRTS。只有在nCTS信号有效的情况下,UART才会向FIFO中写入数据。在自动流控制中nCTS表示另一个UART已经准备好接收数据了。在接收数据之前,如果FIFO有2个以上空余字节空间则把nRTS设为有效。空余字节空间小于1时,则要把nRTS设为无效。



串口部分寄存器较多,其实根据需要仔细配置即可。

已经编写好的串口程序如下:

[cpp] view
plaincopyprint?

void Uart_Init(void)  

{  

    // UART I/O port initialize (RXD0 : GPA0, TXD0: GPA1)  

    rGPACON = (rGPACON & ~(0xff<<0)) | (0x22<<0);    // GPA0->RXD0, GPA1->TXD0  

    rGPAPUD = (rGPAPUD & ~(0xf<<0)) | (0x1<<0);        // RXD0: Pull-down, TXD0: pull up/down disable  

  

    // Initialize UART Ch0  

    rULCON0 = (0<<6)|(0<<3)|(0<<2)|(3<<0);                    // Normal Mode, No Parity, 1 Stop Bit, 8 Bit Data  

    rUCON0 = (0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);    // PCLK divide, Polling Mode  

    rUFCON0 = (0<<6)|(0<<4)|(0<<2)|(0<<1)|(0<<0);            // Disable FIFO  

    rUMCON0 = (0<<5)|(0<<4)|(0<<0);                        // Disable Auto Flow Control  

  

    rUBRDIV0 = 35;                                    // Baud rate  

    rUDIVSLOT0 = 0x80;//aSlotTable[DivSlot];  

}  

  

  

void Uart_SendByte(int data)  

{  

    while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.  

    //_Delay();  

    WrUTXH0(data);  

}  

  

void Uart_SendString(char *pt)  

{  

    while(*pt)  

        Uart_SendByte(*pt++);  

}  

  

//=====================================================================  

char Uart_GetCh(void)  

{  

           

     while(!(rUTRSTAT0 & 0x1)); //Receive data ready  

        return RdURXH0();  

     

}  

  

char Uart_GetKey(void)  

{  

        if(rUTRSTAT0 & 0x1)    //Receive data ready  

            return RdURXH0();  

        return 0;      

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: