历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | S3C2440的UART通信

发布者:莫愁前路 来源: 51hei关键字:S3C2440  UART通信  控制器 手机看文章 扫描二维码
随时随地手机看文章

1、UART原理简介

在介绍2440的UART控制器之前,我们首先来了解一下UART的原理

UART:Universal Asynchronous Receiver/Transmitter(通用异步收发送器),用来传输串行数据,发送数据时,CPU将并行数据写入UART,UART按照一定格式在TxD线上串行发出;接收数据时,UART检测到RxD线上的信号,将串行收集放到缓冲区中,CPU即可读取UART获得的这些数据。


UART最精简的连线形式只有3根线,TXD用于发送,RXD用于接收,GND用于提供参考电平。UART之间以帧作为数据传输单位,帧由具有完整意义的若干位组成,它包含开始位、数据位、校验位和停止位。发送数据之前,互相通信的UART之间要约定好数据传输速率(波特率的倒数)、数据的传输格式(多少个数据位、是否使用校验位、奇校验还是偶校验、多少个停止位)。
        
2、S3C2440 UART的特性

S3C2440的通用异步收发器(UART)配有3个独立异步串行I/O(SIO)端口,每个都可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输。如图1所示:每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,

图1 2440UART方框图(带FIFO)

波特率发生器可以由PCLK、FCLK/n或UEXTCLK(外部输入时钟)时钟驱动。UART通过使用系统时钟可以支持最高115.2Kbps的比特率。如果是使用外部器件提供UEXTCLK的UART,则UART可以运行在更高的速度。发送器和接收器各包含一个64字节的FIFO和数据移位器。要发送数据时,先将数据写入到FIFO接着在发送前复制到发送移位器中,随后将数据从发送数据引脚(TXDn)移出;接收数据时,从接收数据引脚(RXDn)移入收到的数据,接着从移位器复制到FIFO。


3、S3C2440 UART的使用

对于S3C2440,使用UART之前,首选需要对2440的UART模块进行初始化,需要设置波特率、传输格式(多少个数据位、是否使用校验位、奇校验或偶校验、多少个停止位、是否使用流量控制)、选择所涉及的管脚为UART功能、选择UART通道的工作模式为中断模式或DMA模式。设置好之后,往相关寄存器写入数据即可发送,读取相关寄存器即可接收到数据,还可以通过查询状态寄存器或设置中断来获知数据是否发送完毕、是否接收到数据。

我用的开发板是天嵌的TQ2440,该开发板用SP3232EEN扩展了一个RS232串口,电路连接如图2 所示:

图2 RS232原理图

波特率发生器

每个UART的波特率发生器为发送器和接收器提供串行时钟,波特率发生器的时钟源可以选择S3C2440A的内部时钟系统或者UEXTCLK。波特率时钟是通过16和由UART波特率分频寄存器(UBRDIVn)(n=0,1,2)指定的16位分频系数来分频源时钟(PCLK,FCLK/n或者UEXTCLK)产生的,UBRDIVn由下列表达式确定:

UBRDIVn=(int)(UART时钟/(波特率*16))-1

UART时钟:PCLK,FCLK/n或者UEXTCLK,例如,如果波特率为115200bps并且UART时钟为40MHz,则UBRDIVn为:

UBRDIVn=(int)(40000000/(115200*16))-1=(int)(21.7)-1(取最接近的整数)=22-1=21


介绍发送和接收操作之前,先介绍几个重要的寄存器

UBRDIVn寄存器:设置波特率,S3C2440 UART的时钟源有两种选择:PCLK、UEXTCLK、FCLK/n,其中n的值通过UCON0-UCON2联合设置

ULCONn寄存器:设置传输格式

UCONn寄存器:它用于选择UART时钟源、设置UART中断方式

UFCONn寄存器、UFSTATn寄存器,UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触发阙值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置UFCONn寄存器来复位各个FIFO。读取UFSTATn寄存器可以知道各个FIFO是否已经满,其中有多少个数据。


UMCONn寄存器、UMSTATn寄存器,这两类寄存器用于流量控制,具体看数据手册
UTRSTATn寄存器,它用来表明数据是否已经发送完毕、是否已经接收到数据

