TQ210——S5PV210串口通信

TQ210——S5PV210串口通信

 

1、  串行与并行通信

      串行通道中,有效信息被编码后串行的从单根传输线上传送出去。譬如发送ASCII字符’a’,我们可以将’a’对应的ASCII码97(0x61)分作8个bit在传输线上顺序依次传输。

      与串行传输相对应的是并行传输,并行传输一般有多根并列的传输线可以同时传输多个bit数据。譬如8线的并行传输,可以同时传输8个比特。因此在线速相同的情况下并行传输效率更高,但同时布线成本更高。

      串行硬件接口简单,只需要 3 根线:一是底线,二是发送,三是接收。

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

(1)、帧:因为串行通信只有一根传输线,单位时间内只能传输一个比特位,因此要对传输信息进行编码发送。以常用的ASCII编码为例,则传输一个字符的ASCII编码称为一帧。一帧信息包括起始位、数据位、校验位、停止位等部分。

(2)起始位:一帧的开始标志。

(3)数据位:帧内有效数据,长度可配置为6、7、或8bit,一般ASCII编码下均使用8bit数据位。

(4)校验位:可选择奇/偶/无校验

(5)停止位:一帧的停止标志。停止位后传输线变为空闲状态,一直到下一帧的起始位

(6)波特率:串行传输中传输线上每秒钟传输的bit数称为波特率(Baudrate),波特率越大传输速率越快,同时传输对误差和干扰越敏感越容易出错。

 

2、  S5PV210 —— UART4个独立的异步串行IO

      S5PV210的UART支持查询模式(Polling)、中断模式(Interrupt)、DMA模式三种模式

      Polling模式可以用来实现stdio

      中断模式中,CPU可以在不影响主任务的情况下,使用中断响应处理串行通信,因此可以用来实现高效的串行发送和接收。如果开启FIFO模式,效率将更高。

      DMA模式中使用DMA通道来传输信息,适合批量数据的串行传输需要。

      S5PV210的UART模块有两个可选时钟源:PCLKor SCLK_UART。我们大多数选择 PCLK 作为波特 率发生器的时钟源输入。

 

3、  寄存器

(1) ULCON

      ULCON中主要设置串行通信的数据格式,一般会设置为0x03(普通模式、无校验、1停止位、8数据位)。

      UCON中主要设置Tx/Rx中断类型(必须设置为Level,而不能是Pulse,这是S5PV210本身决定的)以及Rx/TxMode(如果不使用DMA,则一般会选择Interruptrequest or polling mode),所以UCON的常规赋值为0x305。

 

(2)UFCON

      UFCON中设置Rx/TxFIFO enable/disable,用来使能或禁止FIFO模式

      如果使能FIFO模式,则同时需要设置各串口的发送与接收FIFO的触发等级

      注意接收时,RxFIFO中的实际值大于RxFIFO的触发等级时会触发RxInterrupt;而发送时,TxFIFO中的实际值小于TxFIFO时即会触发Tx Interrupt。因此一般会先填充TxFIFO然后再使用Tx Interrupt

 

(3)STATUS寄存器

      UTRSTATn寄存器中记录发送(FIFO)空与接收ready状态标志位。我们在发送前必须检查发送空标志位,待其为1时才可发送;接收前必须检查接收好状态位,待其为1时才可去读接收字符。

      UERSTATn寄存器记录通信过程中的错误,如帧错误、奇偶校验错误、覆盖错误等。

      UFSTATn记录FIFO模式下的相关状态标志。

 

(4)发送/接受缓冲器

UART0~3各有一个发送缓冲寄存器和一个接收缓冲寄存器

UART发送时,将要发送的数据(一般为1Byte)放入UTXHn即可

UART接收时,从URXHn读取接收到的数据

 

(5)波特率设置寄存器

      S5PV210的UART波特率设置寄存器与S3C2440等有很大不同,除UBRDIVn外增加了UDIVSLOTn寄存器作为精细调节以减小误差。

对于UBRDIVn:

       DIV_VAL = (PCLK / (bps x 16))  −1

       or DIV_VAL = (SCLK_UART / (bps x 16)) − 1

