保姆级教程:在NanoPi NEO上点亮128x128的ST7735S SPI屏幕(基于Linux主线内核)
嵌入式Linux实战:NanoPi NEO驱动ST7735S SPI屏幕全流程解析
第一次拿到NanoPi NEO和那块小巧的ST7735S屏幕时,我盯着密密麻麻的40针GPIO排针发了十分钟呆。作为嵌入式Linux新手,SPI设备树配置、内核驱动移植这些概念听起来就像天书。但经过72小时的反复试错,当128x128的像素点终于亮起时,所有困惑都化为了解决问题的成就感。本文将用最直白的语言,带你完整走通从硬件连接到自动加载的全过程。
1. 硬件准备与环境搭建
1.1 硬件清单检查
在开始前,请确保备齐以下硬件:
- NanoPi NEO开发板(全志H3芯片版本)
- ST7735S SPI屏幕(128x128分辨率)
- 5V/2A电源适配器(屏幕背光需要足够电流)
- 杜邦线若干(建议使用不同颜色区分功能)
注意:市场上ST7735S屏幕有多种引脚定义,务必确认你的屏幕引脚排列与下表一致:
| 屏幕引脚 | 功能说明 | NanoPi NEO对应引脚 |
|---|---|---|
| VCC | 电源正极 | 5V(引脚2/4) |
| GND | 电源地 | GND(引脚6/9等) |
| SCL | SPI时钟线 | SPI0_CLK(PC0) |
| SDA | SPI数据线 | SPI0_MOSI(PC1) |
| RES | 复位信号 | PA3 |
| DC | 数据/命令 | PA17 |
| CS | 片选信号 | PG9 |
| BLK | 背光控制 | PA1(可选) |
1.2 开发环境配置
推荐使用Ubuntu 20.04 LTS作为开发主机,需安装以下工具链:
sudo apt update sudo apt install gcc-arm-linux-gnueabihf build-essential flex bison libssl-dev获取主线内核源码(以5.10.y稳定版为例):
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git -b linux-5.10.y cd linux2. 设备树深度配置
2.1 SPI接口与GPIO定义
在arch/arm/boot/dts/sun8i-h3-nanopi.dtsi中添加以下关键配置:
&spi0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins &spi0_cs_pins>; cs-gpios = <&pio 6 9 GPIO_ACTIVE_HIGH>; /* PG9作为片选 */ st7735s: st7735s@0 { compatible = "sitronix,st7735s"; reg = <0>; spi-max-frequency = <32000000>; rotate = <90>; buswidth = <8>; dc-gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>; /* PA17 */ reset-gpios = <&pio 0 3 GPIO_ACTIVE_HIGH>; /* PA3 */ backlight = <&backlight>; }; }; &pio { spi0_cs_pins: spi0_cs_pins { pins = "PG9"; function = "gpio_out"; }; };2.2 关键避坑指南
- HDMI冲突处理:全志H3芯片的HDMI和SPI0存在资源冲突,必须禁用HDMI:
&hdmi { status = "disabled"; }; &sound_hdmi { status = "disabled"; }; - 背光控制优化:添加背光节点实现亮度调节:
backlight: backlight { compatible = "gpio-backlight"; gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>; /* PA1 */ default-on; };
3. 内核驱动移植实战
3.1 驱动编译配置
进入内核配置界面:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sunxi_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig按以下路径启用驱动:
Device Drivers → Staging drivers → Support for small TFT LCD display modules [M] FB driver for the ST7735S LCD controller [M] Support for SPI-connected displays3.2 分辨率参数调整
修改drivers/staging/fbtft/fb_st7735s.c中的显示参数:
static const struct fbtft_display display = { .width = 128, .height = 128, .regwidth = 8, .init_sequence = st7735s_init_sequence, };4. 系统集成与自动化
4.1 手动加载测试
编译并安装驱动模块后,执行:
sudo insmod fbtft_device.ko name=matrix-st7735s busnum=0 gpios=reset:3,dc:17 rotate=90 sudo insmod fb_st7735s.ko验证帧缓冲设备:
ls /dev/fb0 # 应返回设备节点 con2fbmap 1 /dev/fb0 # 将控制台输出到屏幕4.2 开机自动加载方案
创建/etc/modules-load.d/fbtft.conf:
fb_st7735s fbtft_device添加模块参数配置/etc/modprobe.d/fbtft.conf:
options fbtft_device name=matrix-st7735s busnum=0 gpios=reset:3,dc:17 rotate=90最后更新initramfs:
sudo update-initramfs -u5. 高级调试技巧
当屏幕出现花屏、偏移等问题时,按以下步骤排查:
- 检查电源质量:
dmesg | grep -i under-voltage # 查看是否电源不足 - SPI信号质量:
- 用示波器检查SCLK频率是否≤32MHz
- 缩短杜邦线长度(建议<10cm)
- 色彩异常处理: 在设备树中添加RGB顺序参数:
st7735s: st7735s@0 { rgb; bgr; };
我在实际项目中遇到过屏幕上半部显示错位的问题,最终发现是rotate参数与屏幕物理安装方向不匹配。通过调整设备树中的rotate值为0/90/180/270分别测试,可以快速定位问题。
