您好,登录后才能下订单哦!
这篇文章主要介绍了树莓派4 rt-thread如何实现SPI屏人机交互界面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
树莓派4的rt-thread一直在不断的更新,充分挖掘可以树莓派底层硬件的特性,同时借助各种外设,使得树莓派4成为一个更加适合学习嵌入式开发,验证各种外设功能,学习操作系统的好用的平台。
在树莓派4上进行各种外设的开发,需要一定的嵌入式调试经验与驱动调试方法,因为树莓派虽然资料很多,但是关键核心的芯片资料却非常的少,都是进行应用层面的开发工作。为了更加深刻的学习嵌入式,了解方法是不够的,而是要弄清楚原理才行。本文主要是介绍树莓派4图像,触摸相关的使用方式,从而实现GUI的移植和界面交互。
树莓派4默认是不带任何屏接口的显示的,可以接上HDMI接口。
另外,树莓派4上带有MIPI的显示器DSI排线接口,可以通过排线进行连接。
这两种显示接口的驱动实现,都已经在树莓派的videocore中实现了,具体的实现细节需要查看相关的GPU的使用。作为学习嵌入式图像这一块,已经无法从树莓派上进行任何的底层相关的开发了。想调用图像的读写操作,可以通过CPU与GPU的通信管道作为数据的传输通道,具体可以查看mbox的驱动实现细节:
https://github.com/RT-Thread/rt-thread/blob/master/bsp/raspberry-pi/raspi4-32/driver/mbox.c
将图像放到一段内存空间,然后发消息给GPU,让其去该地址取数据,最后就可以在屏幕上看到显示的画面了。
这一种只有显示,如果要实现触摸,还需进行另外的接口实现。一种是DSI可以将触摸的坐标传递给GPU,通过mbox取获取坐标数据,另外一种接HDMI屏的常见做法就是将触摸另外接到USB上,通过USB获取坐标点。这是常见的实现手段。
除此之外,微雪则出了MHS-3.5inch RPi Display
的3.5寸的SPI屏。
http://www.lcdwiki.com/MHS-3.5inch_RPi_Display
下图是基本的展示:
该屏是利用SPI总线所驱动,最大spi速率支持125Mhz。支持电阻屏触摸。而且价格也很便宜。是本文研究的重点。
要想将该屏驱动起来,首先必须了解的是SPI协议,以及bcm2711芯片的spi控制器的使用。所有深度的研读了rpi_DATA_2711_1p0.pdf
文档。
https://gitee.com/bigmagic/raspi_sd_fw/tree/master/doc/raspi4
重点是说,树莓派4的SPI是支持两种模式的,一种是标准的SPI总线。
这个很基本,也就是CE片选决定是那个设备,主机通过传输SCLK时钟信号,然后传输MOSI,从机响应数据,MISO。这是标准的SPI协议,可以好好复习一下。
另外一种则是LOSSI模式。
也就是低速串行总线。片选外设后,主机可以通过SCL发送时钟,然后通过SDA发送数据,从机接受到数据后,也会通过SDA数据线传输到主机。只有一条线传输数据。
区分的方法就是在发送数据位时比如发送8位数据位,则会在前面增加一位表示读写。这种适合于低速外设总线的使用。这一种模式目前暂时没有使用到,后面使用的时候再进行分析。
具体细节我就不过多的展开,反正调试就占用了两天时间,下面主要讲一讲调试的心得和步骤。
标准的SPI屏接上后,触摸和LCD都是用的同样的SPI线。
通过CS引脚进行选择,正好对应上树莓派SPI0的两个片选。我刚开始调试的是LCD,由于LCD的主控是ILI9486
,看来一下芯片手册,准备按照以往的调试经验,先读出出厂ID试试。怎么都不读到数据,尝试了好久,结果仔细看上图,发现SO引脚上标注的是Touch panel SPI data output
。原来是不能输出数据的呀。于是转换方向,先调试触摸,因为触摸标准一些。
刚开始的时候,触摸读不到数据,因为SPI驱动写的不好,而且测试也不严格,对SPI的协议理解不深刻,后来干脆采用逻辑分析仪跟踪数据。才发现速率太高了,原来这个触摸支持的spi的频率是很低的,只有几百K。我终于看到数据读出来变化了。
由于是电阻屏,所以读到的是12位的数据,读到2个字节,然后计算偏移得到12位的数据,总体变化范围是0到2048之间。按照这个规律,不断的在屏的上下左右角度测试坐标,终于测试得到了以下结论。
XPT2046:Width:320 High:480
no pressed:(0x800,0xfff)
---ETH----USB-----------------------
| (0x800,0x800) (0xfff,0x800) |
| |
| (0x800,0xFFF) (0xfff,0xfff) |
------------------------------------
不进行触摸得到的数据(0x800,0xfff)
,各个角度的值可以看上面的信息。
计算坐标,由于电阻屏,每个点的坐标均匀分布,有着二次方程的线性关系。很容易就通过取到的数据算出坐标点了。调试这个花费了一天时间。终于可以开始调试LCD了。
由于两个片选不一样,而且只能写不能读,这样调试起来需要非常的精确。首先LCD复位,也就是22号引脚先高电平再低电平再高电平。此时完成复位动作。
接着,注意命令和数据是一个GPIO的高低电平进行控制的。这个细节要注意。接着就是开始传输配置的参数了,参数主要参考类似的lcd的实现。参数传递完成,屏的面板显示又白色变成黑色,这个是证明参数写进去的关键。为了这个细节的实现,调试了许久。然后写数据到lcd中。
刚开始的时候,刷屏的速度肉眼可见,每个坐标点在变化,这肯定不能接受,然后算了一下SPI的频率还不到1MHZ。这肯定不行,于是配置树莓派SPI,将时钟提升到125Mhz。速度虽然有了提升,但是还是不够,差不多1s才能刷新全屏。最后直接跳过rt-thread的spi框架,直接操作底层进行SPI写数据。发现真的快了许多。
用数据来说话,用Image2LCD来生成一张图像,进行刷屏测试。
最后的结果如下所示:
由于操作系统的tick为10ms,所以测试得到差不多40到50ms,所以帧率在20~25帧左右。这是目前实测的数据。虽然速率不是特别高,但是还是可以接受的。
感谢你能够认真阅读完这篇文章,希望小编分享的“树莓派4 rt-thread如何实现SPI屏人机交互界面”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。