S5PV210串口通信

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/growl_jie_/article/details/52833439

学习一个东西不妨多问问几个为什么?是什么?

什么是通信?
通信,是指人与人或则人与自然之间通过某种行为或媒介进行的信息交流与传递。

通信过程:发送方编码信息-> 通过介质传送 ->接收方接受信息。

什么是电子通信?
介质是电报、电话、网络信号

电子通信相关的概念:

1、同步通信和异步通信
简单来说:发送方和接收方按照相同的频率工作就是同步的。若发送方和接收方不按相同的频率工作就是异步的。
同步通信一般适用于经常需要通信的模式中,异步通信一般运用于不知何时要通信的模式中、

2、电平信号和差分信号
电平信号和差分信号是用来描述通信线路传输方式的。
两种信号在线路上一般转化为1和0的高低电平信号来传输

电平信号如图:这里写图片描述
电平信号的传输线中一般有一条参考电平线(GND)离,上图只能发一位二进制,若要发8位二进制则需要9根线。(电平信号的2根通信线之间电平差异容易收到干扰,不适合远距离和环境恶劣的地方传输)

差分信号如图:这里写图片描述
差分信号的传输是通过2根线电平的差异来传送1和0的。上图也只能发一位二禁止,若要发8位二进制则需要16根线。(差分信号是通过两条线中的电压差来决定的。所以比电平信号更稳定些。)

3、电子通信的基本概念(串行接口和并行接口)
串行接口:一次只能发送一个数据(1位2进制)
并行接口:一次可以发送N位数据(2进制)注:这里的N与数据总线有关。

4.全双工、半双工、单工通信的基本概念
全双共通信:可以同时接收和发送数据。
半双工通信:可以接受或则发送数据,但在同一时间内,只能接受或则发送。
单工通信:只能接收或则只能发送数据。

随着工业的发展比较有用的方式慢慢的显示了出来:异步、串行、差分结合起来是比较适合于通信的,譬如USB和网络通信。

以上都是广义的电子通信的概念,现在我们开始讲串口通信的概念

1、串口通信的特点
串口通信是异步、电平信号、串行。

2、RS232电平和TTL电平
RS232电平的标准是3V~-15V表示1,+3~+15V表示0;
TTL电平的标准是+5V表示1,0V表示0.

不管哪种电平都是为了在传输线上表示1和0.区别在于使用的环境和条件不同。RS232的电平适用于距离比较远、干扰比较大的情况下。TTL的电平适用于距离比较近、干扰比较小的情况下。
一般电脑显示屏的串口插座就是RS232的接口。一般传输距离小于15米;TTL电平一般用于电路板内部两个芯片之间。

3、波特率
波特率:是反应串口通信速度的单位,例如:波特率为15200则每秒钟可以传输15200个二进制。传送每个二进制所需要的时间为(1/15200秒)。

4、起始位、数据位、奇偶效验位、停止位
串口通信时,是按周期传输数据的。1个周期=1个通信单元=1帧=起始位+数据位+奇偶效验位+停止位

5、FIFO模式及功能
典型的串口设计,发送,接收缓冲区只有1个字节,每次发送、接受只能处理一帧数据。这样在单片机中没什么问题,但到复杂的soc中就会导致效率底下。需要CPU不断切换上下文。
FIFO其实是一种数据结构即队列,将发送、接受缓冲区设置为64字节,CPU一个过来直接给发送缓冲区64字节的待发数据,然后transmitter慢慢发,发完再找CPU发送64字节。原本是发送一个字节的内容但是用了FIFO数据结构一次可以发送64字节。

6、DMA模式及功能
如前面的FIFO的作用是差不多的就是为了提高性能,但是DMA模式则是更根本的解决了问题。DMA是直接内存访问,DMA本来是DSP中的一种技术,DMA技术的核心就是在交换数据时不需要CPU参与,模块可以自己完成。DMA模式适合大量数据迸发发送、接收时、

7、IrDA模式及其用法
IrDA是一种红外通信模式,一般电视遥控,空调遥控就是使用这种红外通信,红外通信与串口通信很像,都是接受模拟信号转化为数字信号1和0来作为读取。

