前言
第一次写这个博客,算是新手吧,刚好有这个机会,手边有VEGA的开发板和Arduino的LCD模块,做了点小东西,想和大家分享一下。
一开始只是想着通过SPI协议初始化LCD屏幕,然后发个字符串就好了,后来又尝试着显示图片,磕磕碰碰,修修改改居然也成功了,开心!把这些过程写下来,欢迎讨论,如有不足之处也希望大家不吝指教。
准备工作
- 焊接织女星开发板J1,J2,J3,J4的双排母座,以便与LCD屏通信。前段时间免费申请的织女星开发板出厂是没有焊接这些模块的,所以要自己焊一下。
- 参照《织女星开发板快速入门指南》把“hello world”示例在Eclipse IDE中跑一遍。拿到一个新的东西总是要先把最基本的摸索尝试一下嘛。
- 网上查看LCD模块的相关资料, 网址 贴在这里了:http://www.waveshare.net/wiki/2.8inch_TFT_Touch_Shield。
代码分析和添加
一般情况下支持SPI的设备都会有四根通信线,分别是SIN(数据输入),SOUT(数据输出),SCK(时 钟),CS(片选)。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。
通讯是通过数据交换完成的, SPI是串行通讯协议,数据是一位一位的传输的。由SCK提供时钟脉冲,SIN,SOUT则基于此脉冲完成数据传输。数据输出通过SOUT线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取,完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
查看LCD模块的原理图得知CN2的3,4,5,6引脚分别对应着CS(片选信号),MOSI(主设备输出,从设备输入),MISO(主设备输入,从设备输出),CKL(时钟),如图1 所示。在本示例中,主设备是织女星开发板,从设备是LCD屏,所以MOSI对应着SOUT,MISO对应着SIN。暂时不考虑MISO的情形,因为目前要实现的功能只是用织女星开发板驱动LCD屏并打印,并不需要MISO的功能。除此之外,还有BL(backlight)和DC(command)信号线分别对应着CN2的2号和CN3的8号引脚。
图1 LCD模块引脚
由物理连接可知LCD的CN2的2到6号引脚对应着织女星开发板J2的4,6,8,10,12号引脚,LCD的CN3的8号引脚对应着织女星开发板的J1的16号引脚。查看织女星开发板原理图《VEGA_Lite_SCH》文件,可知J2的4,6,8,10,12号引脚分别连接到PTB3, PTB6, PTB5, PTB7, PTB4,J1的16号引脚连接到PTB1。如图2所示。
图 2 织女星开发板J1,J2端子
表1总结了织女星开发板和LCD模块的部分连接关系。
表1 PIN脚和端子对应表
信号名称 | 端子号 | 信号值 |
---|---|---|
时钟CKL | 12(J2) | PTB4 |
片选CS | 6(J2) | PTB6 |
数据输出SOUT | 8(J2) | PTB5 |
数据输入SIN | 10(J2) | PTB7 |
背光BL | 4(J2) | PTB3 |
数据命令DC | 16(J1) | PTB1 |
在BOARD_InitPins()函数中根据以上分析,初始化相应的pin脚,具体实现如下:
void BOARD_InitPins(void) {
/* Clock Gate Control: 0x01u */
CLOCK_EnableClock(kCLOCK_PortB);
/* PORTB4 is configured as LPSPI0_SCK */
PORT_SetPinMux(PORTB, PIN4_IDX, kPORT_MuxAlt2);
/* PORTB5