TMS320C32扩展异步串口的方法_DSP论文
关键词:数字信号处理 异步串行接口 现场可编程逻辑阵列 电气传动控制
高速数字信号处理器(dsp)在现代工业控制中,特别是电气传动控制中的应用非常广泛。大量文献介绍的应用于电气传动控制的dsp使用的是ti公司的,tms320系列dsp芯片,这其中又以tmx210c3x和tms320f24x为主流应用产品。tms320c32(以下简称为c32)是tms320c3x系列产品中应用比较多的一种。主工业控制中,常常需要使用上位pc机来控制底层的dsp芯片,一般采用异步串行通信协议,使用rs-232或485来实现。c32自身带有的串口为同步串口。为了实现c32和pc机之间的串行口通信,必须扩展c32的全双工异步串口(uart)功能。
c32实现uart接口的方法有三种:
(1)使用c32的现有资源模拟串行口的功能;
(2)使用可编程芯片(例如fpga)实现同步和异步协议的转换;
(3)使用专用的异步通信器件(ace)实现,例如pc机上使用16c550系列实现uart。
1 使用c32的现有资源模拟串行口的功能
通过使用两个通用i/o引脚、两个定时器和一个外部中断,可以用软件模拟uart的功能。使用中断实现软件模拟uart采用的通讯格式为:波特率9600bps、8个数据位、一个停止位、无奇偶校验位。这种实现方法由ted fried高级计算机通信公司提供。
1.1 硬件
图1为硬件连接线图。接收线同时接到int0和xfl引脚。起始位数据的下降沿触发外部中断int0。传输线接到xfo引脚,使用上拉电阻输出。
图2
1.2 软件
1.2.1 接收数据
根据uaht协议,接收到的第一个数据是起始位,在软件中。起始位会触发一个外部中断int0。害int0的中断服务程序例程rxint0中,定时器0首先玻装入一个时间常数,这个时间常数的定时时间等于半个数据位的延迟时间;然后装入定时器0的中断向量表,并允许定时器中断0,程序返回主程序,等待定时器0中断。如果定时器0触发中断,rx-tmr-int(接收定时器中断)例程则开始技行接收工作。第一个定时时间为半个数捉位的时间.cpu在接收位的中间时刻采样xfi的数据,并且验证接收到的数据是否为一个低电平。如果验证正确,表示接收到的数据为一个起始位,就可以接收数据了。在接收数据时,重新装载定时器0的定时值为一个数据位的时间并且启动定时器0,程序返回主程序,等待定时器0中断的到来。
在随后的定时器0的服务程序中,实现了在接收位的中间时刻采样接收线的状态来得到实际数据。将这些接收到的数据移位到一个存储器单元中。在第9次中断时,对接收到的停止位进行验证。如果正确,软件执行一个陷阱中断,程序返回到主程序。如果不正确,调用bad_stop_bit子程序进行相应的错误处理。接收数据被处理完后,重新允许外部中断0,等待下一个起始位的到来。
1.2.2 发送数据
发送数据例程开始于主程序装载一个数据到指定的存储器中,并且调用tx_main例程。在这个例程中,状态定时器1的定时时间为一个数据位的时间,重新设置传输计数器的值,设置起始位,并且允许定时器l中断,返回主程序,等待定时器1中断的到来。只有传输计数器的值为0时,主程序才会允许重新装载下一个需要传输的数据到指定的存储器中。在定时器1的中断子程序tx_int中,程序将要传输的数据(包含起始位、数据位和停止位)从xf0引脚上移位出去,直到传输计数器的值为0。
图3
具体的程序代码请见参考文献。
2 使用fpga实现异步和同步串行接口间的协议转换
有许多应用需要使用硬件uart。使用fpga可以将同步串行口协议转换为异步串行口通信协议。具体的逻辑框图如图2所示。
系统使用的时钟为25mhz,fpca中使用的时钟c32的h3引脚。通信协议为:波特率9600bps、一个起始位、一个停止位、没有奇偶检验位。图3所示为传输电路。
通过设置传输定时器的定时值可以得到需要的9600bps的波特率。传输端口被配置为爆发传输模式,它可以产生uart的一个起始位。8个数据位之后的停止位可通过电路来实现。图4为接收电路图。
当电路检测到起始位时,接收电路开始工作。起始位的逻辑擅为0。延迟电路在起始位的下降沿被激活。延迟电路的设置使数据的采样发生在每个数据位的中间时刻,它提高了系统抗噪声的能力。
图4
3 使用ace实现uart
微机上最早使用的ace是8250,16c550是8250的功能升级器件。器件在结构上的最大差别是16c550增加了接收和发送fifo,因此器件能够处于交替工作模式,减轻cpu额外的软件负担。在这种模式下,无论是接收还是发送,在可访问的缓冲寄存器和不可访问的移位寄存器之间都增加了16字节的fifo(包含放在接收fifo中的3位错误数据字节),可以使系统负担最小且系统效率最高,而且所有的逻辑功能都在16c550芯片上完成。tll6c550a有两个管脚功能(n封装系列中引脚24和29,fn封装系列中的27和32)已经被改变,使用这两个信号可以允许信号使用dma的方式来传输。
tll6c550的主要功能为:tll6c550在接收外部器件或modem的数据时?完成串行到并行的转换;在接收cpu的数据时,完成数据的并行到串行的变换,并进行串行发送。在ace器件工作的任何状态下,cpu可以读和通报ace器件的状态。通报的状态包括:传输操作正在进行过程中、操作状态、遇到了何种错误等,tll6c550的内部包含一个可编程的波特率发生器,波特率为16x内部输入时钟频率.此内部输入时钟频率由输入的参考基准振荡器分频(由波特率分频寄存器的值决定)得到。tll6c550具有完全的modem控制能力。包含一个处理器中断系统,根据用户的专用需要而设计,在处理通讯连接时,计算量是最小的。tll6c550有两种封装形式:n package (40脚) 和fn package(44脚)。tl16c550的管脚按功能可以分为:外部时钟输入及波特率控制信号;数据和地址总线;片选及读写控制信号;modem控制信号;复位及中断控制信号。
如果c32要和pc机通讯,可使用tl16c550完成串行协议的转换。tll6c550的输出接口要和一个电平转换芯片连接,用于和pc机的串行通讯接口互联。完整的接口示意图如图5所示。
其中的max232可以使用maxim公司的max3238来实现。
接口电路分为两大部分:dsp c32和串行通讯芯片tll6c550之间的接口;串行通讯芯片tll6c550和pc机之间的接口。完整的电路原理图如图6所示。
接口逻辑可以使用集成的cpld实现,本系统中使用的是altera公司的epm7128slc184-10。它将芯片tll6c550作为dsp c32的一个外设端口送行寻址。
图6
相应的接口逻辑使用ahdl语言描述,具体如下:
tl16c550a一共使用8个地址对内部寄存器进行访问和控制。相对dsp c32系统而言,如果使用了上面的译码逻辑电路,则占用的8个地址为:0x818000~0x818007。
tll6c550a串行接口寄存器的寻址表如表1所示。
表1 tl16c550a的寄存器寻址表
dlab* | a2 a1 a0 | 寄 存 器 名 | 属 性 | 地址值 |
0 | 0 0 0 | 接收缓冲寄存器rbr | 只读 | 0x818000 |
0 | 0 0 0 | 发送缓冲寄存器tbr | 只写 | 0x818000 |
0 | 0 0 1 | 中断使能寄存器ier | 读/写 | 0x818001 |
x | 0 1 0 | 中断标志寄存器iir | 只写 | 0x818002 |
x | 0 1 0 | fifo控制寄存器fcr | 只写 | 0x818002 |
x | 0 1 1 | 线路控制寄存器lcr | 读/写 | 0x818003 |
x | 1 0 0 | modem控制寄存器mcr | 读/写 | 0x818004 |
x | 1 0 1 | 线路状态寄存器lsr | 读/写 | 0x818005 |
x | 1 1 0 | modem状态寄存器msr | 读/写 | 0x818006 |
x | 1 1 1 | 便签寄存器scr | 读/写 | 0x818007 |
1 | 0 0 0 | 除数低字节锁存器dll | 读/写 | 0x818000 |
1 | 0 0 1 | 除数低字节锁存器dlh | 读/写 | 0x818001 |
dlab表示线路控制寄存器的第7位的逻辑值。
在程序中,使用逻辑地址0x818000~0x818007对tll6c550a的各个寄存器进行寻址就可以了。
本文介绍的三种实现c32异步串行口的方法,前两种方法使用不是非常方便,而且占用了大量的c32系统资源,一般都使用第三种方法来实现c32和pc机之间的通信。
使用tl16c550实现dsp和pc机的通信,接口方便、控制简单、编程灵活,试验证明它是非常简便可靠的实现方法。