历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2020年12月06日 | TQ210——S5PV210串口通信

2020-12-06 来源:eefocus

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 —— UART(4个独立的异步串行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和LED2

 

       puts("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;

}


推荐阅读

史海拾趣

DZUS公司的发展小趣事

随着公司实力的增强,DZUS公司开始拓展国际市场。通过参加国际展览、与海外客户建立合作关系等方式,公司逐渐打开了国际市场的大门。同时,公司还针对不同国家和地区的市场需求,推出了定制化的产品和服务。这些举措使DZUS公司的品牌知名度和市场份额不断提升。

德欣(COV)公司的发展小趣事

面对电子行业的快速发展和市场竞争的加剧,德欣公司始终将技术创新作为发展的核心动力。公司不断加大研发投入,引进先进的生产设备和技术人才,加强与高校和科研机构的合作。通过不断的技术创新和产品升级,德欣公司在保持传统产品优势的同时,也成功拓展了新的业务领域,实现了产业升级和可持续发展。

Bce Sud公司的发展小趣事

随着技术的成熟,Bce Sud开始积极拓展市场,与多家电子设备制造商建立了合作关系。通过与这些企业的紧密合作,Bce Sud的产品逐渐应用于智能手机、平板电脑等消费电子产品中。同时,公司还积极寻求与上下游企业的战略合作,共同推动产业链的升级与发展。

Azoteq公司的发展小趣事

近年来,Azoteq在传感技术方面取得了重大突破。其最新产品系列——ProxFusion®,是世界上第一个单芯片集成多传感器功能的解决方案。这一创新产品将多种传感功能集成在一个芯片上,为客户提供了更加便捷、高效的解决方案。ProxFusion®的推出,再次展现了Azoteq在传感技术领域的领先地位。

EMC Technology RF Labs公司的发展小趣事

EMC Technology RF Labs成立于XXXX年,作为EMC Technology公司的一个专门研究射频(RF)技术的实验室。创立之初,RF Labs的目标是为电子通信行业提供高质量的射频元件和解决方案。公司聚集了一批在射频技术领域具有丰富经验和专业知识的工程师,开始了对射频技术的深入研究和探索。

Horizon Electronics Enterprises Group公司的发展小趣事

为了应对市场需求的多样化和技术发展的快速变化,Horizon开始实施多元化产品布局战略。公司不仅继续深耕半导体芯片领域,还逐步拓展至电子元器件、智能设备、物联网解决方案等多个领域。通过自主研发和合作并购等方式,Horizon不断丰富产品线,满足不同客户的多样化需求。这一战略的实施不仅增强了公司的市场竞争力,也为公司的持续发展注入了新的动力。

问答坊 | AI 解惑

上海交大:我国汽车电子产业发展的技术障碍与攻关战略

演讲主题:我国汽车电子产业发展的技术障碍与攻关战略 演讲嘉宾:上海交通大学 许敏 主要议题: 1、我国汽车电子的产业发展与研发现状 2、我国汽车电子产业发展的技术障碍 3、我国汽车电子产业发展的攻关战略 重点论述了我国汽车电子产 ...…

查看全部问答>

Magma设计方法解决65纳米设计复杂性

在65纳米节点,单个芯片中可容纳数亿规模的门电路。其高复杂性使层次化设计流程变得极为耗时,同时要达到良率要求也很困难。要想及时解决这些问题,高水平的IC自动化设计技术以及对流程中功耗、良率、片上变异(OCV)和多种模式的优化和分析等功能的 ...…

查看全部问答>

请问如何用单片机模拟SPI来访问SD卡阿????????

我网上看了很多程序,都不可以,像看看怎么样能模拟访问,…

查看全部问答>

刚才看一网友做的频率计有句代码不解

if(flag_1s==1) { tmp=T0count*65536+TH0*256+TL0 } 一秒计数的脉冲为何是tmp=T0count*65536+TH0*256+TL0,不是每次中断都T0count++?…

查看全部问答>

请教隔离电源品牌

请教前辈, 哪个牌子的隔离电源的可靠性高一点? 现在需要用一块小功率的隔离电源, 24Vin 5Vout.…

查看全部问答>

请问各位大侠,我需要一些用C实现的关于Wi-Fi数据传输的指导。请赐教。

我是新手 ,请大侠们赐教,使用Wi-Fi传输到底是个什么样的过程,怎么用C实现啊?比如说,我现在电脑上有一些视频文件,需要传输到另外一个电脑上,怎么用C实现?谢谢。…

查看全部问答>

请教USB host 的问题

我的开发板起来之后,我插入U盘,它会认出来harddisk。但如果我插入它开机,系统就不会认出来有U盘。 请问这该怎么处理啊?怎么让系统一起来就识别U盘? 另外一个问题,如果我开发代码,我该怎么判断u盘有没有插入?createfile(harddisk...)?还 ...…

查看全部问答>

倒车雷达系统的改进

倒车雷达,现在已普遍应用,但往往在探测范围上存在一定的盲区。由于雷达探头安装位置的关系,当车后方的障碍物过低、过高或角度超过探头侦测的范围时,倒车雷达便会失效。像一些人行道台阶,大石头等低矮的障碍物,或是一些很高的箱式货车等较高的 ...…

查看全部问答>

我很纠结啊!大家说说我怎么办呢。。。。

 纠结死了,举办的征文活动大家都很积极,参加的人很多啊!大家写的也很好啊,可是奖项是一定的,按照投票的话,大家都差不多,这个活动真的很好啊,今天还有热心的朋友发征文,现在我就在纠结啊!这个到底怎么选择呢?六个奖品到底给谁啊?太 ...…

查看全部问答>

【北京】需要一名的硬件底层研发工程师,专注信息安全!

岗位职责: 1. 电路原理图、PCB设计,固件程序开发 任职资格: 1、大学本科及以上学历,1年以上工作经验,电子/通讯等相关硬件专业毕业; 2、能熟练阅读英文资料,能承受压力,为人正直,踏实; 3、有团队合作经验,熟悉电子产品开发 ...…

查看全部问答>