ADSP218X作为16位的定点数字信号处理器,以其低成本、低功耗的特点在实际中有着广泛的应用。它主要面向通信系统等对处理数据和动态范围适中、更强调产品成本和功耗的应用领域。ADSP218X系列定点DSP相对于其他定点DSP的突出优点是片内高速存储器容量大,寻址能力强,运算速度快,对于需要较大存储器(40~80kB)的应用,ADSP218X可以构成外围设备少的系统[4] 。除此之外,ADSP218X还有强大的系统接口,有两个带有自动压扩功能的双缓冲串口。ADSP218X的串口属于同步串口,与标准的异步串行接口不同,要想实现ADSP218X与PC机串口的通信,我们必须在DSP中采用软件模拟通用异步收发器(UART)的方法来实现两者的通信。
2串行通信和DSP串口
在典型的RS-232接口中,由于没有时钟信号,所以数据按照设定的固定波特率传送。在一帧信号中通常包括开始位、停止位和数据位,校验位可选。其中数据位为5~8bits;奇偶校验位共有5种方式可选:奇校验、偶校验、始终为1、始终为0以及空;停止位也有3种选择:1位、1 1/2位以及 2位。串口传数时低位优先,由开始位表示数据的传送。
ADSP218X有两个双向双缓冲的同步串口,通过帧信号来控制数据流。每一个串口有5个信号:串行时钟SCLK、接收帧同步(RFS)、发送帧同步 (TFS)、串行数据接收(DR)和串行数据发送(DT)。两个串口都可以使用外部时钟,也可以利用DSP的内部时钟,内部产生串口时钟时频率由串行时钟除法寄存器SCLKDIV确定。帧同步信号也有内外选择,既可以自己产生,也可以由外部设备提供,它用于指示串行数据字的开始。串口数据的字长在 3~16bit之间任意设置,共有4种格式:右对齐高位零填充、右对齐高位符号位填充、 μ率压缩及A率压缩。SPORT在DR上接收数据,在DT上发送数据,可实现双工操作。数据比特利用串口时钟同步。在ADSP218X的两个串口中,SPORT1除了可以作为普通串口,还可以作为外部中断和标志位使用。通过设置系统控制寄存器(0X3FFF)的 bit10,DR1和DT1相应可作为FLAG IN(标志位输入)和FLAG OUT(标志位输出),这两个管脚在软件UART的过程中可以作为数据的输入和输出管脚。ADSP218X的串口在传输时高位优先。
ADSP218X的串口使用主要是通过设置各内存映射控制寄存器来实现,各寄存器的具体含义及设置请参阅文献[2]。
3DSP软件UART的实现
由以上看出,DSP的串口和PC机的串口在数据格式以及传送控制上有区别,但是通过软件模拟以及必要的硬件控制,就可实现DSP与标准串口间的通信。在ADSP218X上软件模拟UART有3种主要的方法:直接利用DSP的串口,通过控制串口的传送模式来实现;利用DSP的定时器,通过标志位管脚的输入输出来实现;利用DSP的外部中断,通过中断处理程序来实现。本文主要介绍前两种方法。
3.1 DSP串口实现的软件UART
通过对DSP的串口控制寄存器进行设置以及对接收和传送数据进行必要的处理,利用图1所示的电路,DSP就可以与PC进行数据交换。
发送数据时,设置串口为内部时钟,内部产生帧同步信号,传送时可按照实际的波特率发送数据。但是由于接收时需要设置DSP串口速率为波特率的3倍,所以发送时仍然按3倍波特率发送,因此在传送前必须对数据进行处理,除了加上开始位和结束位外,还需将待传数据按位扩展,即将1和0分别扩展为111和000,10bit数据因此变为30bit,而DSP串口发送寄存器同样为16bit,所以发送要分上下字进行两次。
需要注意的是DSP串口工作时高位优先,而 RS-232传输时低位优先,因此我们必须通过软件调整接收和发送数据的顺序。图2所示是DSP在接收数据时的中断处理程序流程图[3]。
3.2 用定时器实现的软件UART
用定时器来实现DSP的软件UART主要是利用定时器中断来处理数据,用标志位输入和输出管脚来传送数据。ADSP218X共有13个可编程标志位管脚,在本例中以SPORT1的FLAG IN和FLAG OUT作为输入和输出管脚,所以在初始化时首先要配置SPORT 1工作在中断和标志位状态,使用其他标志位管脚时需要相应设置可编程标志位控制寄存器。 ADSP218X的定时器控制主要通过TPERIOD(定时器周期)、TCOUNT(定时器计数)和TSCALE (定时器定标)寄存器完成。同串口UART一样,为了保证数据的正确性,设置定时器工作在3倍的波特率,每个数据位接收3次,仅在中间一位判断接收数据。相应的在发送时必须通过软件控制来实现3次中断发送一位数据。采用定时器实现软件UART的硬件连接如下:
DSP FO → 电平转换 → RS232 RX
DSP FI ← 电平转换 ← RS232 TX
中断服务程序分接收和发送两个部分。进入中断后,程序首先判断是否有数据要发送,若没有则直接进入接收状态;若有就继续判断是否应该在这次中断发送数据位。因定时器工作于3倍的波特率,所以此定义参数TIMER_CENTREL为3,每次中断TIMER_CENTREL减1,当其为0时发送待传比特位。在接收服务程序中,首先应判断上一个接收字的停止位是否已经收到,收到就等待全部停止位接收完毕后,返回主程序;若没有收到就表明DSP正在接收数据或者等待接收新的数据。当DSP 等待接收新的数据时,不断抽样FLAG IN管脚检测数据的开始位,检测到开始位后,就在每3次中断后检测FLAG IN管脚,根据管脚电平高低判断接收为1为0,并根据此值构造接收数据。需要注意的是在刚刚检测到开始位的时候,为了在数据位的中间取样,应该等到第4次中断时再判断,而此后就只需等待3次中断。图3和图4分别是调用UART传送数据和中断处理时发送部分的程序流程图。发送一组数据时,为了判断前一数据字是否传送完成,在图3中每调用传送程序时我们加入标志位进行查询,若有数据正在处理则等待,没有则初始化相应变量,置标志位为0,表示有数据要发送,然后等待中断。在图4的发送程序中,同样先判断是否有数据要发送,若没有则直接进入接收部分[3]。4调试结果
为了验证上述方法的正确性,在ADSP2189系统中,以DSP压缩系统为硬件环境,以Visual DSP++2.0为软件环境分别采用串口和定时器的方法测试了数据传输。以定时器方式为例,设定波特率为9600,则TPERIOD和TCOUNT等于2603,TSCALE等于0。测试时将压缩结果缓冲区 DATA_OUT内数据通过RS-232接口传入PC机,然后再由PC传回DSP的接收缓冲区DATA_IN,通过在Visual DSP++编译环境下设定PLOT选项,得到如图5所示的结果。图中以输出DATA_OUT为横轴,以输入DATA_IN为纵轴,如果输入和输出之间呈线性关系,则表明DSP和PC间通信无误。由图可以看出我们的数据传输完全正确。
这两种方式都可以实现软件的UART,但不同方法对系统资源占用要求不同。采用定时器方法时,DSP必须时时检测标志位输入管脚,每发送和接收一位数据就要调用3次中断服务程序,导致处理器效率降低;采用DSP串口方法的好处是接收发送单独处理,没有定时器中断,减少了不必要的中断服务开销,同时解放了定时器,它的缺点是控制寄存器的设置以及硬件连接相对复杂。在具体应用中应该从系统的角度出发,选取合适的传送方式。
5结论
主要讨论了ADSP218X的同步串口在与计算机的异步串口通信过程中的软件设计。本方法具有一定的普遍意义,基本思想可以同样适用于其他同步串口与异步串口之间的通信。
参考文献:
[1] 李建华,等. RS-232和调制解调器通信编程[M].人民邮电出版社.
[2] ADSP-218x DSP Hardware Reference ,First Edition,Analog Device[M],2001.
[3] ADSP-218x DSP Instruction Set Reference ,First Edition,Analog Device[M],2001.
[4] 苏涛,等.高性能数字信号处理器与高速实时信号处理[M]. 西安:西安电子科技大学出版社.
[5] RS-232 datasheet https://www.dzsc.com/datasheet/RS-232_584855.html.
[6] DB25 datasheet https://www.dzsc.com/datasheet/DB25_2528709.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。