s5pv210开发与学习:1.12之UART学习

目录

1.硬件原理图

2.数据手册查阅

3.代码编写

4.参考:

5.拓展


1.硬件原理图

UART0:RX和TX对应的GPA0_0、GPA0_1

UART1:RX和TX对应的GPA1_0、GPA1_1

2.数据手册查阅

2.1s5pv210串口特色:

串口
−四个UART,具有基于DMA或基于中断的操作
−支持5位,6位,7位或8位串行数据发送/接收
− UART0的Rx / Tx独立256字节FIFO,UART1的64字节FIFO和UART2 / 3的16字节FIFO
−可编程波特率
−支持IrDA 1.0 SIR(115.2 Kbps)模式
−回送模式进行测试
−波特率时钟生成中的非整数时钟分频

-GPA0:8个输入/输出端口– 2xUART,带流量控制
-GPA1:4个输入/输出端口– 2xUART不带流量控制或1xUART不带流量控制

关于串口设计的详细介绍,参见数据手册850页(包含下面内容):

图1-1 UART框图.................................................. 1-2
图1-2 UART AFC接口........................................... 1-4
图1-3 UART接收包括两个错误的五个字符............ 1-7
图1-4 IrDA功能框图............................................... 1-8
图1-5串行I / O帧时序图(普通UART)................. 1-8
图1-6红外发送模式帧时序图.................................. 1-9
图1-7红外接收模式帧时序图.................................. 1-9
图1-8 UART的输入时钟图............ ......................... 1-10
图1-9 nCTS和Delta CTS时序图.............................. 1-24
图1-10 UINTSP,UINTP和UINTM的框图................ 1-3

1.通用异步接收器和发射机
1.1通用异步收发器概述
S5PV210中的通用异步收发器(UART)提供四个独立的异步和串行输入/输出(I / O)端口。所有端口均以基于中断或基于DMA的方式运行模式。 UART产生中断或DMA请求,以与CPU和UART之间传输数据。UART支持最高3Mbps的比特率。每个UART通道包含两个FIFO,用于接收和发送数据:ch0中为256个字节,ch1中为64个字节,ch2和ch3中为16个字节。UART包括可编程波特率,红外(IR)发送器/接收器,一个或两个停止位插入,5位,6位位,7位或8位数据宽度和奇偶校验。每个UART包含一个波特率发生器,一个发送器,一个接收器和一个控制单元,如图1-1所示。波特率发生器使用PCLK或SCLK_UART。发送器和接收器包含FIFO和数据移位器。要发送的数据被写入Tx FIFO,并复制到发送移位器。然后是数据由发送数据引脚(TxDn)移出。接收到的数据从接收数据引脚(RxDn)移出,并且从移位器复制到Rx FIFO。

1.2重要的通用异步收发器功能
•RxD0,TXD0,RXD1,TXD1,RXD2,TXD2,RXD3和TXD3与DMA或基于中断运行
•UART通道0,1,2和3:使用IrDA1.0
•UART通道0具有256字节的FIFO,通道1具有64字节的FIFO,通道2和3具有16字节的FIFO
•UART通道0,1和2与nRTS0,nCTS0,nRTS1,nCTS1,nCTS2和nRTS2用于自动流控制
•支持握手发送/接收

1.3 UART描述
以下各节介绍了UART操作,例如数据发送,数据接收,中断产生,波特率生成,环回模式,红外模式和自动流量控制。
1.3.1数据传输
用于传输的数据帧是可编程的。 它由一个起始位,五至八个数据位,一个可选奇偶校验组成由行控制寄存器(ULCONn)指定的1位和1至2个停止位。 发射器还可以产生中断条件,将串行输出强制为逻辑0状态一帧的传输时间。 该块传输当前传输字之后中断信号被完全传输。 中断信号后发送时,发送器将数据连续发送到Tx FIFO(在非FIFO情况下为Tx保持寄存器)模式)

1.3.2数据接收
与数据传输类似,用于接收的数据帧也是可编程的。它由一个起始位组成,五个线路控制寄存器(ULCONn)中的八个数据位,一个可选的奇偶校验位和一到两个停止位。收件人检测溢出错误,奇偶校验错误,帧错误和中断条件,每一个都设置一个错误标志。
•溢出错误表示在读取旧数据之前,新数据已覆盖旧数据。
•奇偶校验错误表示接收器检测到意外的奇偶校验情况。
•帧错误表示接收到的数据没有有效的停止位。
•中断条件表示RxDn输入保持逻辑0状态以进行一帧以上的传输时间。
如果在3字时间内未接收到数据,则发生接收超时条件(此间隔遵循设置的字长度位),并且在FIFO模式下Rx FIFO不为空。
1.3.3自动流量控制(AFC)
S5PV210中的UART0和UART1支持使用nRTS和nCTS信号的自动流控制(AFC)。 UART2如果通过GPA1CON(GPIO SFR)将TxD3和RxD3设置为nRTS2和nCTS2,则支持自动流控制。在这在这种情况下,它可以连接到外部UART。要将UART连接到调制解调器,请禁用UMCONn中的AFC位使用软件注册并控制nRTS的信号。
在AFC中,nRTS信号取决于接收器的状况,而nCTS信号控制操作发射器。如果激活了nCTS信号(在AFC中,nCTS,则UART的发送器将数据传输到FIFO)信号表示其他UART的FIFO已准备好接收数据)。在UART接收数据之前,nRTS信号如果其接收FIFO的备用字节超过2个字节,则必须将其激活。如果nRTS信号必须被禁用接收FIFO的备用字节少于1个字节(在AFC中nRTS信号表示它自己的接收FIFO已准备好接收数据)。

1.3.4非自动流量控制示例(通过软件控制NRTS和NCTS)
1.3.4.1使用FIFO进行接收操作
1.选择发送模式(中断或DMA模式)。
2.检查UFSTATn寄存器中的Rx FIFO计数值。 如果该值小于16,则必须设置UMCONn [0]至1(激活nRTS)。 但是,如果值等于或大于16,则必须将值设置为'0'(使nRTS无效)。
3.重复步骤2。
1.3.4.2使用FIFO进行发送操作
1.选择发送模式(中断或DMA模式)。
2.检查UMSTATn [0]的值。 如果值为“ 1”(激活nCTS),则必须将数据写入Tx FIFO寄存器。
3.重复步骤2

1.3.5 DMA模式下的TX / RX FIFO触发电平和DMA突发大小
如果在DMA模式下Tx / Rx数据达到UFCONn寄存器的Tx / Rx FIFO触发电平,则DMA事务开始。单个DMA事务传输一个数据,该数据的大小指定为UCONn寄存器的DMA突发大小,并且重复DMA事务,直到传输的数据大小达到Tx / Rx FIFO触发级别为止。 因此,DMA突发大小应小于或等于Tx / Rx FIFO触发级别。 通常,建议确保Tx / Rx FIFO触发级别与DMA突发大小匹配。
1.3.6 RS-232C接口
要将UART连接到调制解调器接口(而不是空调制解调器),请使用nRTS,nCTS,nDSR,nDTR,DCD和nRI需要信号。 您可以使用软件通过通用I / O端口控制这些信号,因为AFC可以不支持RS-232C接口。

1.3.7中断/ DMA请求生成
S5PV210中的每个UART都包含七个状态(Tx / Rx / Error)信号,即溢出错误,奇偶校验错误,帧错误,中断,接收缓冲区数据准备就绪,发送缓冲区为空以及发送移位器为空。这些条件由相应的UART状态寄存器(UTRSTATn / UERSTATn)指示。

溢出错误,奇偶校验错误,帧错误和中断条件指定接收错误状态。如果控制寄存器(UCONn)中的接收错误状态中断使能位设置1,则接收错误状态将生成接收错误状态中断。如果检测到接收错误状态中断请求,则可以确定中断源通过读取UERSTATn的值。

如果接收器在FIFO模式下将接收移位器的数据传输到接收FIFO寄存器,则接收到的数据大于或等于Rx FIFO触发级别,如果在接收模式下控制寄存器(UCONn)设置为1(中断请求或轮询模式)。

在非FIFO模式下,将接收移位器的数据传输到接收保持寄存器会导致Rx中断。中断请求和轮询模式。

如果发送器将数据从其发送FIFO寄存器传输到发送移位器,则剩余的数据数发送FIFO小于或等于Tx FIFO触发级别,产生Tx中断(提供发送将控制寄存器中的模式选择为中断请求或轮询模式)。在非FIFO模式下,传输数据从发送保持寄存器到发送移位器的中断会在中断请求和轮询模式下导致Tx中断。

请记住,如果发送FIFO中的数据数量小于发送FIFO中的数据数量,则总是请求发送中断。触发电平。这意味着在启用Tx中断后立即请求中断,除非您填写Tx缓冲区。建议先填充Tx缓冲区,然后启用Tx中断。

S5PV210的中断控制器为电平触发型。如果您必须将中断类型设置为“级别”您可以对UART控制寄存器进行编程。

如果将控制寄存器中的接收和发送模式选择为DMAn请求模式,则DMAn请求在上述情况下,发生而不是Rx或Tx中断。

1.3.8 UART错误状态FIFO
UART除了Rx FIFO寄存器外,还包含错误状态FIFO。 错误状态FIFO指示哪些数据,在FIFO寄存器中接收到一个错误。 仅当包含错误的数据为准备读出来。 要清除错误状态FIFO,必须读取带有错误的URXHn和UERSTATn。

例如,假定UART Rx FIFO顺序接收A,B,C,D和E字符,而接收“ B”时发生帧错误,而接收“ D”时发生奇偶错误。
实际的UART接收错误不会产生任何错误中断,因为接收到的字符是未读取错误。 如果字符被读出,则会发生错误中断。

Time Sequence Flow Error Interrupt Note
#0 If no character is read out -
#1 A, B, C, D, and E is received -
#2 After A is read out Frame error (in B) interrupt occurs. The 'B' has to be read out.
#3 After B is read out -
#4 After C is read out Parity error (in D) interrupt occurs. The 'D' has to be read out.
#5 After D is read out -
#6 After E is read out -


1.3.8.1红外(IR)模式
S5PV210 UART模块支持红外(IR)传输和接收。 通过设置UART线路控制寄存器(ULCONn)中的红外模式位。 图1-4说明了如何实现IR模式。
在红外发送模式下,发送脉冲以3/16的速率发出,即正常的串行发送速率(如果发送数据位为0)。 但是,在红外接收模式下,接收器必须检测3/16脉冲周期才能识别出0值(请参阅图1-5和图1-7中所示的帧时序图)。

1.4 UART输入时钟框图说明
S5PV210为UART提供各种时钟。 如图1-8所示,UART可以选择
来自PCLK或SCLK_UART的时钟,它来自时钟控制器。 您也可以从PLL中选择SCLK_UART。
要选择SCLK_UART,请参阅第2-3节“时钟控制器”。

1.5 I/O DESCRIPTION

Signal I/O Description Pad Type
UART_0_RXD Input Receives Data for UART0 XuRXD[0] muxed
UART_0_TXD Output Transmits Data for UART0 XuTXD[0] muxed
UART_0_CTSn Input Clears to Send(active low) for UART0 XuCTSn[0] muxed
UART_0_RTSn Output Requests to Send(active low) for UART0 XuRTSn[0] muxed
UART_1_RXD Input Receives Data for UART1 XuRXD[1] muxed
UART_1_TXD Output Transmits Data for UART1 XuTXD[1] muxed
UART_1_CTSn Input Clears to Send(active low) for UART1 XuCTSn[1] muxed
UART_1_RTSn Output Requests to Send(active low) for UART1 XuRTSn[1] muxed
UART_2_RXD Input Receives Data for UART2 XuRXD[2] muxed
UART_2_TXD Output Transmits Data for UART2 XuTXD[2] muxed
UART_2_CTSn Input Clears to Send(active low) for UART2 XuRXD[3] muxed
UART_2_RTSn Output Requests to Send(active low) for UART2 XuTXD[3] muxed
UART_3_RXD Input Receives Data for UART3 XuRXD[3] muxed
UART_3_TXD Output Transmits Data for UART3 XuTXD[3] muxed


NOTE: Type field indicates whether pads are dedicated to the signal or pads are connected to the multiplexed signals.
UART external pads are shared with IrDA. In order to use these pads, GPIO must be set before the start of UART.
Please refer to Section 2-2 GPIO for exact settings.

1.6 REGISTER DESCRIPTION(详见Datasheet 864页)

1.6.1 REGISTER MAP
1.6.1.1 UART Line Control Register

1.6.1.2 UART Control Register

NOTE:
1. DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16. Refer to 1.6.1.11 UART Channel Baud Rate Division Register and 1.6.1.12 UART Channel Dividing Slot Register
2. S5PV210 use a level-triggered interrupt controller. Therefore, these bits must be set to 1 for every transfer.
3. If the UART does not reach the FIFO trigger level and does not receive data during 3 word time in DMA
receive mode with FIFO, the Rx interrupt is generated (receive time out). You must check the FIFO status
and read out the rest
 


1.6.1.3 UART FIFO Control Register
1.6.1.4 UART Modem Control Register
1.6.1.5 UART Tx/Rx Status Register


1.6.1.6 UART Error Status Register
1.6.1.7 Uart FIFO Status Register(875页)

1.6.1.8 Uart Modem Status Register(876页)

1.6.1.9 UART Transmit Buffer Register (Holding Register & FIFO Register)

1.6.1.10 UART Recive Buffer Register (Holding Register & FIFO Register)
1.6.1.11 UART Channel Baud Rate Division Register


1.6.1.12 UART Channel Dividing Slot Register


