S5PV210串口通信详解
作者:互联网
S5PV210串口通信详解
S5PV210概述:
- S5PV210有4路独立,异步,串行的输入输出IO口,UART支持的通信速率达到3Mbps。
- 一个周期数据的组成:1位起始位,8位有效数据位,1位奇偶校验位,1位停止位。
- S5PV210使用的是异步(需要通过发送起始位和结束位),串行(数据位只在一根线上传输),电平信号(使用的是R232电平信号,因为其电平的变化范围大,抗干扰能力强,适合较长距离信号传输,3~5米)的方式进行串口通信。而S5PV210使用的是Tx \Rx\GND三根线,以二进制流的方式在的DB9接口上进行通信。
- 通信过程中需要明确如下参数才可以被正常通信。
- 波特率:单片机:5600 ;嵌入式Soc使用的是115200。
- 起始位:1位。由某一时刻电平的变化来确定的。
- 有效数据位:8位。因为符号是被ASCii编码的数据(字符),一般是8位。
- 奇偶校验位:1位。范围在传送的过程中数据位反转了。
- 停止位:1位。由某一时刻电平的变化来确定的。
原理框图
-
- 时钟信号来自于Pripheral BUS。
- 模块分为:Transmitter \ Receiver \ control Unit \ Buad-rate Generator
- 工作形式:
- Transmitter:
- 组成:Transmitter Buffer Register 和Transmit Shifter
- 工作过程:将信息ASCii编码成二进制流,然后将其放入Transmitter Buffer Register,Transmit Shifter就会读取Buffer里面的一帧数据(自动,这个需要Control Unit来控制其开始),然后通过移位的方式发送传送线上的Tx上。
- Receiver:
- 组成:Receive Buffer Register 和Receive Shifter
- 工作过程:通过传送线上的Tx接收到信息,在固定的时间内Receive Shifter将信号线的电平的状态(1位)读取到Receive Buffer Register里面。当Buffer里面读取满8位数据时,会触发中断给CPU让CPU去读取数据。
- Buad-rate Generator:
- Buad-rate其实就是分频器,通过对外部总线时钟来进行分频,得到目标时钟,再用这个目标时钟来生成波特率。(自动)
- Transmitter:
- 串口通信的用途:仅仅用于打印调试信息。所以会禁用流控。
寄存器详解:
- Band -rate的设置:
- UBRDIV n:
-
- UDIVSLOT n:
-
- 根据波特率计算处需要在寄存器上放的值:取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;
- 端口设置:
- 将端口设置成UART_0_TXD和RXD模式。
- 发送和接收字节的长度设置为8bit。Word-length = 11;UART Line Control Register
- 设置发送和接收的模式。UART Control Register(UCON n)= 0x5;
功能实现1:编写程序使用串口通信将发送字符a,将其发送到主机,然后显示出来。
思路:
- 配置好Soc的波特率为115200,APB的频率时66MHz,得UBRDIVn = 34;UDIVSLOT= 0xDFDD。
- 将IO端口设置为RXD和TXD模式:
- 串行口参数得设置:
- UART Control Register(UCON n)= 0x5;设置发送和接收的模式
- 发送和接收字节的长度设置;ULCON0 = 0x03;
- 发送时需要不断得循环检测UTRSTATn 的bit1是否为1,如果为1,则可以里面填充数据。
- 接收时需要不断的循环检测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); } |
代码总结:
- 反逻辑判断条件的编写。
后续代码实现:
- 使用中断来实现串口通信
- 使用fifo来实现串口通信
- 使用DMA来实现串口通信
标签:S5PV210,Register,通信,电平,Buffer,详解,串口 来源: https://blog.csdn.net/zhileung80265/article/details/121360186