分类: 嵌入式
2011-02-12 16:59:47
s3c2440的UART提供了三个同步串行IO口,第一个串口都可以使用中断模式和DMA模式,换句话说就是UART可以产生一个中断或者是DMA请求使数据在CPU和UART之间进行传递。UART在系统时钟下可以支持最高位传送为115.2K BPS.如果一个外部设备能过UEXTCLK为UART提供时钟,UART可以达到更高的速度。每个UART通道包括两个64字节的FIFO作为接收数据和发送数据使用。
s3c2440的UART包括可编程的波特率,红外收发,一个或者两个停止位。5位,6们,7位,8位的数据位和校验检测。
每一个UART包括一个波特率产生器,发送器,接收器和一个控制单元。如图11-1所示。波特率产生器可以使用PCLK,FCLK/n或者UEXTCLK之一控制。发送器和接收器包含64字节的FIFO和一个数据移位器。数据先写到FIFO中然后再拷贝到发送移位器中,然后再移位发送通过数据针TxDn。在些期间远端发送过来的数据通过针RxDn进入到移位器中再拷贝到接收器的FIFO中去。
属性
--RxD0,TxD0,RxD1,TxD1,Rxd2,和TxD2都可使用基于DMA的和中断的操作。
--UART通道0,1,和2都拥有IrDA和64字节的FIFO
--UART通道0和1:nRTS0,nCTS0,nRTS1,nCTS1
--收发数据时支持握手
UART的操作
下面这些章节将要讲述UART的操作,包括数据传输,数据接收,产生中断,波特率的产生回环模式,红外模式和自动流控制。
数据传输
发送的数据帧是可以改变的,它由起始位5~8个数据位一个可选的校验位和1~2个停止位构成。这些都可以通过策略控制器ULCONn设置。数据发送器也可以产生一个停止标志,它可以强迫串口输出逻辑0达一帧的时间,它在一个字传输完成以后阻塞了停止信号的传送。然后继续传输数据到Tx FIFO中。
数据接收
与数据的发送相似,接收到的数据帧也是可以修改的。它包括一个起始位,五到八个数据位,一个可选的校验位和一到两个停止位。接收器可检测到覆盖错误,校验错误,帧错误和终止的情况。每一种情况都会设置一个错误标志位。
--覆盖错误产生的情况是这样的,新数据覆盖掉了还没有来的及取出的旧数据,也就是说接收数据速度快于取出的速度导致一部分数据还没有取出就被新的数据盖掉了。
--校验错误是指接收到的数据经过计算与校验位不符。
--帧错误是指收到的数据不含有停止位。
--终止的情况是指RxDn端保持在逻辑零的状态时间长于一帧数据传送的时间。
接收超时的情况是指在可以接收3个字的时间里没有收到任何的数据,并且在FIFO模式时Rx的FIFO非空。
自动流量控制(AFC)
S3C2440的UART 0和UART 1通过信号nRTS和nCTS支持自动流量控制。在这种情况下,它可以连接到外部的UARTs中去。如果用户想把串口连接到Modem上,需要关闭寄存器UMCONn的自动流控制位,并通过软件控制nRTS信号线。
在AFC模式下,nRTS依赖于接收器,nCTS信号控制着发送器的操作。UART的数据发送器只在nCTS信号使能的时候才把数据传送到FIFO中(在AFC模式下nCTS的意思是其它UART的FIFO已经准备好接收数据了)。
在UART开始接收数据之前,需要先根据数据接收器的FIFO剩余空间设置nRTS的值,如果剩余空间大于32字节则nRTS使能,否则如果剩余空间小于32字节则nRTS关闭(在AFC模式下,nRTS的作用就是表示它所控制的接收器的FIFO准备好接收数据了)。
UART 2不支持AFC功能,因为S3C2440没有nRTS2和nCTS2
非自动流量控制的例子(通过软件控制信号nRTS和nCTS)
接收器对FIFO的操作
1.选择接收模式(中断模式或者DMA模式)
2.检查寄存器UFSTATn中Rx FIFO的值,如果这个值小于32,用户必须设置UMCONn[0]为“1”(使能nRTS),如果值大于32,用户必须设置UMCONn[0]的值为“0”(关闭nRTS)
3.重复第2步。
发送器对FIFO的操作
1.选择一个发送模式(中断或者DMA)
2.检查UMSTATn[0]的值,如果为“1”(使能nCTS),用户写数据到Tx FIFO寄存器
RS-232接口
如果用户想把UART接到modem接口上,需要nRTS,nCTS,nDSR,nDTR,DCD和nRI信号。这时用户就可以使用软件通过通用I/O接口控制这些信号了。因为AFC不支持RS-232接口。
产生中断、DMA请求
S3C2440的每个UART都有七个状态:覆盖错误,校验错误,帧错误,终止,接收缓冲区已准备好,发送缓冲区空,和发送移位器空。所有这些都对应到UART的状态寄存器中(UTRSTATn/UERSTATn).
覆盖错误,校验错误,帧错误和终止属于接收错误,它们中的任何一个都可以引起一个叫“receive error status”的中断请求。如果这个中断请求在寄存器UCONn中的使能位被置为“1”,并且当这个请求被处理时通过读取UERSTSATn的值可知引起这个中断的信号,也就是找到是哪种错误引起的中断。
在FIFO模式下,接收器从接收移位器中收数据然后写入到FIFO中,如果收到数据的个数达到Rx FIFO的触发点,且在寄存器UCONn中的接收模式被设置成“1”(中断或者轮巡模式),将会产生一个Rx中断。在非FIFO模式下,不论是中断模式还是轮巡模式,只要有数据从接收移位寄存器中传送到数据接收保持寄存器中都会产生一个Rx中断。
在FIFO模式下,如果发送模式在控制寄存器UCONn中被设置成中断模式或者轮巡模式,发送数据要从发送FIFO中传送到发送移位器中,如果在FIFO中剩余的数据个数达到了Tx FIFO的触发点,就是产生一个Tx中断。在非FIFO模式下,发送的数据从发送保持寄存器传送到发送移位器中后会产生一个Tx中断,这个也是要求数据发送方送方式为中断模式或者是轮巡模式。
如果在控制寄存器中数据发送方式和接收方式被设置成DMA模式,那么和上面的情况一样,只是产生的Rx和Tx中断被换成了DMA请求。
UART的错误FIFO
UART有一个“错误状态”FIFO组,它对应着接收器的FIFO,它指示在接收器的FIFO中哪个数据错误了。只有在接收器中错误数据被读取的时候才会产生错误中断。在从URXHn读取数据的时候同时读取UERSTATn寄存器的值就知道这个数据哪里错了,什么错误。
例子
假设UART顺序接收了A B C D E这五个数据,其中接收B的时候发生了帧错误,接收D的时候发生了校验错误。
在接收B的时候不会产生“错误中断”,在接收“D”的时候也不会产生“错误中断”。当读取B数据和D数据的时候“错误中断”才会产生。
波特率的产生
UART的波特率发生器为串行数据的发送与接收提供时钟,波特率发生器的“源时钟”可以是S3C2440的内部系统时钟也可以是外部时钟(UEXTCLK),换句话说就是通过设置UCONn的“时钟”选项可以改变除数因子。波特率是由“源时钟”(PCLK,FCLK/n UEXTCLK)除以16和一个除数因子。公式是这样的:
除数因子=(整型)(“源时钟”除以波特率乘以16)减1
除数因子UBRDIVn的取值范围是1~2^16-1,但当使用外部时钟UEXTCLK时它却可以等于0.(这个外部时钟要低于PCLK)
例如:如果波特率是115200bps,UART的时钟是40MHz,除数因子UBRDIVn是
UBRDIVn = (int)(40000000 / (115200 x 16) ) -1
= (int)(21.7) -1 [round to the nearest whole number]
= 22 -1 = 21
波特率的错误容忍度
UART的帧错误必须低于1.87%
回环模式
S3C2440提供了一个用来测试的模式叫回环模式,提供给链路孤立错误的查找。这个模式在结构是允许UART的RXD与TXD相连的。发送出去的数据被接收器接收,这种特性为处理器核实内部发送接收管脚有无问题,数据能否传送提供了依据。通过设置UART的控制寄存器UCONn的回环位可以进入回环模式。
红外模式
S3C2440的UART支持红外数据的传输和接收,些功能可以通过设置功能寄存器ULCONn的红外模式位来起用。图11-4描述了如果实现红外模式。
红外模式下传输的脉冲宽度是3/16,正常的串行数据是数据0.在接收时,“算了”
这么说吧,红外传送的数据与正常的不一样,它就是一个时间极短的脉冲,在传送一位的时间内如果发现了这个脉冲就认为是1,否则就认为是零。
UART的专用寄存器
UART的方式控制寄存器
UART有三个方式控制寄存器,为ULCON0 ULOCN1和ULCON2
每一个方式控制寄存器都有八位有效位。
第七位保留
第六位是红外使能位,1表示使能。
第五四三这三位表示校验模式,0XX表示无校验,100奇校验,101偶校验,110,111不知道如何译
第二位:停止位设置,如果是0表示一位停止位,如果 是1表示两位停止位
第1,0位:数据位的长度,00表示五位数据位,01表示六位数据们,10表示七位数据们,11表示八位数据位
UART的控制寄存器
也是有在个分别为UCON0 UCON1 UCON2,一个口一个
UCON0 0x50000004
十六位有效位
位15~12:FCLK除数因子,第零个串口和第一个串口一样这个数由15~12位决定,而串口二则由14~12位决定,15用作使能位。
对于串口零的控制寄存器UART clock = FCLK / (divider+6), where divider>0.
对于串口一的控制寄存器UART clock = FCLK / (divider+21), where divider>0.
对于串口二的控制寄存器UART clock = FCLK / (divider+36), where divider>0.
位11~10:选择使用哪种时钟00 10表示PCLK 01表示UEXTCLK 11表示FCLK/n 如果选择了FCLK/n需要添加“NOTE”下面的代码,不管是选 择还是取消选择。NOTE:
rGPHCON = rGPHCON & ~(3<<16); //GPH8(UEXTCLK) input
Delay(1); // about 100us
rGPHCON = rGPHCON & ~(3<<16) | (1<<17); //GPH8(UEXTCLK) UEXTCLK
位9:发送中断的形式,0表示脉冲的形式,1表示电平的形式。
位8:接收到数据中断的形式,0表示脉冲的形式,1表示电平的形式。
位7:接收数据超时使能位,0表示禁止,1表示使能。如果使能那么在接收超时时会发出一个接收到数据的中断。
位6:接收数据时是否产生中断,0表示不产生,1表示产生。
位5:回环模式的使能位,0表示正常,1表示回环模式使能
位4:是否发送一个中止信号 0表示不发送中止信号,1表示发送中止信号
位3~2:发送模式,00表示禁止也就是关闭发送,01中断或者是轮巡,10表示DMA模式,DMA0只能用于串口零,DMA3只能用于串口二,
11表示使用DMA1,只适合于UART1
位1~0:接收模式,00关闭发送,01中断或者轮巡,10同上,11同上。
UART的FIFO控制寄存器
有仨
UFCON0 0x50000008
八位有效位
位7~6:数据发送器触发中断的条件值,00 空,01表示16字节,10表示32字节,11表示48字节
位5~4:数据接收器触发中断的条件值,00 1字节,01表示8字节,10表示16字节,11表示32字节
位3:保留
位2:发送FIFO重置位,重置后自动清除所有FIFO中的数据,0表示正常,1表示重置
位1:接收FIFO重置位,重置后自动清除FIFO中所有数据,0表示正常,1表示重置
位0:FIFO是否使能,0表示非FIFO模式,1表示FIFO模式
UART调制器控制寄存器
有两个串口二没有
UMCON0 0x5000000C
位7~5:保留,必须是零
位4:流量自动控制位。0表示禁止,1表示自动控制
位3~1:保留,必须是零
位0:请求发送,意思就是在流量自动控制位为禁止状态时,修改这个值就是修改信号nRTS的值。在流量自动控制打开的时候些位被忽略
UART的发送和接收状态寄存器
一个串口一个
UTRSTAT0 0x50000010
三位有效位
位2:当发送缓冲寄存器中没有数据且发送移位寄存器也没有数据时自动设置为1,0表示非空,1表示缓冲区空,发送移位器空
位1:当发送缓冲寄存器中没有数据时被自动置1,在非FIFO模式下,会产生一个中断或者DMA请求,在FIFO模式下如果灵气发送器的触发 条件是00即空的时候会产生一个中断或者DMA请求。如果使用FIFO模式,就需要检查UFSTAT寄存器的Tx FIFO Count位和Tx FIFO Full位。而不是使用这个数据。
位0:接收缓冲区有数据可读,这时自动设置成1,表示有数据可以读了。如果使用FIFO模式时也不要使用这个数据
UART 错误状态寄存器
三个
UERSTAT0 0X50000014
四位有效位
位3:当收到break信号时自动设置些位为1.否则就是0
位2:帧错误时自动置1,否则是0
位1:校验错误时自动置1,否则是0
位0:覆盖错误时自动置1,否则是0
UART FIFO状态寄存器
三个
UFSTAT0 0X50000018
十六个有效位
位15:保留
位14:数据发送器的FIFO满,如果满,则自动置1.如果0-byte ≤ Tx FIFO data ≤ 63-byte则是零
位13~8:数据发送器FIFO中数据的个数
位7:保留
位6:数据接收器的FIFO满,如果满自动置1,如果0-byte ≤ Rx FIFO data ≤ 63-byte则置零
位5~0:数据接收器的FIFO中数据的个数。
UART调制器状态寄存器
两个
UMSTAT0 0X5000001C
五位有效位
位4:自上一次CPU读取nCTS的值到现在这段时间里nCTS的值已经改变了
位3~1:保留
位0:0表示CTS信号不可用,1表示CTS信号可用。
UART发送数据缓冲寄存器
三个
UTXH0 0X50000023
八位数据
UART接收数据缓冲寄存器
三个
URXH0 0X50000024
八位数据
UART波特率除数因子寄存器
有三个UBRDIV0 UBRDIV1 UBRDIV2。它保存的数据是为了计算波特率的。
UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
UBRDIV0 0X50000028
十六位的数据,保存一个数。