DSP与PC机间串口通信的实现
在许多DSP的应用中需要与PC机进行数据交换,使用户通过PC机上友好的程序界面来控制DSP系统的工作、显示DSP的运行结果等。在数据传输过程中,传输的速度的快慢、误码率的大小、效率的高低等都影响到整个系统的性能指标,因此如何高速高效的进行数据传输是不容小视的。前面已经叙述了由于DSP工作频率较高,它的读写时钟的脉宽较窄,使数据在总线上的锁存时间较短。我们开始是使用8251芯片来完成与ADI公司的ADSP21060串行通信,但在实际应用中测得数据传输误码率较高,系统工作可靠性大受影响。主要是因为8251的响应时间较长,不能保证在DSP的读写周期内准确的将数据进行锁存。后来改用PC16550芯片,就能很好的与DSP匹配,问题得到了彻底解决。另外该芯片内置FIFO(First-In, First-Out,先进先出),能存储一定量的数据后再给DSP中断,从而节省了DSP中断服务程序的时间,提高了DSP的工作效率。具体电路如图2。
DSP通过外存选择信号/MS00来片选PC16550,通过信号对其进行读写操作,PC16550占用DSP的外部存储器空间。其它一些信号,如cs0,cs1,rd,wr等可根据典型应用电路所示的连接方式进行连接。与MODEM通信的引脚在本系统中没有使用,故相应引脚悬空即可。在DSP与PC机串口通信时先要对16550进行设置,见下面DSP的汇编程序。
.segment/dm ms0data; /*串口UART*/
.var okdata[512]; /*okdata起始地址为0主00000*/
.endseg;
………
main:
………
/*将line control register的DLABwulf1*/
r0=0x80;b6=okdata;m6=3;l6=0;
dm(m6,i6)=r0;
/*设置波特率为9600*/
r0=0xc;b6=okdata;m6=1;l6=0;
dm(i6,m6)=r0;
/*设置line control register,数据8位,停止位1,其他无*/
r0=0x3;b6=okdata;m6=3;l6=0;
dm(m6,i6)=r0;
/*设置FIFO control register,接收4Bytes数据后产生中断,将接收/发送FIFO清零*/
r0=0x47;b6=okdata;m6=2;l6=0;
dm(m6,i6)=r0;
/*中断允许*/
r0=0xl;b6=okdata;m6=1;l6=0;
dm(m6,i6)=r0;
/*向UART写一个数据0X光5*/
r0=0x55;b6=okdata;m6=0;l6=0;
dm(i6,m6)=r0;
………
本电路硬件和汇编程序都调试通过,并成功地应用于某毫米波侦察雷达信号处理机中。总之,PC16550能够方便、灵活并且高效的完成DSP与PC机间串口的数据通信,而且可使用户实现与标准MODEM之间接口,实行数据远传。
|