6、S5PV210串口的介绍
(1)串口:universal asynoronous reciver and transmitter,通用异步手法器,简称(uart)
这里写图片描述
整个串口控制器包括transmitter和receiver两部分,transmitter负责210向外部发送信息,receiver负责从外部接受信息到210内部。由图可知,该串口有一个APB总线,1个transmitter(内部有transmit buffer register(发送字节寄存器) , transmit shifter(发送移位器)),1个receive shifter(内部有receive shifter(接受移位器), receive buffer register(接受字节寄存器)),1个control unit(时钟控制单元),一个buad-rate generator(波特率产生器)是由时钟源控制的。

工作流程:发送一个数据由时钟信号(外部APB总线PLCK_PSYS,66MHZ)提供给内部的波特率发生器,在波特率进行分频后得到传输的频率,发送方实现禁止TXD,然后CPU发一帧数据给transmitter buffer register,transmitter buffer register直接把数据传入transmitter shifter 让该发送移位器自动移位,发送出去。

接下来开始实战代码的介绍与完成:
实现思路:
1.建立主函数
2.初始化串口通
3.定义串口发送函数
4.定义串口接收函数
5.找到相关的寄存器并宏定义

相关寄存器得到的步骤:
1.找到串口控制器的引脚查原理图找到TX、RX相关的寄存器GPA0_0、GPA0_1、
2、翻阅S5PV210的数据手册:的section 08_connectivity_storage中的
1 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER下的1.6REGISTER MAP分析数据手册得到几个比较关键的寄存器
UCON ULCON UMCON UFCON UBRDIV
分析数据手册得:
(1)ULCON = 0x3 //0效验位、8数据位、1停止位
(2)UCON =0x5 //发送和接收都是polling mode
(3)UMCON0 =0x0 //禁止modem、afc
(4)UFCON0 =0X0 //禁止FIFO模式
(5)UBRDIV0和UDIVSLOT0和波特率有关,要根据公式去算的

void main(void)
{
    //串口初始化
    uart_init();
    //发送一个字符
    uart_putc('a');
}
#define GPA0CON     0xE0200000
#define UCON0       0xE2900004
#define ULCON0      0xE2900000
#define UMCON0      0xE290000C
#define UFCON0      0xE2900008
#define UBRDIV0     0xE2900028
#define UDIVSLOT0   0xE290002C
#define UTRSTAT0    0xE2900010
#define UTXH0       0xE2900020  
#define URXH0       0xE2900024  

#define rGPA0CON    (*(volatile unsigned int *)GPA0CON)
#define rUCON0      (*(volatile unsigned int *)UCON0)
#define rULCON0     (*(volatile unsigned int *)ULCON0)
#define rUMCON0     (*(volatile unsigned int *)UMCON0)
#define rUFCON0     (*(volatile unsigned int *)UFCON0)
#define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)
#define rUDIVSLOT0  (*(volatile unsigned int *)UDIVSLOT0)
#define rUTRSTAT0   (*(volatile unsigned int *)UTRSTAT0)
#define rUTXH0      (*(volatile unsigned int *)UTXH0)
#define rURXH0      (*(volatile unsigned int *)URXH0)
//void uart_init(void)
{
    //初始化Tx、Rx对应的GPIO引脚
    rGPA0CON &= ~(0xff<<0);//把寄存器bit0~7全部清零
    rGPA0CON |= 0X00000022;

    //几个关键寄存器的设置
    rULCON0 = 0x3;
    rUCON0  = 0X5;
    rUMCON0 = 0;
    rUFCON0 = 0;

    //波特率设置 DIV_VAL=(PCLK/(bps*16))-1
    rUBRDIV0 = 34;
    rUDIVSL0T0 =0Xdfdd;
}
//串口发送程序,发送一个字节
void uart_putc(char c)
{
    //串口发送一个字符,其实就是把一个字节丢到发送缓冲区中去
    //因为串口控制器发送1个字节的速度远远低于CPU的速度,所以CPU发送一个字节前必须
    //确认串口控制器当前缓冲区是空的
    while(!(rUTRSTAT0 & (1<<1)));
    rUTXH0 = C;
}

//串口接受程序,轮询方式,接收一个字节
char uart_getc(void)
{
    while(!(rUTRSTAT0 & (1<<0)));
    return (rURXH0 & 0X0F);
}

参考资料:《朱老师物联网大讲堂》第一部分arm裸机全集第七部分-串口通信详解

欢迎关注我的公众号和我的知识星球。


猜你喜欢

转载自blog.csdn.net/growl_jie_/article/details/52833439