S5PV210裸机之串口

1:串口的基础知识

串口通信定义

  串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信原理

  串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配:   

  a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600,115200。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。   

  b,数 情况。   

  c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。   

  d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

基本接线方法

         目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。

  1.DB9和DB25的常用信号脚说明

  9针串口(DB9) 25针串口(DB25)
  针号 功能说明 缩写 针号 功能说明 缩写
  1 数据载波检测 DCD 8 数据载波检测 DCD
  2 接收数据 RXD 3 接收数据 RXD
  3 发送数据 TXD 2 发送数据 TXD
  4 数据终端准备 DTR 20 数据终端准备 DTR
  5 信号地 GND 7 信号地 GND
  6 数据设备准备好 DSR 6 数据准备好 DSR
  7 请求发送 RTS 4 请求发送 RTS
  8 清除发送 CTS 5 清除发送 CTS
  9 振铃指示 DELL 22 振铃指示 DELL

  2.RS232C串口通信接线方法(三线制)
  首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连

  · 同一个串口的接收脚和发送脚直接用线相连 对9针串口和25针串口,均是2与3直接相连; 
  · 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口) 

  上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼此交叉,信号地对应相接,就能百战百胜。

  3.串口调试中要注意的几点:

  串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果; 强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。 

  单工、半双工和全双工的定义

  如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
  如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。
  如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。

  电话线就是二线全双工信道。 由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。

  奇偶校验

  串行数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为:
  0100,0101=45H
  D7 D0
  由于干扰,可能使位变为1,这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,叫“检错”。发现错误后,如何消除错误,叫“纠错”。
  最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校验或偶校验。
  奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
  1 0110,0101
  0 0110,0001
  偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
  1 0100,0101
  0 0100,0001

  奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。
 

  有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等。

2:

UART includes programmable baud rates, infrared (IR) transmitter/receiver, one or two stop bit insertion, 5-bit, 6-bit, 7-bit, or 8-bit data width and parity checking.

Each UART contains a baud-rate generator, a transmitter, a receiver and a control unit, as shown in Figure 1-1. The baud-rate generator uses PCLK or SCLK_UART. The transmitter and the receiver contain FIFOs and data shifters. The data to be transmitted is written to Tx FIFO, and copied to the transmit shifter. The data is then shifted out by the transmit data pin (TxDn). The received data is shifted from the receive data pin (RxDn), and copied to Rx FIFO from the shifter.

UART包括可编程波特率、红外发生接收器、1、2位结束位,5、6、7、8数据位,奇偶校验。

每个UART包含一个波特率发生器、发送接收器和控制单元,详细看下图,波特率发生器使用的是PCLK_PSYS或SCLK_UART。发送器/接收器包含FIFOS和数据移位器。数据通过写入Tx FIFO,复制到发送移位器来发送。通过TxDn引脚把数据发送出去。数据从RxDn

接收通过移位器复制到Rx FIFO。

我们用的时钟是通过PCLK_PSYS总线,然后经过分频得到的,波特率设置为115200。

无FIFO模式:发送数据把1字节数据写入Transmit Holding Register寄存器,然后控制器,会控制器自动复制到移位器,然后通过TXDn引脚把数据发送出去。

      接收数据是从外部RxDn引脚接收数据,然后通过移位器,复制到Receive Holding Register寄存器中。接收数据的话,只需要查询Receive Holding Register寄存器是否有内容,读取即可。

FIFO模式:

UART可以以中断或者轮询的方式来接收数据。

s5pv210的数据发送:

DATA TRANSMISSION
The data frame for transmission is programmable. It consists of a start bit, five to eight data bits, an optional parity bit, and one to two stop bits, specified by the line control register (ULCONn). The transmitter can also produce a break condition that forces the serial output to logic 0 state for one frame transmission time. This block transmits the break signals after the present transmission word is transmitted completely. After the break signal transmission, the transmitter continuously transmits data to Tx FIFO (Tx holding register, in case of Non-FIFO mode).

发送数据结构是可编程的,包括1位开始位、5-8位数据位、一位奇偶校验位、和1-2位结束位。通过ULCONn寄存器来设置。发送器可以强制串口输出为逻辑0一个数据结构发送周期来产生中断。发送完当前发送字节以后发出一个中断信号。中断信号发送完以后,发送器持续不断的发送数据给 Tx FIFO(非FIFO模式 发送给(Tx holding register)。


DATA RECEPTION
Similar to data transmission, the data frame for reception is also programmable. It consists of a start bit, five to eight data bits, an optional parity bit, and one to two stop bits in the line control register (ULCONn). The receiver detects overrun error, parity error, frame error and break condition, each of which sets an error flag.

相关寄存器介绍:

Register1: ULCONn

红外模式:0:普通模式、1:红外模式

奇偶校验模式:0:无、1:奇数、2:偶数

终止位:0:1位,1:2位

字长:5-8bit

Register1: UCONn:

时钟选择:0:PCLK_PSYS、1:SCLK_UART,我们设置为0;

发送模式:轮询/中断

接收模式:轮询/中断

寄存器:UFCONn

寄存器: UMCONn 

AFC:disable

mode:disable

寄存器:UTRSTATn

状态寄存器:

Transmitter empty 移位器和发送缓冲寄存器没有可用数据发送时 0:非空、1:空

Transmitter buffer empty发送缓冲寄存器 : 0:非空、1:空

Recieve buffer empty发送缓冲寄存器 : 0:非空、1:空

 

寄存器:UBRDIV n

寄存器:UDIVSLOTn

这两个寄存器是用来设置波特率的设置方法如下:

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

66.7MHz/(115200*16) = 36.187     UBRDIV n中的值就是36-1=35

0.187*16= 2.992            UDIVSLOTn中1的个数为3个

查表:3个1   UDIVSLOTn的建议值为0x0888

底板/核心板图

UART2 TXD RXD连接在 GPA1_1、GPA1_0两个引脚上,设置引脚为相应模式

寄存器:UTXHn

寄存器:URXHn

 

 实战代码:

  

复制代码

/*
 *         s5pv210裸机
 *
 *        uart通信
 *
 *
 */




#define _REG_GPA1CON                *((volatile unsigned int*)0xE0200020)
#define _REG_ULCON2                    *((volatile unsigned int*)0xE2900800)
#define _REG_UCON2                    *((volatile unsigned int*)0xE2900804)
#define _REG_UFCON2                    *((volatile unsigned int*)0xE2900808)
#define _REG_UMCON2                    *((volatile unsigned int*)0xE290080C)
#define _REG_UTRSTAT2                *((volatile unsigned int*)0xE2900810)         //注意状态寄存器要加volatile 不然编译器会做优化,他的值不能一直改变
#define _REG_UBRDIV2                *((volatile unsigned int*)0xE2900828)
#define _REG_UDIVSLOT2                *((volatile unsigned int*)0xE290082C)
#define _REG_UTXH2                    *((volatile unsigned int*)0xE2900820)
#define _REG_URXH2                    *((volatile unsigned int*)0xE2900824) 

 
void uart_init(void)
{
    
    //第一步设置相应引脚为TX RX模式
    _REG_GPA1CON &= ~(0xFF<<0);
    _REG_GPA1CON |= ((0x2<<4) | (0x2<<0));
    
    //设置 结束位1、无奇偶校验、字长8bit
    _REG_ULCON2 = 0x3;
    
    //设置 接收发送模式为 中断/轮询模式
    _REG_UCON2 = 0x5;
    
    //关闭FIFO
    _REG_UFCON2 = 0x0;
    
    //关闭AFC、Modem interupt
    _REG_UMCON2 = 0x0;
    
    //设置波特率
    _REG_UBRDIV2 = 35;            //66.7MHz/(115200*16)-1=35.187
    _REG_UDIVSLOT2 = 0x0888;    //0.187*16=2.997
    
    
}



void putc(char ch)
{
    

    if (ch == '\n') {
        
        //以轮询方式,transmit buffer 为空时发送
        while (!(_REG_UTRSTAT2 & (0x1<<1)));
    
        //发送数据
        _REG_UTXH2 = '\r';
        
    
    }
    
    //以轮询方式,transmit buffer 为空时发送
    while (!(_REG_UTRSTAT2 & (0x1<<1)));
    
    //发送数据
    _REG_UTXH2 = ch;
    
        
    
}


char getc(void)
{
    char ch;
    //receive buffer 为空是接收数据
    while (!(_REG_UTRSTAT2 & (0x1<<0)));
    
    //接收数据
    ch =  _REG_URXH2 & 0xFF;
    
    return ch;    
}

复制代码

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/82114017