引言
近年来,DSP芯片在高速数据处理中得到了广泛的应用。TMS320F2812是美国德州仪器公司(TI公司)专门为工业应用而设计的新一代DSP处理器。该芯片采用了高性能的32位中央处理器、哈佛总线结构,高性能静态CMOS技术,主频最高可达150MHZ(时钟周期6.67ns);具有外部存储器接口XINTF,可扩展多达1MB的存储空间。但是这种高速器件与慢速外设之间的接口产生了问题。一般来说,DSP与慢速外设的接口访问有两种方式:直接访问方式和间接访问方式。间接访问是用DSP的数字I/O口来控制慢速外设,用软件编程来模拟外设的接口时序,加入相应的等待延时来实现;而直接访问是将慢速外设与DSP特定的XINTF区相连,通过增加相应的内部等待状态来实现时序上的匹配。TMS320F2812有多达56个独立的可编程、多用途双向数字I/O口,本文将利用这些I/O口,通过软件编程模拟慢速液晶控制器ST7920的读写时序,实现与液晶通信。
1FYD12842-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的使用手册。
2TMS320F2812与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的硬件接口电路
RS
R/W
功能说明
L
L
MPU写指令到指令暂存器(IR)
L
H
读出忙标志(BF)及直至计数器(AC)的状态
H
L
MPU写入数据到数据暂存器(DR)
H
H
MPU从数据暂存器(DR)中读出数据
表1RS,R/W的配合选择决定控制界面的4种模式
另外,在本设计中,TMS320F2812的I/O口只能接受最大3.3V的电压,而液晶的输出电压有5V,因此在两者之间需要进行电平转换。
2.2DSP与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
}
voidcheckBF()//检查BF位,判断LCD 是否忙
{
unsigned int check
EALLOW;
GpioMuxRegs.GPAMUX.all=0xff00;//设EVA前8脚为通用I/O口,其他为保留功能
GpioMuxRegs.GPBMUX.all=0xff00;//设GPIOB0~2为通用I/O口,其他为保留功能
GpioMuxRegs. GPBDIR.all=0x00ff;// 设GPIOB0~2为输出引脚
EDIS;
GpioDataRegs. GPBDAT.bit.GPIOB0=0;
GpioDataRegs. GPBDAT.bit.GPIOB1=1;//读BF的状态,RS=0,R/W=1
do {
GpioDataRegs. GPBDAT.bit.GPIOB2=1;//E=1
Check=GpioDataRegs. GPADAT.all;
Delay1();//延时140ns以上
GpioDataRegs. GPBDAT.bit.GPIOB2=0;//E=0
check=0x80✓//当第7位,即BF为0时才可以操作
}while(!check= =0x00);
}
void InitialLCD()//液晶初始化
{
writeINS(0x30);//LCD选择为8位并行数据传输,不扩充指令
Delay2(5);//延时大于100us
writeINS(0x0E);//开显示,开游标,关反白
Delay2(5);//延时大于100us
writeINS(0x01);//清屏显示
Delay2(500);//延时大于10ms
writeINS(0x06);//DDRAM的地址计数器(AC)加1
Delay2(5);//延时大于100us
}
voidDelay1()//延时子程序
{
Int i;
for ( i=0;i<5;i++ );
}
voidDelay2(unsigned int nTime)
{
int ii,jj,kk=0;
for ( ii=0;ii<nTime;ii++ )
{
for ( jj=0;jj<215;jj++ )
{
kk++;
}
}
}
欲在ST7920中某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。当字符编码为两字节时,应先写入高位字节,再写入低位字节。ST7920的字符显示地址RAM地址从80H到9FH,与4行8列共32个字符显示区域一一对应。另外,显示ASCII字符过程与显示中文字符过程相同,不过在显示连续字符时,只须设定一次显示位置,有模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。本文以从字库中显示“液晶”字样为例,给出显示“液晶”字符的主程序如下:
main()
{
InitialLCD();//初始化液晶
writeINS(0x80);//设定显示地址为首行首列
writeDATA (0xD2);
writeDATA (0xBA);//显示“液”
writeDATA (0xBE);
writeDATA (0xA6);//显示“晶”
for(;;);
}
3结论
从上面的应用介绍可看出,本文所采用的方法不需要增加硬件,电路结构简单,只占用了TMS320F2812的多达56个I/O引脚中的11个。所以,对剩余较多不用I/O引脚的DSP系统完全可以采用这种接口控制方法,绝大多数下是可以满足要求的。通过该设计我们可以说,采用TMS320F2812模拟外部慢速设备的时序实现与其外设的接口这种方法是一种简单有效的方法,并为各种系统显示、慢速外设的接口设计提供了一种可以借鉴的方法。
本文作者创新点:采用了TMS320F2812的多用途双向数字I/O口,解决了高速设备与慢速外设通讯时序不匹配的问题,实现了对液晶显示模块的并行传输通讯。