1. 基于TI MSPM0G3507的1.28寸GC9A01圆屏SPI驱动移植实战

news2026/3/17 4:35:58
基于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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…