LCD驱动

因为上头任务的安排,需要将Linux上的LCD驱动移植到Nuttx(一种实时操作系统,据说现在很火,还是一个外国人自己在维护,这真是一个大牛!有很多接口和Linux上的接口都不怎么相同,甚至有的都没有相对应的接口,同时该操作系统没有底层和应用层的概念,最后所有的程序镜像都合成一个nuttx镜像,该镜像中有已经有事先写好的程序)。因为之前已经在Linux上已经写好了驱动程序,所以任务还是比较简单的,但因为还是一个新手,所以还是有点吃不消。这款JM12864的LCD可以使用SPI控制器进行传输命令或者数据。因为之前说过SPI的驱动在linux中有一套接口,在nuttx中好像也有类似的一套SPI接口,但是实际上我们并没有完全使用它的接口,而是在底层的相关文件夹中,只是注册了一下回调函数,在应用程序中直接调用该回调函数。

在硬件层面,在最一开始,需要打开相关SPI总线(CLK,CS,MOSI,MOSI)的管脚复用的寄存器,根据芯片手册,要先配置SPI控制寄存器中的一些值(SPICR_SPIEN,SPICR_CS_SEL,SPICR_WR_EN,SPICR_RD_EN,SPICR_CLK_EN,SPICR_DIV),同时还要向控制寄存器中写入一次传输数据的位数。

SPI发送数据:1)先将数据填充到数据寄存器中。2)在控制寄存器中模式位写入是写。3)在控制寄存器中开始位写入1值,表示开始发送。4)读取SPI的状态寄存器发送数据是不是为空,并且是否已经完成5)将控制寄存器开始位写入0值。

SPI接收数据:1)在控制寄存器中模式位写入是读2)在控制寄存器中开始为写入1值表示开始接收4)读取SPI的状态寄存器接收数据是不是满5)在控制寄存器中开始位写入0值6)读取接收数据寄存器中的值

SPI工作正常之后,LCD驱动就是比较好完成了,LCD发送的内容分为命令和数据,主要实现方式就是在其中一条线上写0或者写1。

首先LCD也需要进行初始化,具体的初始化命令就要根据不同的芯片手册来编写了。Note:因为MISO和MISO一旦被管脚复用使能之后,就算向该地址写入数据也是没有用的,所以命令和数据模式切换的时候需要注意一下。

这几天调试让我印象最深刻的就是字库和一个字节是如何在LCD上显示出来的,一个字节中有8个位,每个位的0和1分别代表白和黑,所以写入一个字节会有8个点被显示出来(入如果是从零开始的话就是第一列的前8个点会被显示出来),而如果想要显示一个完整的字符,光光一个字节(也就是一列)是不够的,所以对于一个英文字符需要8×16的点来显示,也就是8×16/8=16字节,而这16个字节里面的内容当然可以自己去填充(要根据英文字符的样子来编写),最好是使用字库去显示。

具体的实现方式是先分配一块堆中的内存(128×64/8=1024大小),然后在内存中填入你想要在LCD上显示的内容的char类型的数据。注意的是英文字符占了两行,所以一开始根据要填入的字符从字库中解析出来的首地址,在赋值到内存中第一行之后,需要将指针再加上一行的大小(128)再填充8列的数据。这样一个英文字符所对应的内容就完成了。因为之前的规定LCD总共有128×64个点,一个英文字符有8×16个点,所一个整个LCD最多能够显示(128×64)/(8×16)=64个字符。

总的来说LCD还是比较简单的,但是我感觉还是学到了不少的东西,才刚刚是职业生涯初期,慢慢积累,不断加油!

你可能感兴趣的:(linux驱动)