1. 基于TI MSPM0G3507的1.28寸GC9A01圆屏SPI驱动移植实战
基于TI MSPM0G3507的1.28寸GC9A01圆屏SPI驱动移植实战最近在做一个智能手表的小项目选了一块1.28英寸的圆形IPS屏显示效果确实不错。屏幕驱动芯片是GC9A01通信接口是SPI。我用的主控是TI的MSPM0G3507这块芯片性价比很高但网上关于它驱动这块圆形屏的资料不多。折腾了两天总算把驱动移植成功了过程中踩了不少坑。今天我就把完整的移植过程从硬件接线到代码修改一步步分享出来希望能帮到同样在用MSPM0系列芯片的朋友。1. 准备工作认识你的屏幕和资料在开始动手写代码之前咱们得先把屏幕的“家底”摸清楚把该准备的资料都备齐。1.1 屏幕规格与资料获取我用的这块屏幕是1.28英寸的圆形IPS LCD驱动芯片是GC9A01。它的核心参数如下参数项规格说明工作电压3.3V工作电流约20mA模块尺寸44mm (高) x 36mm (宽) x 2.8mm (厚)通信协议SPI (串行外设接口)驱动芯片GC9A01注意屏幕工作电压是3.3V务必确保你的开发板供电也是3.3V直接接5V可能会烧毁屏幕所有的资料包括屏幕的数据手册、测试例程、字库图片等都可以从下面的链接获取。我强烈建议你先下载下来跟着教程操作时会方便很多。资料下载链接:https://pan.baidu.com/s/1lSjp7ISiKhkaXwqJsEOu2g提取码:8888下载解压后你会看到一个文件包里面最关键的就是厂家提供的通用C语言例程。这个例程是移植的基础但它通常是为STM32等常见MCU写的我们需要把它“翻译”成MSPM0能听懂的语言。1.2 引脚功能说明这块屏幕通过一个8Pin的FPC排线与主板连接。每个引脚是干什么的必须搞清楚这是硬件接线和软件配置的根基。屏幕的8个引脚及其作用如下表所示屏幕引脚功能说明对应MCU SPI引脚GND电源地接GNDVCC电源正 (3.3V)接3.3VSCLSPI时钟线SCK (时钟输出)SDASPI数据线MOSI (主机输出)RES复位引脚低电平有效接任意GPIODC数据/命令选择引脚接任意GPIOCSSPI片选引脚低电平有效NSS (片选)BLK背光控制引脚接任意GPIO或3.3V这里有几个关键点需要理解SCL (SCK)和SDA (MOSI)这是SPI通信的核心数据线必须连接到MCU的硬件SPI引脚上。RES, DC, CS, BLK这些是控制引脚它们不参与SPI数据传输只负责发控制信号因此可以连接到MCU的任何普通GPIO引脚上。灵活处理如果你的项目GPIO非常紧张RES可以接到MCU的复位引脚这样MCU复位时屏幕也复位BLK可以直接接3.3V或悬空代价是无法用代码控制背光开关。2. 硬件连接与SysConfig图形化配置硬件连接是第一步也是最容易出错的一步。连接好后我们利用TI强大的SysConfig工具来生成初始化代码能省去大量手动配置寄存器的麻烦。2.1 开发板引脚连接我使用的是MSPM0G3507开发板根据板子的引脚布局和我的项目情况选择了如下连接方式屏幕引脚连接到MSPM0G3507引脚GNDGNDVCC3.3VSCLPB9(作为SPI CLK)SDAPB8(作为SPI MOSI)RESPB10DCPB11CSPB14BLKPB26(用于PWM调光)提示PB8和PB9是这款芯片上SPI0的默认MOSI和CLK引脚用它们最省事。RES、DC、CS、BLK你可以根据自己板子的空闲情况任意更换记得在代码里同步修改就行。2.2 使用SysConfig配置引脚和SPITI的Code Composer Studio (CCS) 或 SysConfig独立工具提供了图形化配置界面这是我们移植工作的“神器”。打开工程与SysConfig在你的CCS工程中找到并双击empty.syscfg文件系统会自动打开SysConfig配置界面。添加GPIO配置我们需要为RES、DC、CS、BLK这四个控制引脚添加GPIO配置。点击界面上的ADD按钮。在搜索框输入“GPIO”选择GPIO驱动。一共需要添加4个GPIO实例分别对应四个引脚。在每个实例的配置中选择正确的引脚编号如PB10并将方向设置为“输出”(Output)。其他参数保持默认即可。添加并配置SPI再次点击ADD搜索并添加SPI驱动。在SPI配置中选择SPI0作为实例与你硬件连接的SPI模块对应。将MOSI引脚设置为PB8CLK引脚设置为PB9。模式选择GC9A01屏幕是SPI从机我们的MCU是主机。需要将模式设置为Master(主机模式)。帧格式根据GC9A01数据手册需要选择Motorola帧格式数据位为8 Bit。时钟极性与相位 (CPOL/CPHA)这是SPI通信最关键的时序参数配错了屏幕就没反应。对于GC9A01通常需要设置为CPOL0, CPHA0(即模式0)。如果不行可以尝试模式3 (CPOL1, CPHA1)具体以屏幕资料为准。保存与生成代码按下Ctrl S保存配置。点击CCS的编译按钮。这时可能会弹出一些关于引脚冲突的警告如果确认你的配置无误可以暂时忽略。编译后SysConfig会自动根据你的图形化配置在ti_msp_dl_config.h等文件中生成对应的宏定义和初始化代码。这个头文件通常已经被包含在board.h里了所以我们后续编程只需要#include “board.h”即可。3. 驱动代码移植与修改硬件和底层配置搞定后就到了修改屏幕驱动代码的环节。这是移植的核心需要仔细对照。3.1 导入源码与初步修改导入文件将厂家资料包里的整个LCD文件夹包含lcd.c、lcd.h、lcd_init.c、lcd_init.h、lcdfont.c等复制到你自己的CCS工程目录下。然后在CCS的工程浏览器中右键点击工程将这些.c文件添加到工程并将包含路径添加到编译器设置中。修改头文件引用打开lcd_init.h和lcd.h文件找到#include “sys.h”这一行。因为我们的工程里没有sys.h而是使用TI的标准头文件所以将其改为#include “board.h” // 替换原来的 #include “sys.h”打开lcd_init.c和lcd.c文件找到#include “delay.h”将其注释掉。因为TI的延时函数用法不同我们后续会用系统自带的DL_DelayMS()或其他方式实现延时。// #include “delay.h” // 注释掉这一行3.2 重写引脚控制宏与函数厂家例程里控制RES、DC等引脚的宏定义和函数是基于原有硬件平台的我们需要将其改为TI MSPM0的库函数格式。修改lcd_init.h中的引脚宏定义 找到lcd_init.h中关于引脚定义的代码段根据你在SysConfig中配置的引脚修改如下//-----------------LCD端口定义---------------- // 假设你的引脚配置为RESPB10, DCPB11, CSPB14, BLKPB26 // 你需要根据 SysConfig 生成的 ti_msp_dl_config.h 中的宏定义来填写 LCD_PORT 和 引脚宏 // 例如ti_msp_dl_config.h 中可能定义了GPIO_LCD_RES_PORT (GPIOB), GPIO_LCD_RES_PIN (PIN10) #define LCD_RES_Clr() DL_GPIO_clearPins(GPIO_LCD_RES_PORT, GPIO_LCD_RES_PIN) //RES拉低 #define LCD_RES_Set() DL_GPIO_setPins(GPIO_LCD_RES_PORT, GPIO_LCD_RES_PIN) //RES拉高 #define LCD_DC_Clr() DL_GPIO_clearPins(GPIO_LCD_DC_PORT, GPIO_LCD_DC_PIN) //DC拉低命令 #define LCD_DC_Set() DL_GPIO_setPins(GPIO_LCD_DC_PORT, GPIO_LCD_DC_PIN) //DC拉高数据 #define LCD_CS_Clr() DL_GPIO_clearPins(GPIO_LCD_CS_PORT, GPIO_LCD_CS_PIN) //CS拉低选中 #define LCD_CS_Set() DL_GPIO_setPins(GPIO_LCD_CS_PORT, GPIO_LCD_CS_PIN) //CS拉高取消 #define LCD_BLK_Clr() DL_GPIO_clearPins(GPIO_LCD_BLK_PORT, GPIO_LCD_BLK_PIN) //背光关 #define LCD_BLK_Set() DL_GPIO_setPins(GPIO_LCD_BLK_PORT, GPIO_LCD_BLK_PIN) //背光开关键GPIO_LCD_RES_PORT和GPIO_LCD_RES_PIN这类宏的名字需要你去ti_msp_dl_config.h文件里查找SysConfig具体生成的是什么然后保持一致。简化GPIO初始化函数 由于引脚已经在SysConfig中初始化好了lcd_init.c中的LCD_GPIO_Init(void)函数可以留空或者只放一个延时。void LCD_GPIO_Init(void) { // 引脚已在SysConfig中初始化此处无需额外操作 // 可以加一个简短延时确保电源稳定 DL_DelayMS(10); }3.3 重写SPI数据发送函数这是移植的最关键一步。厂家例程的LCD_Writ_Bus函数用的是模拟SPI或原有库的SPI函数我们必须把它替换成TI MSPM0的SPI驱动库函数。找到lcd_init.c中的LCD_Writ_Bus函数将其整体替换为以下内容/****************************************************************************** 函数说明LCD串行数据写入函数 (适配MSPM0) 入口数据dat 要写入的串行数据 返回值 无 ******************************************************************************/ void LCD_Writ_Bus(uint8_t dat) { uint8_t recv_data 0; // 接收变量SPI全双工通信需要读操作来清空缓冲区 LCD_CS_Clr(); // 拉低片选开始通信 // 使用TI驱动库发送一个字节数据 DL_SPI_transmitData8(SPI_LCD_INST, dat); // 等待SPI发送完成 while(DL_SPI_isBusy(SPI_LCD_INST)); // SPI是全双工的发送的同时也会接收。这里读取数据以清空接收缓冲区。 recv_data DL_SPI_receiveData8(SPI_LCD_INST); // 再次等待操作完成 while(DL_SPI_isBusy(SPI_LCD_INST)); LCD_CS_Set(); // 拉高片选结束本次通信 }注意SPI_LCD_INST这个实例名例如可能是CONFIG_SPI_0同样需要去ti_msp_dl_config.h文件中确认确保与SysConfig中配置的SPI实例名称一致。3.4 修正中文字库显示问题如果你需要显示中文厂家例程的字库索引可能和你的编译器编码不匹配会导致显示乱码。需要进行两处修改修改lcd.c中的字符指针偏移 打开lcd.c找到LCD_ShowChinese函数里面有一行s2;将其改为s3;。这是因为在UTF-8等编码下一个中文字符可能占3个字节。// 在 LCD_ShowChinese 函数内部找到类似循环中的这行 s 3; // 将原来的 s 2; 改为 s 3;修改lcdfont.c中的字库结构体 打开lcdfont.c文件找到字库结构体数组typFNT_GB12、typFNT_GB16、typFNT_GB24、typFNT_GB32的定义。 将每个结构体中的unsigned char Index[2];改为unsigned char Index[3];。// 例如修改 typFNT_GB16 结构体 typedef struct { unsigned char Index[3]; // 将 [2] 改为 [3] unsigned char Msk[32]; } typFNT_GB16;4. 移植验证与上电测试所有代码修改完成后就可以写个简单的测试程序来验证屏幕是否驱动成功了。在你的主文件例如main.c或empty.c中输入以下测试代码#include “ti_msp_dl_config.h” #include “board.h” #include “lcd_init.h” #include “lcd.h” // 如果你有图片数据头文件也需要包含例如 #include “pic.h” int main(void) { SYSCFG_DL_init(); // 初始化系统配置由SysConfig生成 LCD_Init(); // 初始化LCD屏幕 LCD_Fill(0, 0, LCD_W, LCD_H, WHITE); // 清屏为白色 while(1) { // 1. 显示中文 LCD_ShowChinese(30, 40, “中景园电子”, RED, WHITE, 32, 0); // 2. 显示字符串和屏幕直径 LCD_ShowString(32, 80, “LCD_Diameter:”, RED, WHITE, 16, 0); LCD_ShowIntNum(134, 80, LCD_W, 3, RED, WHITE, 16); // LCD_W是屏幕宽度也是直径 // 3. 显示浮点数递增 static float t 0; LCD_ShowString(32, 100, “Increasing Num:”, RED, WHITE, 16, 0); LCD_ShowFloatNum1(160, 100, t, 4, RED, WHITE, 16); t 0.11; // 4. 显示图片如果有图片数据 // for(int j0; j3; j) { // for(int i0; i6; i) { // LCD_ShowPicture(40*i, 120j*40, 40, 40, gImage_1); // } // } // 加一个延时避免刷新太快 DL_DelayMS(500); } }编译工程将程序下载到MSPM0G3507开发板然后上电。如果一切顺利你应该能看到圆形屏幕被点亮并在指定位置显示出红色的“中景园电子”文字和一个不断增加的浮点数。如果屏幕没有显示别着急按以下顺序排查检查硬件连接确保VCC和GND没有接反所有杜邦线接触牢固。检查电源用万用表量一下屏幕VCC引脚电压是否为稳定的3.3V。检查SPI时序重点确认SysConfig中SPI的CPOL和CPHA设置是否正确可以尝试在模式0和模式3之间切换。检查控制引脚电平用逻辑分析仪或示波器看看CS、DC、RES引脚在初始化时是否有正确的电平跳变。检查代码宏定义再次核对lcd_init.h中的端口、引脚宏定义是否与ti_msp_dl_config.h完全一致。驱动移植就是这样大部分工作是在做“翻译”和“适配”。一旦跑通这块漂亮的圆形屏就能在你的MSPM0项目上大放异彩了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2418252.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!