文档章节

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

For_MGP
 For_MGP
发布于 2014/11/03 18:00
字数 1149
阅读 56
收藏 0

本系列文章由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设为无效。


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

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

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;      
}


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

For_MGP
粉丝 2
博文 66
码字总数 20576
作品 0
深圳
程序员
私信 提问
求深圳嵌入式c相关的实习工作

1、开发语言: 熟悉Linux环境下的C语言编程,了解常用数据结构及通用算法(,具有良好的编码习惯。 2、开发环境: 熟练使用Linux操作系统,熟练使用gcc、vim 等工具进行代码编写和调试,熟悉...

黄润星
2012/11/17
519
1
Samsung ARM处理器iROM启动模式介绍

最近在使用三星S3C2416这个处理器,需要在EBOOT 上实现SD卡文件系统,并从SD卡中烧写wince系统,与S3C2416的从SD卡启动不同。我用的BSP是 SMDK2416WinCE50PMREL0.01_080611的,Bootloader文件...

慎思
2012/09/10
323
0
S3C6410和DM9000驱动

添加DM9000驱动 Linux 内核下的 drivers/net/dm9000.c 实现了与体系结构无关的 DM9000 网卡驱动,只需要在 BSP 的板文件(arch/arm/mach-s3c6410/smdk-6410.c)中定义相关的 platform 设备和数...

慎思
2012/08/09
341
0
《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新《Linux设备驱动开发详解(第3版)》的最新进展。 2015.2.26 几乎完成初稿。 [F]是修正或升级;[N]是新增知识点;[D]是删除的内容 第1章 《Linux设备驱动概述及开发环境构建》 [D...

21cnbao
2015/02/26
0
0
《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

本博实时更新《Linux设备驱动开发详解(第3版)》的最新进展。 目前已经完成稿件。 2015年8月9日,china-pub开始上线预售: http://product.china-pub.com/4733972 2015年8月20日,各路朋友报喜...

21cnbao
2014/06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
34分钟前
83
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
43分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
46分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
52分钟前
5
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部