众所周知,TMS320C6203B DSP本身不带UART(RS232)口,在使用C6203B+FPGA的嵌入式系统中要实现UART通信有三种方案可选:
1、用DSP的McBSP(多通道缓冲串口)仿真UART,可参见TI的技术文档SPRA633B,网上也许多文章对此进行了较详细的介绍。但此方案的缺点是大部分模拟仿真工作需软件完成,且UART通信速度较慢(最大几百K)对实时处理系统的速度影响较大。
2、扩充外部专用UART芯片,特别可以利用DSP的SPI口可方便地与SPI-UART专用芯片(如NXP的SC16IS762)相连。此方案的缺点是需更改系统设计,没有充分利用系统现有资源(FPGA)。
3、利用系统中的FPGA实现UART通信,此方案弥补了上述2个方案的缺点。虽然用FPGA实现UART是件很简单的事,但由于C6203B DSP的特殊性,实现起来技术上却存在不少难点:
(1)C6203B与FPGA只能用XBUS扩展总线相连,读写FPGA不能使用普通I/O指令,必须使用DMA方式,这样就加大了读写操作的复杂性,调试起来也较麻烦。
(2)FPGA实现UART的免费IP核有很多,比较常见的有LAttice的8250UART、Xilinx的简易UART,以及网上很容易下载到的97版UART(与Xilinx的类似)。但这些IP源代码都要检测-RD、-WR信号的上升/下降沿,对应DSP的信号为:-XRE、-XWE。由于C6203B的主频达250M,其读写信号的负脉冲宽度只有10ns左右,而UART模块中检测读写信号边沿所用的同步时钟频率即使在115.4K高波特率时才1.83M(115.4Kx16),显然很难正确识别读写信号的边沿,因而导致收发模块无法正常工作。
通过对Xilinx的UART模块做适当修改,收发数据就完全正确了。不过在做”PC机发送-DSP接收并回送-PC机接收“试验室时发现:如果PC机一次发送多个字节数据,或者连续发送多个字节数据,PC机接收有时要丢数据。后反复多次试验证明,不是UART模块的问题,而是PC机用的“串口调试助手”的问题,改用一种串口调式工具就可以了。
(3)UART模块约定DSP接收采用中断方式。DSP的外部中断EXT4~7尽管是上升沿起作用,但要求中断脉冲(正脉冲)宽度不能太宽(可能是DSP/BIOS的缘故),而原来的UART接收模块在收到数据后,先将中断信号(即”数据准备好“信号)从”0“->”1“,一直保持”1“,要等DSP读缓冲器数据后,由”-RD“信号将其清”0“。这样做DSP不会响应中断,必须将其改为UART接收模块自己清”0“(延时1个同步脉冲宽度)才可以。