UERSTATn寄存器,用来表示各种错误是否发生

UTXHn寄存器,CPU将数据写入这个寄存器,UART即会将它保存到缓冲区中,并自动发送出去

URXHn寄存器,当UART接收到数据时,CPU读取这个寄存器,即可获得数据。

下面通过实际的代码来理解2440的UART

首选是UART的初始化,TQ2440将UART0引了一个接口出来,就介绍UART0吧

2440的UART引脚是挂接在GPH上的,所以使用UART之前需要先对GPH的引脚功能进行配置。

void uart0_init(void)
{
    GPHCON  |= 0xaa;    // GPH0,GPH1,GPH2,GPH3分别nCTS0,nRTS0,TXD0,RXD0
    GPHUP   = 0x7ff;     //内部上拉被禁止

UFCON0  = 0x00;     // 不使用FIFO
    UMCON0  = 0x00;     // 不使用流控


    ULCON0  = 0x03;     // 8N1(8个数据位,无校验,1个停止位)
    UCON0   = 0x245;   

// 查询方式,UART时钟源为PCLK,中断请求方式为Tx-电平,Rx-脉冲
   rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //设置波特率
}

接下来几个是进行数据的发送和接收的函数

//======此函数的作用是向UART发送一个字符,不用FIFO,直接用UART发送

void Uart_SendByte(char data)

{

if(data=='n')

{

while(!(rUTRSTAT0 & 0x2));

取出rUTRSTAT0(UART0发送/接收寄存器)寄存器中的第2位,含义为Transmit buffer是否为空,为1时表示空。在发送缓冲器为空时,再发送

// Delay(1);                 //because the slow response of hyper_terminal

       WrUTXH0('r');  //将数据写入到UART0发送缓冲器中

}

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

//  Delay(1);

WrUTXH0(data);

}              

//========发送字符串的函数

void Uart_SendString(char *pt)

{

    while(*pt)

        Uart_SendByte(*pt++);

}


//C语言的可变参数,为了达到printf的功能

//例如:Uart_Printf(“my name is %s”a[10]) ;就相当于Uart_SendString(“my name is XX”);XX是a[10]的内容

void Uart_Printf(char *fmt,...)  

{

       va_list ap;

       char string[256];


       va_start(ap,fmt);

       vsprintf(string,fmt,ap);

       Uart_SendString(string);

       va_end(ap);

}


//==等待,直到UART的发送器为空,就是发送完毕

void Uart0_TxEmpty()

{

while(!(rUTRSTAT0 & 0x4));  //Wait until Tx shifter is empty.

}


//===从终端上获取敲入的字符,返回值为char类型。RdURXH0有数据时,返回URXH的数据。当URXH没有数据时,总是等待,直到有数据。


char Uart_Getch(void)

{

while(!(rUTRSTAT0 & 0x1)); //接收缓冲器接收到有效数据

return RdURXH0();   //从UART0接收缓冲器(URXH0)接收数据

}

//===Uart_GetKey 这个与Uart_Getch 不同的是,当URXH没有数据时返回0。有数据时,返回数据,这个函数可以用来查看当前URXH中的值。

char Uart_GetKey(void)

{

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

return RdURXH0();

else

return 0;

}

//==这个函数用于从终端得到一个字符串,并储存到string中

void Uart_GetString(char *string)

{

    char *string2 = string;

    char c;

    while((c = Uart_Getch())!='r')//’r’是回车键

    {

        if(c=='b')//’b’是backspace按键

        {

            if( (int)string2 < (int)string )

            {

                Uart_Printf("b b");//因为backspace,所以删除最后一个显示的字符

                string--;

            }

        }

        else

        {

            *string++ = c;       //不是回车和退格键,则储存到string中

            Uart_SendByte(c);   //每输入一个字符,都将它输出到终端中

        }

    }

    *string='';

    Uart_SendByte('n');

}


关键字:S3C2440  UART通信  控制器 引用地址:S3C2440的UART通信

上一篇:ARM S2C2410A控制5个LED流水灯
下一篇:ARM汇编指令大全详解

推荐阅读