1. UART波特率配置(880页)
UART模块中有四个UART波特率除数寄存器,即UBRDIV0,UBRDIV1,UBRDIV2和UBRDIV3。
存储在波特率除数寄存器(UBRDIVn)和分频槽寄存器(UDIVSLOTn)中的值用于确定串行Tx / Rx时钟速率(波特率),如下所示:
DIV_VAL = UBRDIVn +(在UDIVSLOTn中为1的数字)/ 16
DIV_VAL =(PCLK /(bps x 16))-1
要么
DIV_VAL =(SCLK_UART /(bps x 16))-1
其中,除数应为1到(216-1)。
使用UDIVSLOT,您可以更准确地生成波特率。
例如,如果波特率是115200 bps,而SCLK_UART是40 MHz,则UBRDIVn和UDIVSLOTn是:
DIV_VAL =(40000000 /(115200 x 16))-1
= 21.7 -1
= 20.7
UBRDIVn = 20(DIV_VAL的整数部分)
(UDIVSLOTn中为1的数字)/ 16 = 0.7
然后,(UDIVSLOTn中1的个数)= 11
因此,UDIVSLOTn可以是16'b1110_1110_1110_1010或16'b0111_0111_0111_0101,依此类推。

It is recommended to select UDIVSLOTn as described in the following table:
Num of 1’s UDIVSLOTn Num of 1’s UDIVSLOTn
0 0x0000(0000_0000_0000_0000b) 8 0x5555(0101_0101_0101_0101b)
1 0x0080(0000_0000_0000_1000b) 9 0xD555(1101_0101_0101_0101b)
2 0x0808(0000_1000_0000_1000b) 10 0xD5D5(1101_0101_1101_0101b)
3 0x0888(0000_1000_1000_1000b) 11 0xDDD5(1101_1101_1101_0101b)
4 0x2222(0010_0010_0010_0010b) 12 0xDDDD(1101_1101_1101_1101b)
5 0x4924(0100_1001_0010_0100b) 13 0xDFDD(1101_1111_1101_1101b)
6 0x4A52(0100_1010_0101_0010b) 14 0xDFDF(1101_1111_1101_1111b)
7 0x54AA(0101_0100_1010_1010b) 15 0xFFDF(1111_1111_1101_1111b)

2.波特率误差容限
UART帧错误应小于1.87%(3/160)
tUPCLK =(UBRDIVn + 1)x 16 x 1帧/(PCLK或SCLK_UART)tUPCLK:实际UART时钟
tEXTUARTCLK = 1帧/波特率tEXTUARTCLK:理想UART时钟
UART错误=(tUPCLK − tEXTUARTCLK)/ tEXTUARTCLK x 100%
1帧=起始位+数据位+奇偶校验位+停止位。
3. UART时钟和PCLK关系
PCLK与UARTCLK的时钟频率之比受到限制。
UARTCLK的频率不得超过PCLK的频率的5.5 / 3倍:
FUARTCLK <= 5.5 / 3 X FPCLK FUARTCLK =波特率x 16
这样可以留出足够的时间将接收到的数据写入接收FIFO

1.6.1.13 UART Interrupt Pending Register(881页)

1.6.1.14 UART Interrupt Source Pending Register
1.6.1.15 UART Interrupt Mask Register
 

3.代码编写

3.1串口编程实践1

3.2串口stdio的移植

#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;			// 0b0010, Rx Tx
	
	// 几个关键寄存器的设置
	rULCON0 = 0x3;
	rUCON0 = 0x5;
	rUMCON0 = 0;
	rUFCON0 = 0;
	
	// 波特率设置	DIV_VAL = (PCLK / (bps x 16))-1
	// PCLK_PSYS用66MHz算		余数0.8
	//rUBRDIV0 = 34;	
	//rUDIVSLOT0 = 0xdfdd;
	
	// PCLK_PSYS用66.7MHz算		余数0.18
	// DIV_VAL = (66700000/(115200*16)-1) = 35.18
	rUBRDIV0 = 35;
	// (rUDIVSLOT中的1的个数)/16=上一步计算的余数=0.18
	// (rUDIVSLOT中的1的个数 = 16*0.18= 2.88 = 3
	rUDIVSLOT0 = 0x0888;		// 3个1,查官方推荐表得到这个数字
}


// 串口发送程序,发送一个字节
void uart_putc(char c)
{                  	
	// 串口发送一个字符,其实就是把一个字节丢到发送缓冲区中去
	// 因为串口控制器发送1个字节的速度远远低于CPU的速度,所以CPU发送1个字节前必须
	// 确认串口控制器当前缓冲区是空的(意思就是串口已经发完了上一个字节)
	// 如果缓冲区非空则位为0,此时应该循环,直到位为1
	while (!(rUTRSTAT0 & (1<<1)));
	rUTXH0 = c;
}

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

4.参考:

5.拓展:

sp3232中文资料


 

发布了56 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/I_feige/article/details/103643294
今日推荐