树莓派研究笔记(9)-- 树莓派SPI连接TFT屏幕 - 程晨

时间:2024-02-17 07:05:15

树莓派研究笔记(9)-- 树莓派SPI连接TFT屏幕

HDMI连接和树莓派专用连接的接口的屏幕都太贵了,为了节约成本,现在国内大多数还是TFT屏幕。 树莓派可以激活SPI接口,通过代码驱动TFT屏幕的显示。这样利用树莓派zero 打造小型的游戏平台可以大大节约成本。淘宝网上的TFT屏幕很便宜,但是一定要记得别买错了,一定要看说明需要支持SPI接口的才行。各种屏幕的驱动也不一样,国内多半是fb_ili9431的驱动。购买之前先看仔细各种参数。https://github.com/notro/fbtft/wiki/fbtft_device https://github.com/notro/fbtft/wiki/LCD-Modules FBTFT驱动支持列表

比如这种:

1.按照如下图的连接线连接。

2. 先激活树莓派配置

sudo raspi-config

找到Interfacing Options

然后找到P4 SPI然后 enable SPI interface

3. 更新后重启,一定要看到更新成功,如果出现文件错误,可以尝试参考我前面的文章更换镜像地址后重新尝试。

sudo rpi-update
sudo reboot

4.执行以下命令就可以发现TFT屏幕可以显示了:

执行命令 sudo modprobe fbtft_device name=rpi-display gpios=reset:25,dc:24,led:18 rotate=90 fps=50 speed=65000000

或者执行  sudo modprobe fbtft_device custom name=fb_ili9431 buswidth=8 gpios=reset:25,dc:24,led:18 rotate=90 fps=50 speed=65000000

参考文献:https://www.raspberrypi.org/forums/viewtopic.php?t=157618

执行完毕后,可以查看日志,日志不能有错误:
dmesg

$ dmesg
...
...
[  703.864352] fbtft_device: module is from the staging directory, the quality is unknown, you have been warned.
[  703.870840] spidev spi0.1: spidev spi0.1 500kHz 8 bits mode=0x00
[  703.870917] bcm2708_fb soc:fb: soc:fb id=-1 pdata? no
[  704.184479] graphics fb1: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB DMA buffer memory, fps=20, spi0.0 at 32 MHz
[  704.184566] fbtft_device: GPIOS used by \'rpi-display\':
[  704.184581] fbtft_device: \'reset\' = GPIO25
[  704.184591] fbtft_device: \'dc\' = GPIO24
[  704.184599] fbtft_device: \'led\' = GPIO18
[  704.184618] spidev spi0.1: spidev spi0.1 500kHz 8 bits mode=0x00
[  704.184633] fb_ili9341 spi0.0: fb_ili9341 spi0.0 32000kHz 8 bits mode=0x00

 通过检查背景灯光是否亮了,如果亮了,说明就成功了。

5. 不知道什么原因,执行强制使用以下命令的时候总是报Policykit Authentication Agent的错误,即使在windows session中关闭也不行。

FRAMEBUFFER=/dev/fb1 startx

经过长时间的研究发现可以直接修改下面这个文件。 然后再sudo raspi-config 设置boot options 启动选项为Console 项目,不启动桌面。重启后,使用startx命令就可以看到tft屏幕显示了。

Create file: /usr/share/X11/xorg.conf.d/99-fbdev.conf

Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"
EndSection

6. 调试命令/工具

sudo modprobe fbtft_device -r 删除设备

查看设备 ls /dev/fb* -l

好用的工具:wiringPi
可查看当前所有GPIO的电压以及使用情况。

git clone git://git.drogon.net/wiringPi
cd wiringPi
sudo ./build

gpio readall

7. Orange Pi  相关

好用的工具:wiringOP

一定要注意,使用orange pi有一个大坑,网上找到的图和实际的GPIO不符合。一定要使用wiringOP这个工具查看当前的端口。这个问题导致我卡了N天,花费了N个小时。

BCM列就是gpio 端口号。而wPi是指实际的标准端口,如果用wiringop的时候需要操作wPi的标准端口号。而在一般使用情况下则使用BCM端口号。

比如,在orangepi 下,我们可以执行命令 

sudo modprobe fbtft_device custom name=fb_ili9431 buswidth=8 gpios=reset:8,dc:9,led:7 rotate=90 speed=48000000 busnum=0 fps=50 (如果是orangepi zero的 spi0 会被占用。不成功就尝试修改busnum等于1)

然而,大部分系统会提示 cannot find fbtft_device module,或者fbtft_device 参数错误之类。因为大部分orangepi的系统都没有自带fbtft_device module啊。或者是应为SPI service 没有开通啊。全都是坑。最终我找到一个可以直接执行上述命令的操作系统:

Armbian
例如:orangelite版本: (不能保证未来的新版本会去掉驱动,本文写于2018-02-18,可以下载这个时间点附近的release的版本)
https://www.armbian.com/orange-pi-lite/ 

Armbian Ubuntu desktop – legacy kernel

屏幕转移功能依然不好使,可以参考下面文献设置为自启动
con2fbmap 1 8(Armbian安装好后,发现新增的驱动为fb8,所以这里是8的映射)

参考文献
https://www.mysensors.org/build/orange
http://www.instructables.com/id/Orange-Pi-Zero-Connect-TFT-SPI-ST7735/
https://kaspars.net/blog/linux/spi-display-orange-pi-zero