打印

DSP与PC间高速串口通信的实现

[复制链接]
1366|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dnux57fds|  楼主 | 2016-11-27 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用UART解决DSP与PC机间通信时速率匹配问题,并给出了具体实现电路。
    关键词:DSP UART 串行通信 FIFO
DSP是一种专门用来实现信号处理算法的微处理器芯片,主要优点有:硬件乘法器,哈佛总线结构,多种寻址方式,零耗循环(zero overhead loop),程序执行时间可预测等。

    正是由于DSP的诸多优点能够满足密集的数学计算,而且DSP应用的另一个突出特点是实时性,使其在通信、雷达、数字电视等领域得到了广泛的应用,而且日益渗透到人们的日常生活的各个方面。

    在实时信号处理中已经离不开DSP,这些处理系统中包含了各种数据通信,例如DSP与DSP间数据通信,DSP与PC机间数据通信等。如何能够快速、准确的完成通信是每个硬件工程师所关心的问题。由于DSP的工作频率较高,如TMS320C6201时钟频率为200MHz,ADSP21060时钟频率为40MHz,故其数据读写周期很短,然而PC机串口读写速度较低,最大数据吞吐量约为115kbps,尽管DSP在与这些慢速外设进行数据交换时可以加入额外的等待周期,但是在实时性要求苛刻,算法复杂的场合,将DSP从这些冗长的等待周期中解放出来,将其时间重点放在处理关键的实时任务中去,有着重要的实际意义。故DSP与PC机之间串口通信的速度匹配是保证快速、准确通信的关键。

    PC机一般带有一个或两个内置串口,每个端口的机箱背后有一个9针或25针的公插口。串口是以bit来传输数据的,传输速率取决于UART芯片。该芯片将PC总线上的并行数据(单字节或多字节)分割成以比特为单位的串行数据流,从而实现在串口线缆中的数据传输。

    现在几乎所有的PC机都带有16550UART用以实现并行数据和串行数据的格式转换,它的最大数据吞吐量为115kbps,这已经能够满足大多数串行设备的需要了。

    PC16550是国家半导体公司生产的通用异步接收/发送器(UART)芯片,它不仅能把从CPU接收的数据进行并-串转换,还能够把从外围设备或MODEM接收到的数据进行串-并转换。
该UART包括一个可编程的波特率产生器,可将输入的时钟信号进行分频,并可产生16倍的时钟来驱动内部的传输逻辑单元。同时它内部集成了中断逻辑,另外通过对其内部的寄存器的设置可以完成相应功能,这些寄存器主要有:线路控制寄存器、FIFO控制寄存器、中断使能寄存器、MODEM控制寄存器、线路状态寄存器等。因而它可以与大多数的CPU实现无缝接口,使用很方便。PC16550的功能主要包括:

    * 工作在FIFO模式时,接收器/发送器自带16字节的FIFO存储器,减少了中断CPU的次数;

    * 串行数据位数可编程,起始位、停止位的长度,奇偶校验位的有无可以分别控制;

    * 可分别产生数据的接收/发送、线路状态等中断,各中断的优先级可设定;

    * 可编程波特率产生器;

    * 芯片全部工作状态报告功能;

    * 内部自诊断功能;

    其典型应用电路如图1所示。

DSP与PC机间串口通信的实现

   
在许多DSP的应用中需要与PC机进行数据交换,使用户通过PC机上友好的程序界面来控制DSP系统的工作、显示DSP的运行结果等。在数据传输过程中,传输的速度的快慢、误码率的大小、效率的高低等都影响到整个系统的性能指标,因此如何高速高效的进行数据传输是不容小视的。前面已经叙述了由于DSP工作频率较高,它的读写时钟的脉宽较窄,使数据在总线上的锁存时间较短。我们开始是使用8251芯片来完成与ADI公司的ADSP21060串行通信,但在实际应用中测得数据传输误码率较高,系统工作可靠性大受影响。主要是因为8251的响应时间较长,不能保证在DSP的读写周期内准确的将数据进行锁存。后来改用PC16550芯片,就能很好的与DSP匹配,问题得到了彻底解决。另外该芯片内置FIFO(First-In, First-Out,先进先出),能存储一定量的数据后再给DSP中断,从而节省了DSP中断服务程序的时间,提高了DSP的工作效率。
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之间接口,实行数据远传。


相关帖子

沙发
zhangmangui| | 2016-11-27 21:38 | 只看该作者
串口的最高速也是很有限的

使用特权

评论回复
板凳
zhangmangui| | 2016-11-27 21:38 | 只看该作者
感谢楼主分享

使用特权

评论回复
地板
Rangar| | 2016-11-29 15:29 | 只看该作者
串口是以bit来传输数据的,传输速率取决于UART芯片。

使用特权

评论回复
5
qiufengsd| | 2016-11-30 23:25 | 只看该作者
还是使用usb通信速度快。

使用特权

评论回复
6
qiufengsd| | 2016-11-30 23:27 | 只看该作者
5509都没有串口通信的接口。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

110

主题

113

帖子

0

粉丝