一、UART原理说明

通用异步收发器简称UART(Universal Asynchronous Receiver/Transmitter),它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,将串行数据收集放在缓冲区中,CPU就可以读取UART获得这些数据。串口之间以全双工方式传输数据,最精简的连线只有三根线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平,连线如下图:

UART使用标准的TTL/CMOS逻辑电平(0-5V、0-3.3V、0-2.5V、0-1.8V)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOS逻辑电平转换为RS232逻辑电平,3-12V表示0,-3--12V表示1。

TxD、RxD数据线以‘位’为最小单位传输数据。帧由具体完整意义的、不可分割的若干位组成,它包含开始位、数据位、校验位、停止位。发送数据之前UART之间要约定好数据的传输速率(每位所占用的时间,其倒数称为波特率)、数据的传输格式(有多少数据位、是否使用校验位、是奇校验还是偶校验,有多少个停止位)。

数据传输如下图:

(1)、平时数据线处于“空闲”状态(1状态)

(2)、当要发送数据时,UART改变TxD数据线的状态(变为0状态)并维持1位的时间,这样接收方检测到开始位后,再等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。

(3)、UART一帧中可以有5、6、7、8位数据,发送方一位一位地改变数据线的状态将它们发送出去,首先发送最低位。

(4)、如果使用校验功能,UART在发送完数据后,还要发送1个校验位。有两种校验法:奇校验、偶校验(数据位连同校验位中,“1”的数目是奇数还是偶数)。

(5)、最后,发送停止位,数据线恢复到“空闲”状态。停止位的长度有3种:1位、1.5位、2位。

二、S3C2440 UART的特性

s3c2440中UART,有三个独立的通道,每个通道都可以工作于中断模式或DMA模式,即UART可以发出中断或DMA请求以便在UART、CPU间传输数据。UART由波特率发生器、发送器、接收器和控制逻辑组成。



使用系统时钟时,s3c2440可以达到115.2Kbit/s;s3c2440UART的FIFO深度为64字节。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到“发送移位器”中,发送移位器将数据一位一位地发送到TxD数据线上(根据设定的格式,插入开始位、校验位、停止位)。接收数据时,“接收移位器”将RxD数据线上的数据一位一位接收进来,然后复制到接收FIFO,CPU即可从中读取数据。

UART结构图

三、s3c2440UART的使用



在使用UART之前需要设置波特率、传输格式(有多少个数据位、是否使用校验位、是奇校验还是偶校验、有多少个停止位、是否使用流量控制);对于s3c2440还要设置相应的管脚位UART功能、选择UART通道工作模式为中断模式还是DMA模式,设置好后,往某个寄存器写入数据即可发送,读取某个寄存器即可得到接收到的数据。可以查询状态寄存器或设置中断来获知数据是否已经发送完毕、是否已经接收完毕。



具体操作方法:



1、将所涉及的UART通道管脚设为UART功能

比如UART0,GPH2、GPH3分别用作TxD0、RxD0,要使用串口通道0时,先设置GPHCON寄存器将GPH2、GPH3引脚功能设置为TxD0、RxD0。

2、UBRDIVn寄存器:设置波特率

s3c2440UART的时钟源有三种选择:FLCK/n(n值通过UCON0-UCON2联合设置)、UEXTCLK、PCLK。

根据给定的波特率、所选择的的时钟源的频率。可以通过以下公式计算UBRDIVn寄存器(n为0-2)的值,

给出了计算公式、例子及误差计算



3、ULCONn寄存器:设置传输格式

4、UCONn寄存器:串口控制寄存器

UCONn寄存器用来选择UART时钟源、设置UART中断方式等。

n的值有UCON0、UCON1、UCON2这3个寄存器的[15:12]一起来确定。

5、UFCONn寄存器、UFSTATn寄存器

UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触发阈值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置这个寄存器来复位各个FIFO。

读取USTATn寄存器可以知道各个FIFO是否已满、其中有多少个数据。

不适用FIFO时可以认为FIFO深度为1,使用FIFO时s3c2440FIFO深度64。

6、UMOCONn寄存器、UMSTATn寄存器

这两类寄存器用于流量控制。

7、UTRSTATn寄存器

这个寄存器用来表示数据是否已经发送完毕、是否接收完毕。

8、UERSTATn寄存器

用来表示各种错误是否发生。

9、UTXHn寄存器

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

10、URXHn寄存器

当UART接收到数据,CPU读取这个寄存器,就可以获取数据。



四、UART使用程序

serial.h

  1. void uart0_init(void);
  2. void putc(unsigned char c);
  3. unsigned char getc(void);
  4. int isDigit(unsigned char c);
  5. int isLetter(unsigned char c);

serial.c

  1. #include "s3c24xx.h"
  2. #include "serial.h"
  3.  
  4. #define TXD0READY (1<<2)
  5. #define RXD0READY (1)
  6.  
  7. #define PCLK 50000000 // init.c中的clock_init函数设置PCLK为50MHz
  8. #define UART_CLK PCLK // UART0的时钟源设为PCLK
  9. #define UART_BAUD_RATE 115200 // 波特率
  10. #define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
  11.  
  12. /*
  13. * 初始化UART0
  14. * 115200,8N1,无流控
  15. */
  16. void uart0_init(void)
  17. {
  18. GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
  19. GPHUP = 0x0c; // GPH2,GPH3内部上拉
  20.  
  21. ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位)
  22. UCON0 = 0x05; // 查询方式,UART时钟源为PCLK
  23. UFCON0 = 0x00; // 不使用FIFO
  24. UMCON0 = 0x00; // 不使用流控
  25. UBRDIV0 = UART_BRD; // 波特率为115200
  26. }
  27.  
  28. /*
  29. * 发送一个字符
  30. */
  31. void putc(unsigned char c)
  32. {
  33. /* 等待,直到发送缓冲区中的数据已经全部发送出去 */
  34. while (!(UTRSTAT0 & TXD0READY));
  35.  
  36. /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
  37. UTXH0 = c;
  38. }
  39.  
  40. /*
  41. * 接收字符
  42. */
  43. unsigned char getc(void)
  44. {
  45. /* 等待,直到接收缓冲区中的有数据 */
  46. while (!(UTRSTAT0 & RXD0READY));
  47.  
  48. /* 直接读取URXH0寄存器,即可获得接收到的数据 */
  49. return URXH0;
  50. }
  51.  
  52. /*
  53. * 判断一个字符是否数字
  54. */
  55. int isDigit(unsigned char c)
  56. {
  57. if (c >= '0' && c <= '9')
  58. return 1;
  59. else
  60. return 0;
  61. }
  62.  
  63. /*
  64. * 判断一个字符是否英文字母
  65. */
  66. int isLetter(unsigned char c)
  67. {
  68. if (c >= 'a' && c <= 'z')
  69. return 1;
  70. else if (c >= 'A' && c <= 'Z')
  71. return 1;
  72. else
  73. return 0;
  74. }

s3c2440串口详解的更多相关文章

  1. LPC2478中断控制器以及串口详解

    LPC2478的中断系统 LPC2478使用的是ARM PrimeCell向量中断控制器,一共支持32个中断向量,处于AHB空间便于系统快速访问,在中断向量的硬件优先级上还有一层可以用户自己设计的软件 ...

  2. S3C2440 ADC详解

    S3C2440拥有八通道的十位ADC, 最大转换率为2.5MHz A/D转换器时钟下的500KSPS.A/D转换器支持片上采样-保持功能和掉电模式的操作. 八个通道中有四个通道适用于电阻屏的触摸屏触摸 ...

  3. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  4. C#串口通信程序详解

    C#串口通信程序详解 摘要:创建C#串口通信程序需要注意什么呢?创建C#串口通信程序的步骤是什么?那么本文就向你详细介绍创建C#串口通信程序集体的内容. 在.NET平台下创建C#串口通信程序,.NET ...

  5. 串口通信中ReadFile和WriteFile的超时详解!

    源:串口通信中ReadFile和WriteFile的超时详解! 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题.如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFi ...

  6. 串口通信-MSComm控件使用详解

    串口通信-MSComm控件使用详解 2012年11月13日 09:35:45 他山之石可以攻玉 阅读数:37952更多 个人分类: 控件编程Delphi编程   MSComm 控件通过串行端口传输和接 ...

  7. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  8. 第十六章 IIC协议详解+UART串口读写EEPROM

    十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...

  9. 基于STM32之UART串口通信协议(一)详解

    一.前言 1.简介 写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发 ...

随机推荐

  1. Connection Manager ->> Multiple Flat File Connection & Multiple File Connection

    遍历一个文件夹下的所有文件的方法有两钟:1)使用Multiple Flat File Connection,把所有我们要的文件用"|"作为连接符拼凑出一条connection st ...

  2. Redis 优化之 tcp-backlog

    默认值 511 tcp-backlog:511 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxc ...

  3. 一道算法题-从1到n整数中1出现的次数

    1. 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次. 2. 题目来源 第一次看到是在 ...

  4. 使用mysli防止sql注入

    自从 php5 推出 mysqli 后就开始不提倡使用 mysql_ 开头的接口了,现在使用 mysql_connet 通常调试的时候会报警告说这个不该用 mysqli 使用起来其实更简单 $url ...

  5. easyui学习笔记3—在展开行内的增删改操作

    这一篇介绍在一个展开行内进行的增删操作,如果一行很长有很多的数据,在一个展开行内进行编辑将更加方便. 1.先看引用的资源 <link rel="stylesheet" hre ...

  6. MSSQL注入常用SQL语句整理

    很多情况下使用工具对mssql注入并不完善,所以我们就需要手工注入,一下是本人收集的一些mssql的sql语句. 手工MSSQL注入常用SQL语句 and exists (select * from ...

  7. 使用Vue-cli脚手架

    使用vue-cli脚手架开发vue项目,有以下好处: (1)成熟的Vue项目架构设计. (2)本地测试服务器(热更新). (3)集成打包上线方案. Vue-cli系统要求: Node.js(>= ...

  8. docker-3-常用命令(下)

    importance 1.启动守护式容器 docker run -d 容器名   使用镜像centos:latest以后台模式启动一个容器 docker run -d centos   问题:然后do ...

  9. mapper.xml中动态sql抽取重复项

    mabatis重点是通过标签对sql灵活的组织,通过配置的方式完成输入 输出映射. 1.对mapper.xml中重复的sql抽取统一维护,以及foreach使用 UserMapperCustom.xm ...

  10. h5做的app和原生app的区别

    之所以说h5做的app和原生app的区别,是因为一位博友的问题: 随着 h5 的普及,是不是不再需要开发 app ? 我的回答是要分业务需求,分场合而定. 比如现在的微信小程序这么流行,甚至也取代了不 ...