集微网消息 近日,云南产权交易所公开挂牌拍卖深圳市芯能投资有限公司(以下简称“芯能投资”)、深圳市芯力投资有限公司(以下简称“芯力投资”)各100%股权,挂牌价为别为67822.736万元和100919.189万元,截止日期11月22日。10月27日,韦尔股份发布公告称,公司拟参与在云南产权交易所公开挂牌的云南省城市建设投资集团有限公司(以下简称“云南城投”...
物联网是全球信息产业的发展趋势之一,也是我国“十二五”规划的重点发展方向。目前,国家正在大力发展物联网产业,2010到2015年为物联网导入期,在主导领域实现物物互联;2015年到2020年为成长期,物联网将实现半智能化;2020年之后为发展期,物联网将全面实现智能化。2015年的市场规模就超过2000亿元,预计到2025年将达到7 500亿元,年增长率超过30%,...
据媒体报道,比亚迪高级副总裁廉玉波透露,比亚迪正在预研下一代的高性能、高安全纯电平台,新平台将应用大量创新技术,将充分发挥电动汽车在空间、驾驶性、智能化方面的优势,安全、成本、续航等方面达到燃油车的同等水平,基于全新平台开发首发的车型将于明年上海车展首次发布。 据资料显示,亚迪成立于 1995 年 2 月,经过 24 年的高速发展,已由...
内部Flash STM32芯片内部有一个FLASH存储器,主要用于存储代码。我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行。 除了使用外部的工具(如下载器)读写内部FLASH外,STM32芯片在运行的时候...

史海拾趣

问答坊 | AI 解惑

十种车型的悬架系统和制动系统

上海大众:帕萨特领驭 悬架:前:四连杆独立式 / 后:纵向摆臂式 制动:前通风盘式/后实心盘式,带前轮刹车片磨损过度报警装置,带贯通式双膜片(8+9英寸)真空刹车助力器 东风雪铁龙:富康 悬架:前:麦克弗逊独立式/后:连杆式独立悬架 ...…

查看全部问答∨

逆变

求电鱼机的高压输出要求怎么样才能…

查看全部问答∨

dsp2812学习体会

哈哈,抽时间写了一个博客,说说自己学习dsp2812的体会,欢迎大家共同探讨哦~~~ https://home.eeworld.com.cn/my/space.php?uid=117818&do=blog&id=22384&cid=1945…

查看全部问答∨

尚为科技-机房环境监控专家

尚为科技-机房环境监控专家,机房环境监控产品专业厂商,产品具有稳定、易用、低功耗的特点,产品经过了权威部门的测试,已形成较完整的产品系列和行业解决方案,获得良好的用户口碑。 欢迎来电垂询,电话:0592-5204071 6300605 6300607   ...…

查看全部问答∨

关于linphone在ARM上的移植

各位大侠,谁在ARM上移植linphone进行通话成功过?我移植后没有声音,一接通就挂断通话!也可以出价帮助!…

查看全部问答∨

scsi miniport driver问题

谁能介绍一下scsi miniport driver的基本结构…

查看全部问答∨

pc机跟wince同步问题

我用台式机跟研华6552的工控板 wince系统 通过双机互联线连接 台式机ip是192.168.0.12 工控机是192.168.0.192 从台式机上ping 工控机没有问题 但是ActiveSync一直连接不上 ActiveSync图标一直是灰色的 …

查看全部问答∨

有关TCC7901_bsp2.2中的串口问题

现在在调TELECHIPS中的TCC7901芯片板子,TCC7901有6个PORT,但只有4个通道,我老板要我把2。2的BSP中的4个通道都用上,但2。2的BSP默认是把CH0和CH2分别用在了调试和IRda中,所以只有两个串口可用,我的任务就是改CH0和CH2为可用,请问一下有没有调 ...…

查看全部问答∨

发表1个220V输入 0-30V输出 4A 的开关电源PCB

发表1个220V输入 0-30V输出 4A 的开关电源PCB…

查看全部问答∨

谁可以帮忙解释一下FPGA上载方面的问题

为什么有时可以全上载有时可以局部上载,与硬件什么关系?通过STI上载和外挂FLASH上载有什么区别?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved