第31讲:实战——SPI屏驱动快速试错、点亮屏幕

发布时间:2026/7/23 19:00:55

第31讲:实战——SPI屏驱动快速试错、点亮屏幕
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第31讲实战——SPI屏驱动快速试错、点亮屏幕一、SPI屏幕驱动基础SPI屏幕是嵌入式常见的显示设备驱动屏幕需要正确配置SPI、理解屏幕控制命令、实现绘图功能。1.1 常见SPI屏幕小尺寸屏幕0.96寸 OLEDSSD1306128x641.3寸 OLEDSH1106128x641.8寸 TFTST7735128x1602.4寸 TFTILI9341240x320SPI接口SCK时钟MOSI主出从入数据MISO主入从出可选CS片选DC数据/命令选择RST复位1.2 驱动要点SPI配置模式主机模式时钟极性/相位根据屏幕芯片确定速率通常10-40MHz数据位8位控制命令初始化序列配置屏幕参数写命令发送控制命令写数据发送显示数据刷新更新显示二、OLED屏幕驱动SSD13062.1 快速试错流程第一步AI生成初始驱动Prompt生成STM32F103 SSD1306 OLED驱动 - SPI1PA5(SCK)、PA7(MOSI) - CSPA4 - DCPA6 - RSTPB0 - 屏幕0.96寸128x64 - 使用HAL库AI生成#includestm32f1xx_hal.h#defineSSD1306_WIDTH128#defineSSD1306_HEIGHT64SPI_HandleTypeDef hspi1;voidSSD1306_Init(void);voidSSD1306_WriteCommand(uint8_tcmd);voidSSD1306_WriteData(uint8_t*data,uint16_tlen);voidSSD1306_Fill(uint8_tcolor);voidSSD1306_Update(void);// CS控制#defineSSD1306_CS_LOW()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)#defineSSD1306_CS_HIGH()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)// DC控制#defineSSD1306_DC_LOW()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)// 命令#defineSSD1306_DC_HIGH()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET)// 数据// RST控制#defineSSD1306_RST_LOW()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)#defineSSD1306_RST_HIGH()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)voidSPI1_Init(void){hspi1.InstanceSPI1;hspi1.Init.ModeSPI_MODE_MASTER;hspi1.Init.DirectionSPI_DIRECTION_2LINES;hspi1.Init.DataSizeSPI_DATASIZE_8BIT;hspi1.Init.CLKPolaritySPI_POLARITY_LOW;hspi1.Init.CLKPhaseSPI_PHASE_1EDGE;hspi1.Init.NSSSPI_NSS_SOFT;hspi1.Init.BaudRatePrescalerSPI_BAUDRATEPRESCALER_4;hspi1.Init.FirstBitSPI_FIRSTBIT_MSB;HAL_SPI_Init(hspi1);}voidSSD1306_WriteCommand(uint8_tcmd){SSD1306_CS_LOW();SSD1306_DC_LOW();// 命令模式HAL_SPI_Transmit(hspi1,cmd,1,100);SSD1306_CS_HIGH();}voidSSD1306_WriteData(uint8_t*data,uint16_tlen){SSD1306_CS_LOW();SSD1306_DC_HIGH();// 数据模式HAL_SPI_Transmit(hspi1,data,len,100);SSD1306_CS_HIGH();}voidSSD1306_Init(void){// 复位SSD1306_RST_LOW();HAL_Delay(10);SSD1306_RST_HIGH();HAL_Delay(10);// 初始化序列SSD1306_WriteCommand(0xAE);// 关闭显示SSD1306_WriteCommand(0xD5);// 设置时钟分频SSD1306_WriteCommand(0x80);SSD1306_WriteCommand(0xA8);// 设置多路复用率SSD1306_WriteCommand(0x3F);SSD1306_WriteCommand(0xD3);// 设置显示偏移SSD1306_WriteCommand(0x00);SSD1306_WriteCommand(0x40);// 设置起始行SSD1306_WriteCommand(0x8D);// 电荷泵设置SSD1306_WriteCommand(0x14);SSD1306_WriteCommand(0x20);// 内存地址模式SSD1306_WriteCommand(0x00);// 水平寻址模式SSD1306_WriteCommand(0xA1);// 段重映射SSD1306_WriteCommand(0xC8);// COM输出扫描方向SSD1306_WriteCommand(0xDA);// COM引脚配置SSD1306_WriteCommand(0x12);SSD1306_WriteCommand(0x81);// 对比度控制SSD1306_WriteCommand(0xCF);SSD1306_WriteCommand(0xD9);// 预充电周期SSD1306_WriteCommand(0xF1);SSD1306_WriteCommand(0xDB);// VCOMH电压SSD1306_WriteCommand(0x40);SSD1306_WriteCommand(0xA4);// 全屏点亮关闭SSD1306_WriteCommand(0xA6);// 正常显示SSD1306_WriteCommand(0xAF);// 开启显示}staticuint8_tSSD1306_Buffer[SSD1306_WIDTH*SSD1306_HEIGHT/8];voidSSD1306_Fill(uint8_tcolor){memset(SSD1306_Buffer,color?0xFF:0x00,sizeof(SSD1306_Buffer));}voidSSD1306_Update(void){for(uint8_tpage0;page8;page){SSD1306_WriteCommand(0xB0page);SSD1306_WriteCommand(0x00);SSD1306_WriteCommand(0x10);SSD1306_WriteData(SSD1306_Buffer[page*SSD1306_WIDTH],SSD1306_WIDTH);}}第二步测试验证intmain(void){HAL_Init();SystemClock_Config();SPI1_Init();SSD1306_Init();// 清屏SSD1306_Fill(0);SSD1306_Update();// 全白SSD1306_Fill(1);SSD1306_Update();while(1);}第三步迭代修正如果屏幕不亮添加调试voidSSD1306_Debug(void){printf(SSD1306 Debug:\r\n);printf(SPI CR1: 0x%04X\r\n,SPI1-CR1);printf(GPIOA CRL: 0x%08X\r\n,GPIOA-CRL);printf(GPIOB CRL: 0x%08X\r\n,GPIOB-CRL);}三、TFT屏幕驱动ST77353.1 ST7735驱动Prompt生成STM32F103 ST7735 TFT驱动 - SPI1PA5(SCK)、PA7(MOSI) - CSPA4 - DCPA6 - RSTPB0 - 屏幕1.8寸128x160 - 使用HAL库AI生成核心代码#defineST7735_WIDTH128#defineST7735_HEIGHT160voidST7735_WriteCommand(uint8_tcmd){ST7735_CS_LOW();ST7735_DC_LOW();HAL_SPI_Transmit(hspi1,cmd,1,100);ST7735_CS_HIGH();}voidST7735_WriteData(uint8_tdata){ST7735_CS_LOW();ST7735_DC_HIGH();HAL_SPI_Transmit(hspi1,data,1,100);ST7735_CS_HIGH();}voidST7735_SetWindow(uint8_tx0,uint8_ty0,uint8_tx1,uint8_ty1){ST7735_WriteCommand(0x2A);// 列地址设置ST7735_WriteData(0x00);ST7735_WriteData(x0);ST7735_WriteData(0x00);ST7735_WriteData(x1);ST7735_WriteCommand(0x2B);// 行地址设置ST7735_WriteData(0x00);ST7735_WriteData(y0);ST7735_WriteData(0x00);ST7735_WriteData(y1);ST7735_WriteCommand(0x2C);// 写内存}voidST7735_DrawPixel(uint8_tx,uint8_ty,uint16_tcolor){ST7735_SetWindow(x,y,x,y);uint8_tdata[2];data[0]color8;data[1]color0xFF;ST7735_CS_LOW();ST7735_DC_HIGH();HAL_SPI_Transmit(hspi1,data,2,100);ST7735_CS_HIGH();}voidST7735_FillColor(uint16_tcolor){ST7735_SetWindow(0,0,ST7735_WIDTH-1,ST7735_HEIGHT-1);uint8_tdata[2];data[0]color8;data[1]color0xFF;ST7735_CS_LOW();ST7735_DC_HIGH();for(uint16_ti0;iST7735_WIDTH*ST7735_HEIGHT;i){HAL_SPI_Transmit(hspi1,data,2,100);}ST7735_CS_HIGH();}四、绘图功能实现4.1 基础绘图函数画线voidSSD1306_DrawLine(uint8_tx0,uint8_ty0,uint8_tx1,uint8_ty1){int16_tdxabs(x1-x0);int16_tdyabs(y1-y0);int16_tsx(x0x1)?1:-1;int16_tsy(y0y1)?1:-1;int16_terrdx-dy;while(1){SSD1306_DrawPixel(x0,y0,1);if(x0x1y0y1)break;int16_te22*err;if(e2-dy){err-dy;x0sx;}if(e2dx){errdx;y0sy;}}}画矩形voidSSD1306_DrawRect(uint8_tx,uint8_ty,uint8_tw,uint8_th){SSD1306_DrawLine(x,y,xw-1,y);SSD1306_DrawLine(x,yh-1,xw-1,yh-1);SSD1306_DrawLine(x,y,x,yh-1);SSD1306_DrawLine(xw-1,y,xw-1,yh-1);}画圆voidSSD1306_DrawCircle(uint8_tx0,uint8_ty0,uint8_tr){int16_tf1-r;int16_tddF_x1;int16_tddF_y-2*r;int16_tx0;int16_tyr;SSD1306_DrawPixel(x0,y0r,1);SSD1306_DrawPixel(x0,y0-r,1);SSD1306_DrawPixel(x0r,y0,1);SSD1306_DrawPixel(x0-r,y0,1);while(xy){if(f0){y--;ddF_y2;fddF_y;}x;ddF_x2;fddF_x;SSD1306_DrawPixel(x0x,y0y,1);SSD1306_DrawPixel(x0-x,y0y,1);SSD1306_DrawPixel(x0x,y0-y,1);SSD1306_DrawPixel(x0-x,y0-y,1);SSD1306_DrawPixel(x0y,y0x,1);SSD1306_DrawPixel(x0-y,y0x,1);SSD1306_DrawPixel(x0y,y0-x,1);SSD1306_DrawPixel(x0-y,y0-x,1);}}4.2 显示文字ASCII字符显示// 5x7字体constuint8_tfont5x7[]{0x00,0x00,0x00,0x00,0x00,// 空格0x00,0x00,0x5F,0x00,0x00,// !// ... 字体数据};voidSSD1306_DrawChar(uint8_tx,uint8_ty,charc){for(uint8_ti0;i5;i){uint8_tlinefont5x7[(c-32)*5i];for(uint8_tj0;j7;j){if(line(1j)){SSD1306_DrawPixel(xi,yj,1);}}}}voidSSD1306_DrawString(uint8_tx,uint8_ty,char*str){while(*str){SSD1306_DrawChar(x,y,*str);x6;str;}}五、常见问题与解决5.1 屏幕不亮原因1. SPI配置错误 2. 初始化序列错误 3. 引脚配置错误 4. 复位时序错误解决// 验证SPI配置voidSPI_Debug(void){printf(SPI Configuration:\r\n);printf(Mode: %d\r\n,hspi1.Init.Mode);printf(BaudRate: %d\r\n,hspi1.Init.BaudRatePrescaler);printf(CLKPolarity: %d\r\n,hspi1.Init.CLKPolarity);printf(CLKPhase: %d\r\n,hspi1.Init.CLKPhase);}5.2 显示异常原因1. 内存地址模式错误 2. 扫描方向错误 3. 颜色格式错误解决// 调整内存地址模式SSD1306_WriteCommand(0x20);// 内存地址模式SSD1306_WriteCommand(0x00);// 水平寻址模式// 调整扫描方向SSD1306_WriteCommand(0xA1);// 段重映射SSD1306_WriteCommand(0xC8);// COM输出扫描方向六、本讲核心要点6.1 记住这三句话SPI屏幕驱动正确配置SPI、理解控制命令、实现绘图功能快速试错AI生成初始驱动→测试验证→迭代修正常见问题SPI配置、初始化序列、引脚配置、复位时序6.2 实践建议对于新手学习SPI配置理解屏幕控制命令实践绘图功能对于有经验工程师建立屏幕驱动模板库优化绘图性能实现高级功能6.3 下讲预告第32讲将深入讲解实战I2C传感器极简驱动快速验证I2C传感器驱动如何快速验证下一讲将以具体传感器为例详细讲解。

