引言
DSP芯片具有高速的信息处理能力、较好的系统支持、硬件配置强等优良技术和较低的价格特性。嵌入式系统的实时性好、占用资源少、功能强、可靠性高、模块化结构、便于移植和定制的特点。基于 DSP平台的嵌入式系统具备上述两者的优点,特别适用于一些带各种便携式系统终端 LCD且需要大量数据要处理的系统。
近年来,DSP已经越来越多地被应用于数据采集、语音处理、图像分析与处理等领域中,并且日益显示出巨大的优越性。而液晶显示屏更以其显示直观、功耗低、便于操作的特点被用作各种便携式的显示前端。本文介绍了一种基于DSP 和CPLD的液晶模块的设计与实现方法,解决快速处理器与慢速外设的匹配问题。 1系统总体设计
该显示系统主要由DSP、CPLD、电平转换和 LCD模块四部分组成,如图 1所示,
该系统中,DSP采用 TI公司的 TMS320F2812处理器。采用高性能静态的 CMOS技术,使得供电电压降为 3.3V,降低了控制器的功耗;150MIPS的执行速度使得指令周期缩短为6.67ns,从而提高了控制器的实时控制能力;可以进行 16×16和 32×32的乘加操作,可以方便的进行FFT、FIR滤波等数字信号处理算法;具有多达 56个通用、双向数字 I/O引脚,能方便的实现各种 I/O操作。
CPLD 采用 Altera公司 MAX7000系列的 EPM7128SQC100,3.3V供电,不存在 DSP及 LCD电平兼容的问题,采用 CMOS E2PROM工艺,传输延迟仅为5ns;具有 68个用户可编程的 IO 口,为系统定义输入、输出和双向口提供了极大的方便; EPM7128同时还提供了 JTAG接口,可进行 ISP编程,极大地方便了用户。本文采用CPLD 的主要目的是:对于 LCD显示,将 DSP中的数据发送到CPLD,然后 DSP去做其它的事情,而后续的显示任务由 CPLD完成,CPLD 将在 LCD允许的速度下对其进行操作即可达到显示的目的。
LCD 模块采用成都飞宇达的 FYD12864-0402B,内置 ST7920液晶控制器。它是一种具有 4位/8位并行、 2线或 3线串行多种接口方式,内含中文字库的点阵图形液晶显示模块。其显示分辨率为 128*64,内置 8192个 16*16点汉字和 128个 16*8点 ASCII字符集,强大的字库省去了很多自行编码的麻烦;可以显示中文字型、数字符号、英文字母以及图形等,利用该模块灵活的接口方式和简单方便的操作指令,可构成友好的中文人机交互界面。
硬件接口设计
由于 DSP属于高速器件, LCD为慢速外设,DSP对读写周期较慢的 LCD进行访问,可采用以下两种方式来解决 DSP与 LCD的时序匹配问题:直接访问和间接访问。直接访问是将 DSP的读写信号与 LCD接口的读写信号直接相连,将 LCD的 8位数据线与 DSP的低 8位数据线相连(在 CPLD内部硬件编程完成),时序由 DSP内部读写逻辑控制。由于 LCD的读写周期较 DSP慢,要使两者的时序匹配,还必须进行一些时序方面的处理。间接访问用 DSP的 I/O口间接控制慢速设备,可以通过软件控制 DSP的 I/O口来实现与慢速外设的时序匹配。该方法无需通过硬件扩展即可实现与任意慢速外设的时序匹配。在该显示系统中,由于 CPLD的可在线硬件编程能力,这 2 种方法均可实现。这里采用第一种接法。 DSP与 LCD的硬件接口电路图如图 2所示。
LCD 各引脚说明如下:RS为高电平时,DB7—DB0显示数据;RS为低电平时,DB7—DB0显示指令数。R/W为高电平时,数据被读到DB7—DB0; R/W为低电平时,DB7—DB0的数据被写到IR或 DR。E为使能信号线。当 E为高电平时,配合 R进行读数据或指令,当 E为低电平时,配合/W进行写数据或指令。PSB为高电平时,表示 8位或四位并口方式;PSB为低电平时,表示串口方式。RESET为复位信号输入端,低电平有效。DB7—DB0为三态数据线。 其中 RS与 R/W配合决定控制界面的四种模式:
另外,由于 FYD12864用 5V供电,所以液晶的 8位数据线不能直接与 DSP的外部扩展数据总线相连。本系统中采用 74ALVC16245来进行电平转换, 74ALVC16245是 16位的电源 转换芯片,采用 3.3V供电,该芯片有两个方向控制引脚( DIR1和 DIR2),DIR1由 CPLD的 I/O引脚供给,当 DSP从液晶读取数据时,DIR1为低电平,数据的传输方向是从液晶到 DSP;当 DSP往液晶写数据时,DIR1为高电平,数据传输方向是从 DSP到液晶。DIR2与 VCC相连,由 CPLD的 I/O引脚控制 LCD。 3 软件编程及实例
本系统中,CPLD部分采用 VHDL进行编程,主程序采用 C语言进行编程,便于程序的移植,并使其具有较高的可读性。首先解决 DSP与 LCD的时序匹配问题,时序匹配是 DSP控制 LCD最关键的问题,其实质是如何编写程序对 LCD的指令寄存器和数据寄存器进行读写操作,接口时序如图 3和图 4所示,
使用该显示模块时应注意以下几点:(1)欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字母编码。(2)显示 ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加 1指向下一个字符位置,否则,显示的字符中将会有一个空 ASCII字符位置。(3)当字符编码为两字节时,应先写入高位字节,再写入低位字节。(4)模块在接收指令前,处理器必须先确认模块内部处于非忙状态,则读取BF标志,BF需为“0”,方可接收新的指令。如果在送出一个指令前不检查 BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。
通过初始化液晶显示屏以及调用字库显示汉字和字符来具体说明 DSP控制液晶显示屏的设计思想。系统硬件上电复位后,首先完成 DSP的初始化,然后根据用户系统的需要对控制器的各项指令代码及其参数进行设置,以完成液晶模块的参数以及显示方式等一系列过程的初始化。液晶模块具体编程如下:
#include "DSP28_Device.h"
unsigned int * LcdComL = (unsigned int *) 0x5100;//命令寄存器低地址
unsigned int * LcdComH = (unsigned int *) 0x5200;//命令寄存器高地址
unsigned int * LcdDatL = (unsigned int *) 0x5300;//数据寄存器低地址
unsigned int * LcdDatH = (unsigned int *) 0x5400;//数据寄存器高地址
void WriteLcdCom(unsigned char c);//写命令
void WriteLcdDat(unsigned char d);//写数据
void delay(unsigned int t);//延时
void main(void)//主程序
{ InitSysCtrl();//初始化系统
DINT;// 关中断
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();//初始化
PIE InitPieVectTable(); //初始化
PIE中断矢量表
InitPeripherals();//初始化外设
LcdComL = 0x00;//初始化命令寄存器
LcdDatL = 0x00;//初始化数据寄存器
WriteLcdCom(0x01);//清除显示屏
WriteLcdCom(0x0e);//显示状态打开
WriteLcdCom(0x30);//LCD选择为 8位并行数据传输方式
比如要在显示屏第一行显示“检测物质:Theanol”
WriteLcdCom(0x80); //写第一个字符的地址
WriteLcdDat(0xbc); //第一个汉字“检”的高字节
WriteLcdDat(0xec);//“检”的低字节
WriteLcdDat(0xb2);//汉字“测”高字节
WriteLcdDat(0xe2);//“测”低字节
WriteLcdDat(0xce);//汉字“物”高字节
WriteLcdDat(0xef);//汉字“物”低字节
WriteLcdDat(0xd6);//汉字“质”高字节
WriteLcdDat(0xca);“质”低字节
WriteLcdDat(0x3a);//冒号“: ”
WriteLcdDat(0x45);//字符“ T”
WriteLcdDat(0x74);//字符“ h”
… for(;;);
} void WriteLcdCom(unsigned char c) { * LcdComH = c;
* LcdComL=c;
delay(5000); } void WriteLcdDat(unsigned char d) { * LcdDatH = d;
* LcdDatL = d;
delay(5000); } void delay(unsigned int t) { while(t>0)
t--; }
以上程序均在 DSP集成开发环境 CCS中调试通过,LCD显示屏上可以正常显示连续的汉字、字符以及图形等,在实际的嵌入式数据采集系统中得以应用。通过移植本文的程序,修改其中一些命令,可以完成更加复杂的功能,并且具有缩短产品开发周期,加快产品上市等优点,因此非常适合便携式设备的界面显示系统。
结论
本文作者创新点:以 DSP为核心处理器,利用 CPLD来进行逻辑转换和控制,实现高速CPU处理器和低速外设接口的时序匹配,同时采用了移植性能和可读性能高的 C程序设计,无需插入等待周期,在实际的嵌入式系统中成功运行,为快速处理器与慢速外设的接口设计提供了一种借鉴的方法。