引言
近年来,DSP芯片在高速数据处理中得到了广泛的应用。TMS320F2812是美国德州仪器公司(TI公司)专门为工业应用而设计的新一代DSP处理器。该芯片采用了高性能的32位中央处理器、哈佛总线结构,高性能静态CMOS技术,主频最高可达150MHZ(时钟周期6.67ns);具有外部存储器接口XINTF,可扩展多达1MB的存储空间。但是这种高速器件与慢速外设之间的接口产生了问题。一般来说,DSP与慢速外设的接口访问有两种方式:直接访问方式和间接访问方式。间接访问是用DSP的数字I/O口来控制慢速外设,用软件编程来模拟外设的接口时序,加入相应的等待延时来实现;而直接访问是将慢速外设与DSP特定的XINTF区相连,通过增加相应的内部等待状态来实现时序上的匹配。TMS320F2812有多达56个独立的可编程、多用途双向数字I/O口,本文将利用这些I/O口,通过软件编程模拟慢速液晶控制器ST7920的读写时序,实现与液晶通信。
1 FYD12842-0402B液晶显示模块简介
点阵式液晶显示模块是一种集显示、控制与驱动为一体的显示器件,在设计中我们采用的是成都市飞宇达实业有限公司生产的液晶显示模块FYD12864-0402B,内置ST7920液晶控制器。
FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。其显示分辨率为128 64,内置8192个16*16点汉字,和128个16*8点ASCII字符集,强大的字库省去了很多自行编码的麻烦;该模块不仅可以显示8 行16 16点阵的汉字,利用其灵活的接口方式和简单、方便的操作指令,还可构成全中文人机交互图形界面;其内置了DC~DC转换电路,无需外加负电压,无需片选信号,简化了软件设计。
总之,由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,具体可以参看FYD12864-0402B的使用手册。
2 TMS320F2812与ST7920的硬件接口设计
2.1 间接硬件接口设计
TMS320F2812与ST7920的间接硬件接口设计如图1所示。ST7920并、串口方式可选,当PSB置高时为并行方式,置低时为串口方式。本例在实际应用中仅使用8位并口的通讯模式,故将PSB接固定高电平。RESET为液晶复位引脚,低电平有效。V0与VOUT以图1中方式相连可以调节LCD的对比度。本设计用TMS320F2812的GPIOA0~7作为数据接口,GPIOB0、GPIOB1分别与RS、R/W相连作为控制信号,其具体控制功能如表1所示。E为ST7920的使能信号,将其与GPIOB2相连,E=1时,配合R进行读数据或指令;当E=1 时,配合/W进行写数据或指令。
图1 TMS320F2812与ST7920的硬件接口电路
另外,在本设计中,TMS320F2812的I/O口只能接受最大3.3V的电压,而液晶的输出电压有5V,因此在两者之间需要进行电平转换。
2.2 DSP与ST7920的软件接口设计
DSP和液晶模块的接口包括2部分操作:DSP读液晶模块状态的操作;DSP向液晶模块写数据和指令的操作。这些操作的实现是参考液晶模块的时序图,产生满足这些时序的接口控制逻辑。液晶的时序图如图2所示。
(b) ST7920读资料时序图
图2 ST7920读写时序图
其中,TC=1200(MIN),TPW=140(MIN),TR=TF=25(MAX),TAS=10(MIN),TAH=20(MIN),TDSW=40(MIN),TH=20(MIN),TDDR=100(MAX)(单位均为ns)
从时序图可以看出,ST7920的RS、R/W可以同步操作,读写操作是由使能信号E完成的,因此,在软件设计中关键是要设计出合理的E信号,以满足ST7920的读/写时序。要实现对ST7920的正确读写必须使F2812的I/O口模拟时序注意满足以下条件:
(1) 在读写时,必须使E信号,即IOPB2保持高信号140ns以上
(2) 在写操作时IOPA0~IOPA7的数据必须在E信号变为低电平前保持40ns以上
(3) 在读、写两个数据之间的间隔必须大于1200ns。
此外,ST7920有内部标志忙标志BF,BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据;BF=0时,模块为准备状态,随时可接受外部指令和数据。因此,在送出一个指令前需检查BF标志位,如不检查,则在前一个指令和这个指令中间必须延迟一段较长的时间,等待前一个指令确定执行完成。从程序的可移植性和通用性方面考虑,本设计选用了C语言进行软件模块的设计实现。另外,在软件的编写上采用了结构体、共用体的方法,以结构体成员的形式来访问寄存器的某一位或者某几位。相比以前使用的宏定义方式,这种方式实现了对寄存器位域的独立访问,为寄存器提供了更加灵活和高效的访问手段,也大大提高了代码的可读性、可靠性和可维护性。现给出程序如下:
void writeINS (int INS ) //DSP向液晶写入命令
{
checkBF();//测试BF位是否忙
EALLOW;
GpioMuxRegs. GPADIR.all=0x00ff;//设GPIOA0~7为输出引脚
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=0;
GpioDataRegs. GPBDAT.bit.GPIOB1=0;//写指令到LCD,RS=0,R/W=0
GpioDataRegs. GPADAT.all=INS;//输出指令
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Delay1();//延时140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0,指令写入LCD
}
void writeDATA(int data) //向液晶写入数据
{
checkBF();//测试BF位是否忙
EALLOW;
GpioMuxRegs. GPADIR.all=0x00ff;//设GPIOA0~7为输出引脚
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=1;
GpioDataRegs. GPBDAT.bit.GPIOB1=0;//写数据到LCD,RS=1,R/W=0
GpioDataRegs. GPADAT.all=data;//输出数据
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Delay1();//延时140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0,数据写入LCD
}