对于UDIVSLOTn:

       DIV_VAL = UBRDIVn + (num of 1's inUDIVSLOTn)/16

 比如配置波特率为 115200bps,时钟源选择 PCLK=66MHz
DIV_VAL = (66000000/(115200 x 16))-1 =35.8 - 1 = 34.8
UBRDIV0 = 34 ( DIV_VAL 的整数部分)
(num of 1's in UDIVSLOTn)/16 = 0.8 ( DIV_VAL 的小数部分)
(num of 1's in UDIVSLOTn) = 12
UDIVSLOT0 = 0xDDDD (查表)

 

(6)UARTINTERRUPT1

      当一个UARTinterrupt来临时,会在UINTSP寄存器中产生一个相应bit的挂起标志。同时若UINTM中相应bit设置为中断允许,则会在UINTP中产生一个中断挂起。


(7)UARTINTERRUPT2

      UART使用的中断共有4个,其中常用的是接收中断RXD。串口模块使能RXDInterrupt时,当串口接收到信息时则会触发中断,CPU响应中断并从URXHn读出数据。中断机制的引入,使CPU具有了一边执行主程序、一边进行串口通信接收的宏观上的并行能力。

 

4、串口编程操作步骤如下:
(1)、配置时钟,选择时钟源
(2)、配置 ULCONn 寄存器:设置数据位、停止位、 校验位、模式
(3)、配置 UCONn 寄存器:设置数据接收和发送模式、时钟源
(4)、设置 UFCONn:启用或静止 FIFO
(5)、配置 UBRDIVn 和 UDIVSLOTn:计算波特率
(6)、发送数据:等待发送器为空,将要发送的 8 位数据赋给发送缓存寄存器 UTXHn
(7)、接收数据:等待接收缓冲区有数据可读,从接收缓存寄存器 URXHn 中取出数据

 

.global _start                                  
_start:bl uart_init                  /* 串口初始化*/bl main                       /* 跳转到C函数去执行*/
halt:b halt

#define GPA0CON           *((volatile unsigned int *)0xE0200000)
#define ULCON0            *((volatile unsigned int*)0xE2900000)
#define UCON0             *((volatile unsigned int*)0xE2900004)
#define UFCON0            *((volatile unsigned int*)0xE2900008)
#define UTRSTAT0          *((volatile unsigned int *)0xE2900010)
#define UTXH0             *((volatileunsigned int *)0xE2900020)
#define URXH0             *((volatile unsigned int*)0xE2900024)
#define UBRDIV0           *((volatile unsigned int *)0xE2900028)
#define UDIVSLOT0         *((volatile unsigned int*)0xE290002C)/* UART0初始化*/
void uart_init()
{/*** 配置GPA0_0为UART_0_RXD** 配置GPA0_1为UART_0_TXD*/GPA0CON &= ~0xFF;GPA0CON |= 0x22;/* 8-bits/One stop bit/No parity/Normalmode operation */ULCON0 = 0x3 | (0 << 2) | (0<< 3) | (0 << 6);/* Interrupt request or polling mode/Normaltransmit/Normal operation/PCLK/*/UCON0 = 1 | (1 << 2) | (0 <<10);/* 静止FIFO*/UFCON0 = 0;/*** 波特率计算:115200bps** PCLK = 66MHz** DIV_VAL = (66000000/(115200 x 16))-1 =35.8 - 1 = 34.8** UBRDIV0 = 34(DIV_VAL的整数部分)** (num of 1's in UDIVSLOTn)/16 = 0.8** (num of 1's in UDIVSLOTn) = 12** UDIVSLOT0 = 0xDDDD (查表)*/UBRDIV0 = 34;UDIVSLOT0 = 0xDDDD;
}static void uart_send_byte(unsigned char byte)
{while (!(UTRSTAT0 & (1 << 2)));  /* 等待发送缓冲区为空*/UTXH0 = byte;                               /* 发送一字节数据*/          
}static unsigned char uart_recv_byte()
{while (!(UTRSTAT0 & 1));             /* 等待接收缓冲区有数据可读*/return URXH0;                               /* 接收一字节数据*/          
}void putchar(int c)
{uart_send_byte(c);/* 如果只写'\n',只是换行,而不会跳到下一行开头*/if (c == '\n')uart_send_byte('\r');
}int getchar()
{int c;c = uart_recv_byte();return c;
}void puts(char *str)
{char *p = str;while (*p)putchar(*p++);putchar('\n');
}

#define GPC0CON          *((volatile unsigned int *)0xE0200060)
#define GPC0DAT          *((volatile unsigned int*)0xE0200064)int main()
{int c;GPC0CON &= ~(0xFF << 12);GPC0CON |= 0x11 << 12;            // 配置GPC0_3和GPC0_4为输出GPC0DAT &= ~(0x3 << 3);           // 熄灭LED1和LED2puts("UART Test in S5PV210");puts("1.LED1 Toggle");puts("2.LED2 Toggle");puts("Please select 1 or 2 to Togglethe LED");while (1){c = getchar();                     // 从串口终端获取一个字符putchar(c);                        // 回显putchar('\r');if (c == '1')GPC0DAT ^= 1 << 3;       // 改变LED1的状态else if (c == '2')GPC0DAT ^= 1 << 4;       // 改变LED2的状态}return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

try...catch()

try { //执行的代码&#xff0c;其中可能有异常。一旦发现异常&#xff0c;则立即跳到catch执行。否则不会执行catch里面的内容 } catch { //除非try里面执行代码发生了异常&#xff0c;否则这里的代码不会执行 } finally { //不管什么情况都会执行&#xff0c;包括try catch 里…

暴力字符匹配算法的C语言实现

1、聊一聊今天跟大家分享的这个曲子一般是在天气预报和英语试听中出现&#xff0c;不信你听一听绝对有种似曾相识感觉。本篇文章主要是为讲解高效字符匹配算法的一则预告文&#xff0c;跟大家讲讲暴力字符匹配算法以及匹配算法在通信中如何使用。2、暴力匹配算法介绍1聊聊字符匹…

Python 3 学习——函数扩展and迭代器生成器装饰器

Python 学习的第九小节 写此博客 是为了激励自己&#xff0c;并且将自己的心得以及遇到的问题与人分享 一、学习笔记 1. 高阶函数 函数名可以作为函数参数输入 、可以进行赋值、还可以作为返回值。 2.作用域 在Python中&#xff0c;只有模块、类以及函数才会引入新的作用域&…

鲜茄牛肉

鲜茄牛肉 【材料】 嫩牛肉150克、番茄1个、葱2根 调味料 &#xff08;1&#xff09;酒1大匙、酱油1大匙、糖半茶匙、芡汁半大匙、色拉油1大匙 &#xff08;2&#xff09;酱油1大匙、盐1/4茶匙、糖1茶匙、芡汁1大匙 【作法】 1.牛肉切薄片&#xff0c;拌入调味料&#xf…

AfxParseURL

AfxParseURL AfxParseURL(LPCTSTR pstrURL,DWORD& dwServiceType,CString& strServer,CString& strObject,INTERNET_PORT& nPort)。 目录 1 功能 2 定义 3 返回值 4 例子 5 关于 功能 编辑 该函数解析URL字符串并返回服务的类型及组件,包含在 afxinet…

TQ210 —— LCD

TQ210 —— LCD一、LCD控制器1、S5PV210 LCD控制器要使一块LCD正常的显示文字或图像&#xff0c;不仅需要LCD驱动器&#xff0c;而且还需要相应的LCD控制器。在通常情况下&#xff0c;生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起&#xff0c;而LCD控制器则是…

P1372 又是毕业季I

题目背景 “叮铃铃铃”&#xff0c;随着高考最后一科结考铃声的敲响&#xff0c;三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍&#xff0c;憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑和泪水&#xff0c;全凝聚在毕业晚会上&#xff0c;相信&#xff0c;这一定是…

微信表情都戒烟了

昨天看到最新的微信表情是这样的原来的抽烟表情被替换成了这释放出一个信号&#xff0c;就是「抽烟不酷了」不过我想说&#xff0c;只戴着一个绿帽子&#xff0c;嘴巴里面什么都没有&#xff0c;好像也不酷啊。难道重点就是那个墨镜????&#xff1f;不过&#xff0c;在PC版…

这个代码应该怎么写???

这个代码应该怎么写??? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiDB/html/delphi_20061222151309162.html我用DELPHI和SQL SEVER做了一个系统,现在一个窗口做了一个 帮助按键,我想点它就能打开一个名为help.txt的使用帮助文档,代码要怎么写? 麻烦高…

Python 类的属性和实例属性 Python 的动态语言

#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa 10... #对类 Aa实例化出一个实例 a1>>> a1 Aa() >>> print(a1.__dict__)#查看实例并没有自己的方法和属性{}>>> a1.aaa #但是这个实例在调用属性的时候, 发现自己没有这个属性, 于…

高效KMP字符匹配算法就这么简单

1、聊一聊上一篇文章"暴力"字符匹配算法的C语言实现2、KMP算法介绍1KMP介绍KMP是一种字符匹配算法&#xff0c;为啥叫KMP呢&#xff1f;因为是由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt大佬提出来的。那一些小伙伴会问了怎么不叫"DJV算法"呢?因为老外…

安装MyEclipse得心得

我使用的MyEclipse是MyEclipse_5.5.1GA_E3.2.2_Installer.exeEclipse是eclipse-SDK-3.2-win32Tomcat是Tomcat 6.0JDK是jdk-6u7-windows-i586-p.exe来搭建得JSP开发环境要说Java最麻烦的还是搭建环境&#xff0c;尤其对于我这种菜鸟级的人来说简直是一个小小得错误就让我停滞很久…

TQ210 —— NandFlash

TQ210 —— nandflashTQ210 开发板板载一片 1Gbyte 的 NAND FLASH——K9K8G08U0B&#xff0c;通过查询K9K8G08U0B 芯片手册可以得到如下信息&#xff1a;&#xff08;理论知识不再介绍&#xff09;K9K8G08U0B : (1G 32M) x 8bit 总大小Data Register : (2K 64) x 8bit 数据寄…

涂鸦赞助的500个开发套件,先到先得

来源 | 涂鸦跟涂鸦申请的福利&#xff0c;给喜欢开发的同学发放开发套件&#xff0c;只要是不是专门白嫖党&#xff0c;数量可以不做限制。去年疫情突发&#xff0c;封城、封小区以及人员隔离&#xff0c;让原本享受千般宠爱的主子们变成了靠吃猫砂、塑料袋度日的小可怜&#x…

Oracle 1204 RAC failover 测试 (二)

1.检查数据库状态,状态正常 [oracleracdb01 rac]$ crs_stat -t Name Type Target State Host ------------------------------------------------------------ ora.rac.db application ONLINE ONLINE racdb01 ora....s1.…

ARM中断返回地址详细分析

ARM中断返回地址详细分析 在ARM体系中&#xff0c;通常有以下3种方式控制程序的执行流程&#xff1a;1、在正常执行过程中&#xff0c;每执行一条ARM指令&#xff0c;程序计数器PC的值加4个字节&#xff1b;每执行一条Thumb指令&#xff0c;程序计数器PC加2个字节。整个过程是顺…

C++识别二维码

C识别二维码 https://blog.csdn.net/coolingcoding/article/details/25804129 https://blog.csdn.net/sw5131899/article/details/52848957 https://blog.csdn.net/weichaohnu/article/details/8275829

Linux-C 编程 / 网络 / 超迷你的 web server

一、为生活寻找固定的支撑点1. 什么是生活的支撑点&#xff1f;让自己感到些许痛苦&#xff0c;但却会带来实实在在的充实感和成就感的事情。举个栗子&#xff0c;我的支点是运动、看书、研究技术。2. 固定的支撑点很重要&#xff1a;三个固定的要素&#xff1a;时间 / 空间 / …

20165326 java第四周学习笔记

第四周学习笔记 ch5 子类和父类子类只能有一个父类使用关键字extendsyclass 子类 extends 父类系统默认的祖先类Object&#xff08;java.lang包中&#xff09;继承&#xff1a;子类继承父类的方法可以直接作为实例方法调用&#xff0c;继承的成员变量和方法的访问权限不变&…

用VSTS进行网站压力测试

VSTS提供了一个丰富、强大的工具平台&#xff0c;融合了软件开发领域的各个角色&#xff0c;涵盖软件开发生命周期的各个阶段&#xff0c;包括设计&#xff0c;开发&#xff0c;测试&#xff0c;管理&#xff0c;而这一整套构件的融会贯通&#xff0c;让它可以有效地改善软件开…