本系列文章由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7393199
作者:张同浩,邮箱:[email protected]
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设为无效。
串口部分寄存器较多,其实根据需要仔细配置即可。
已经编写好的串口程序如下:
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; }