前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树莓派4 rt-thread实现SPI屏人机交互界面

树莓派4 rt-thread实现SPI屏人机交互界面

作者头像
bigmagic
发布2020-11-17 10:53:25
1.7K0
发布2020-11-17 10:53:25
举报
文章被收录于专栏:嵌入式iot嵌入式iot嵌入式iot

树莓派4 rt-thread实现SPI屏人机交互界面

  • 1.前言
  • 2.树莓派4显示接口介绍
  • 3.树莓派4 SPI接口
  • 4.树莓派4 上的SPI屏的实现
  • 5.调试总结

1.前言

树莓派4的rt-thread一直在不断的更新,充分挖掘可以树莓派底层硬件的特性,同时借助各种外设,使得树莓派4成为一个更加适合学习嵌入式开发,验证各种外设功能,学习操作系统的好用的平台。

在树莓派4上进行各种外设的开发,需要一定的嵌入式调试经验与驱动调试方法,因为树莓派虽然资料很多,但是关键核心的芯片资料却非常的少,都是进行应用层面的开发工作。为了更加深刻的学习嵌入式,了解方法是不够的,而是要弄清楚原理才行。本文主要是介绍树莓派4图像,触摸相关的使用方式,从而实现GUI的移植和界面交互。

2.树莓派4显示接口介绍

树莓派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。支持电阻屏触摸。而且价格也很便宜。是本文研究的重点。

3.树莓派4 SPI接口

要想将该屏驱动起来,首先必须了解的是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位数据位,则会在前面增加一位表示读写。这种适合于低速外设总线的使用。这一种模式目前暂时没有使用到,后面使用的时候再进行分析。

4.树莓派4 上的SPI屏的实现

具体细节我就不过多的展开,反正调试就占用了两天时间,下面主要讲一讲调试的心得和步骤。

标准的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帧左右。这是目前实测的数据。虽然速率不是特别高,但是还是可以接受的。

5.调试总结

两个驱动的调试还是花了不少时间的,一则是因为示例的demo太少,对于该屏的使用,都是在Linux上完成的,然后就是树莓派的底层SPI驱动的理解不够深刻。现在触摸和屏已经正常的启动了。

过程虽然曲折,但是收获也很多,比如SPI LCD的速率如何提高,低频的spi触摸与高频的LCD如果做切换,另外就是屏的刷屏方向,LCD的各种参数的配置等等。虽然以前也做过类似的,由于当时直接可以使用,就简单的了解了一下,真正去驱动一个屏,并且使用的很好,确实需要付出一点实践的精力。

嵌入式本身就是一项不断动手去实践的本领,切记不要眼高手低,有想法都需要将其付诸于实践,看起来很简单的东西,可能真正自己做起来的时候就是一团乱麻。唯有动手,才能学到更多经验。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 树莓派4 rt-thread实现SPI屏人机交互界面
    • 1.前言
      • 2.树莓派4显示接口介绍
        • 3.树莓派4 SPI接口
          • 4.树莓派4 上的SPI屏的实现
            • 5.调试总结
            相关产品与服务
            腾讯云小微
            腾讯云小微,是一套腾讯云的智能服务系统,也是一个智能服务开放平台,接入小微的硬件可以快速具备听觉和视觉感知能力,帮助智能硬件厂商实现语音人机互动和音视频服务能力。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档