相关新闻

严格路由 vs 松散路由

严格路由 vs 松散路由

2026/7/23 18:50:54

Kamailio 里的“严格路由”和“松散路由”本质上是 SIP Route/Record-Route 机制的两种模式,分别来自较老的 RFC 2543 和较新的 RFC 3261。现在实际生产中几乎都使用松散路由。1. 核心区别对比项严格路由 Strict Routing松散路由 Loose Routing标准来源旧 RFC 2543R…

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

2026/7/23 18:50:54

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南 2025年2月,OpenAI联合创始人Andrej Karpathy首次提出"Vibe Coding"(氛围编程)概念,同年入选柯林斯词典年度热词。然而仅仅一年后,20…

深入解析TI N2HET核心指令:MOV64、PCNT、PWCNT与协同指令实战

深入解析TI N2HET核心指令:MOV64、PCNT、PWCNT与协同指令实战

2026/7/23 18:50:54

1. 项目概述与N2HET模块定位 在嵌入式实时控制系统的开发中,精准的时序控制能力往往是决定系统性能上限的关键。无论是电机驱动中精确的换相时序,还是电源管理里严苛的死区时间,亦或是通信协议中毫秒乃至微秒级的同步信号,其背后都…

汽车充电插口识别数据集,可识别快充,慢充插口,支持yolo,coco json,pascal voc xml格式的标注数据集

汽车充电插口识别数据集,可识别快充,慢充插口,支持yolo,coco json,pascal voc xml格式的标注数据集

2026/7/23 19:50:56

汽车充电插口识别数据集 本数据集专门用于训练和评估汽车充电插口识别模型,包含快充(Fast Charging)和慢充(Slow Charging)两种插口类型。数据集支持多种主流目标检测框架,包括 YOLO 系列(v5、…

软路由集成ADGuard家庭防护实战部署

软路由集成ADGuard家庭防护实战部署

2026/7/23 19:50:56

用软路由打造家庭网络“免疫系统”:ADGuard实战部署全记录 最近家里智能设备越来越多,电视弹广告、平板自动下载推广App、孩子刷视频莫名其妙跳转到不良网站……这些烦心事让我下定决心:不能再靠普通路由器糊弄了。必须上点硬货。 于是我把一台闲置的Intel NUC拿出来刷成软…

医疗设备防漏费管理系统 医院医疗设备漏费管理系统2026版

医疗设备防漏费管理系统 医院医疗设备漏费管理系统2026版

2026/7/23 19:50:56

从“一刀切”到“千人千面”:控费逻辑的根本颠覆传统医疗设备控费系统如同一位严厉的会计,只会说“不”——设定使用限额、限制开机时长、设置审批关卡。这种粗放管理模式常陷入两难:控费严格了,可能影响临床效果;放松…

软路由怎么搭建:千兆内网优化硬件搭配建议

软路由怎么搭建:千兆内网优化硬件搭配建议

2026/7/23 19:50:56

软路由怎么搭建?千兆内网下的硬件选型实战指南 你是不是也遇到过这种情况:家里设备一多,Wi-Fi就卡顿;看个4K视频老是转圈;孩子上网课突然掉线……传统路由器明明标着“千兆”,实际体验却像百兆。问题出在哪? 答案可能是——你的网络大脑该升级了。 在今天的家庭和小型…

二分查找(基础)

二分查找(基础)

2026/7/23 19:50:56

思路&#xff1a;准备一组有序的数组设置target设置i0 &#xff0c;j 数组.length - 1;循环&#xff08;i<j&#xff09;设置中间值m (m (ij)/2 ,向下取整)&#xff0c;做if&#xff08;a[m] > target&#xff09;-> j m-1 else if (a[m] < target) ->…

Python计算机毕设之基于 Python 的期货行情展示与模拟交易系统 零基础期货实训虚拟交易平台设计(完整前后端代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的期货行情展示与模拟交易系统 零基础期货实训虚拟交易平台设计(完整前后端代码+说明文档+LW,调试定制等)

2026/7/23 19:40:56

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵&#xff08;连锁便利店/商超标准配置&#xff09; 自助收银Kiosk一体机&#xff1a;顾客结算、自助核销优惠券、商品素材预览&#xff1b;运营折叠平板&#xff1a;店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似&#xff0c;可以采用类似判断方法------------其实他比小红书好判断&#xff0c;因为他没有图片&#xff0c;控件位置几乎是固定的&#xff0c;都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的&#xff0c;所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;企业级AI搜索落地选型实战手册&#xff08;含LLMRAGHybrid架构对比矩阵与ROI测算模板&#xff09; 企业级AI搜索系统落地成败&#xff0c;核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发&#xff0c;尤其是基于ARM Cortex-M内核的微控制器项目中&#xff0c;深入理解并熟练配置芯片的片上外设&#xff0c;是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文&#xff0c;近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…