DSP具有很强的数据处理能力使其在高速数字信号处理方面得到广泛的应用。通用异步接收发送器(UART)是异步串行通讯设备,它能在发射机的末端将并行数据转换成串行数据,并在接收机的末端将串行数据转换成并行数据。该设备可以实现EIA-232E(也称作RS-232)标准的全双工串行通信链路。
TI的很多DSP产品不带有UART接口,为了实现串行通信,很多情况下都要用软件对相应的接口编程来模拟异步串口。而ADSP-21369芯片有2个UART,支持串口数据的全双工传输,两个专用DMA通道和异步传输。UART功能原理框图如下图所示。
UART功能原理框图
UART Functional Block Diagram
典型的UART数据帧如下图所示,它包含一个起始位、数据位和一个停止位。奇偶校验位用于检验数据错误,可以设置为偶校验或奇校验。一帧(不包含起始位、停止位和奇偶校验位)中的数据长度从5到8位之间变化。每帧停止位的数目可以编程为1或2。考虑到所有的情况,一个UART数据帧的长度在7到12位之间变化。帧的起始位为低有效,在下降沿检测;停止位为高有效,在上升沿检测。对于某次通信发送端和接收端的波特率必须相同。
UART数据帧
UART data frame
- 同步效应
当两个UART通信时,发送端和接收端按数据发送的波特率工作。发送端以给定的波特率发送数据,接收端检测到帧的起始位之后开始以同样的波特率对数据采样。因为接收端不知道数据帧何时到来,所以这种通信方式被称作异步通信。因为接收端要检测帧的起始位,接收端的逻辑要比发送端复杂。
由通信协议可知,接收端产生的接收时钟频率是波特率的16倍。图4.3所示是接收端使用的同步数据帧的协议。当数据信号从停止位或空闲状态过渡时,接收端在低有效起始位的下降沿检测帧的起始位。在起始位的下降沿,接收端将其时钟计数器复位并在8个时钟周期后找到起始位的重点。在中点对起始位重采样以便验证之前检测到的下降沿不是噪声或干扰。在16个时钟周期之后对下一位采样,也就是下图中的D0位的中点。
UART同步效果
UART synchronization effects
因为UART接收器在每一帧的开始重新同步,前面帧的采样错误(除了停止位之外)不会累加。因此,采样错误只限于一个数据帧,与整个发送数据无关。经常由于接收时钟和接收数据帧的同步错误而导致采样错误。该错误会影响整个帧,它将数据位的采样点移到更靠近过渡边沿的地方。由于这些过渡边沿上升和下降缓慢,该错误可能导致数据检测错误。过渡边沿的缓慢上升和下降是发送电缆的高阻抗导致的。当停止位被采样为低而不是高时,帧错误就出现了。因为处理器端的UART波特率由处理器的外部时钟产生,所需的波特率产生可能不精确。这会进一步导致发送端的时序变化,在接收端就可能出现采样错误。
2、编程技巧
(1)全双工DMA
因为UART是一个全双工外设,发送器和接收器同时工作并相互独立。当在环路模式中进行全双工DMA时(在这里发送器的输出与接收器的输入相连),要保证UART的接收端在使能发送端之前被使能,以避免接收端的数据丢失。
汇编代码见附录A。
(2)UART中断
在I/O模式下使能UART中断需要两步。在I/O模式中用UART中断要谨慎,因为所要的中断被捆绑成一个单一的接收中断。首先要将UART中断映射为中断向量表中的中断之一。通过对DAI中断控制寄存器编程或将UART映射到任何一个外设中断源,直接使用DAI中断。这可以通过改变外设中断优先级控制寄存器的UART中断的默认设置来实现,即选择UART接收中断。UART0和UART1的接收中断选定值分别对应0x13和0x14。
I/O模式下的第二步是在UART中断使能寄存器(UARTxIER)中设置相应的位以使能UART中断。在所有UART设置(比如字长、奇偶校验等)之后要从内部使能中断,因为在发送模式下,一旦在UARTxIER寄存器对发送缓冲为空位使能,就会产生中断。如果在其他的UART设置之前对该位使能,在发送中断服务例程中的发送数据不会遵循以后通过编程对UART的设置,会导致通信错误。在DMA模式中,对发送或接收DMA按照I/O模式步骤1中的介绍使能相应的中断就可以了。在DMA模式下,用户不需要使用UARTxIER寄存器使能发送或接收中断。但是对于奇偶校验错误、溢出错误、帧错误或地址检测错去引起的线状态中断,即使在DMA模式下,也要在UARTxIER寄存器中设置相应的中断位。
在VisualDSP++中运行或单步调试代码时,如果使用了UART中断,不要打开UART寄存器窗口(UART寄存器窗口对外设的中断状态有影响)。如果打开了该窗口会清除中断锁存器,仿真器会不断的对这些寄存器进行读操作。
3. 与PC通信
与PC通信要保证UART的内部编程设置和串口调试助手的COM端口的配置相匹配。与PC通信的UART初始化过程代码如下。程序中对UART的设置和图4.4中对串口调试助手的配置相匹配。
void initUART( )
{
/* 设置UART0的波特率*/
*pUART0LCR = UARTDLAB;
// 使能Divisor Latch High/Low 寄存器(UARTxDLL,UARTxDLLH)来设置波特率
*pUART0DLL = 0x1c;
*pUART0DLH=0x02;
//除数值为0x21c = 540,时钟频率为331.776MHz 的情况下,波特率为19200
/* 配置UART0 LCR寄存器*/
*pUART0LCR = UARTWLS8| // 字长为8
UARTPEN| // 奇校验
UARTSTB ; // 2个停止位
*pUART0RXCTL = UARTEN; //使能UART0 接收模式
*pUART0TXCTL = UARTEN; //使能UART0传送模式
xmitUARTmessage(welcomemessage,sizeof(welcomemessage)); //传送欢迎信息
}
串口调试助手的设置
Configuring of serial debugging assistant