其他分享
首页 > 其他分享> > S5PV210串口通信详解

S5PV210串口通信详解

作者:互联网

S5PV210串口通信详解

S5PV210概述:

  1. S5PV210有4路独立,异步,串行的输入输出IO口,UART支持的通信速率达到3Mbps。
  2. 一个周期数据的组成:1位起始位,8位有效数据位,1位奇偶校验位,1位停止位。
  3. S5PV210使用的是异步(需要通过发送起始位和结束位),串行(数据位只在一根线上传输),电平信号(使用的是R232电平信号,因为其电平的变化范围大,抗干扰能力强,适合较长距离信号传输,3~5米)的方式进行串口通信。而S5PV210使用的是Tx \Rx\GND三根线,以二进制流的方式在的DB9接口上进行通信。
  4. 通信过程中需要明确如下参数才可以被正常通信。
    1. 波特率:单片机:5600 ;嵌入式Soc使用的是115200。
    2. 起始位:1位。由某一时刻电平的变化来确定的。
    3. 有效数据位:8位。因为符号是被ASCii编码的数据(字符),一般是8位。
    4. 奇偶校验位:1位。范围在传送的过程中数据位反转了。
    5. 停止位:1位。由某一时刻电平的变化来确定的。

原理框图

    1. 时钟信号来自于Pripheral BUS。
    2. 模块分为:Transmitter \ Receiver \ control Unit \ Buad-rate Generator
    3. 工作形式:
      • Transmitter:
        1. 组成:Transmitter Buffer Register 和Transmit Shifter
        2. 工作过程:将信息ASCii编码成二进制流,然后将其放入Transmitter Buffer Register,Transmit Shifter就会读取Buffer里面的一帧数据(自动,这个需要Control Unit来控制其开始),然后通过移位的方式发送传送线上的Tx上。
      • Receiver:
        1. 组成:Receive Buffer Register 和Receive Shifter
        2. 工作过程:通过传送线上的Tx接收到信息,在固定的时间内Receive Shifter将信号线的电平的状态(1位)读取到Receive Buffer Register里面。当Buffer里面读取满8位数据时,会触发中断给CPU让CPU去读取数据。
      • Buad-rate Generator:
        1. Buad-rate其实就是分频器,通过对外部总线时钟来进行分频,得到目标时钟,再用这个目标时钟来生成波特率。(自动)
  1. 串口通信的用途:仅仅用于打印调试信息。所以会禁用流控。

寄存器详解:

  1. Band -rate的设置:
    1. UBRDIV n:

    

    1. UDIVSLOT n:

    1. 根据波特率计算处需要在寄存器上放的值:取PCLK = 66MHz,bps为115200。

DIV_VAL = (PCLK / (bps x 16)) −1=(66000000/(115200*16))-1=34.8

UBRDIVn = 34。

num of 1's in UDIVSLOTn = 0.8*16=12.8≈13

所以UDIVSLOT n[15:0]的值0xDFDD;

  1. 端口设置:
    1. 将端口设置成UART_0_TXD和RXD模式。
  2. 发送和接收字节的长度设置为8bit。Word-length = 11;UART Line Control Register

  1. 设置发送和接收的模式。UART Control Register(UCON n)= 0x5;

功能实现1:编写程序使用串口通信将发送字符a,将其发送到主机,然后显示出来。

思路:

  1. 配置好Soc的波特率为115200,APB的频率时66MHz,得UBRDIVn = 34;UDIVSLOT= 0xDFDD。
  2. 将IO端口设置为RXD和TXD模式:
  3. 串行口参数得设置:
    1. UART Control Register(UCON n)= 0x5;设置发送和接收的模式
    2. 发送和接收字节的长度设置;ULCON0 = 0x03;
  4. 发送时需要不断得循环检测UTRSTATn 的bit1是否为1,如果为1,则可以里面填充数据。
  5. 接收时需要不断的循环检测UTRSTATn的bit0是否为1,如果为1,则可以提取数据。

实现代码:

void uart_init(void){

rGPA0CON &= ~(0xff<<0);

rGPA0CON |= 0x00000022;

rULCON0 = 0x3;

rUCON0 = 0x5;

rUMCON0 = 0;

rUFCON0 = 0;

rUBRDIV0 = 35;

rUDIVSLOT0 = 0x0888;

}

void putc(char c)

{                  

while (!(rUTRSTAT0 & (1<<1)));

rUTXH0 = c;

}

char getc(void)

{

while (!(rUTRSTAT0 & (1<<0)));

return (rURXH0 & 0x0f);

}

代码总结:

  1. 反逻辑判断条件的编写。

后续代码实现:

  1. 使用中断来实现串口通信
  2. 使用fifo来实现串口通信
  3. 使用DMA来实现串口通信

标签:S5PV210,Register,通信,电平,Buffer,详解,串口
来源: https://blog.csdn.net/zhileung80265/article/details/121360186