csr usb spi怎么用_树莓派4 rtthread实现SPI屏人机交互界面

树莓派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接口。

b328f4064cdf9721e945b9f6fda0fdad.png

另外,树莓派4上带有MIPI的显示器DSI排线接口,可以通过排线进行连接。

d216764c91706504a7cebd4c1e52339c.png

这两种显示接口的驱动实现,都已经在树莓派的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

下图是基本的展示:

3832d7bf7ec76efc253711a4872d18b3.png

96d3c0fb0bd22a1374730dc708d0defe.png

该屏是利用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总线。

7daf2b4f9bacf0e988800867535b45ac.png

这个很基本,也就是CE片选决定是那个设备,主机通过传输SCLK时钟信号,然后传输MOSI,从机响应数据,MISO。这是标准的SPI协议,可以好好复习一下。

另外一种则是LOSSI模式。

97e8b460bf9a9d2b15ef40ff9b613a4b.png

也就是低速串行总线。片选外设后,主机可以通过SCL发送时钟,然后通过SDA发送数据,从机接受到数据后,也会通过SDA数据线传输到主机。只有一条线传输数据。

区分的方法就是在发送数据位时比如发送8位数据位,则会在前面增加一位表示读写。这种适合于低速外设总线的使用。这一种模式目前暂时没有使用到,后面使用的时候再进行分析。

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

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

标准的SPI屏接上后,触摸和LCD都是用的同样的SPI线。

808ce5553e794f91110c3d3205add342.png

通过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来生成一张图像,进行刷屏测试。

78ec006ac357eed269e72f0f64b1394e.png

最后的结果如下所示:

2542a3250654530fc553d05442337ec1.png

由于操作系统的tick为10ms,所以测试得到差不多40到50ms,所以帧率在20~25帧左右。这是目前实测的数据。虽然速率不是特别高,但是还是可以接受的。

5.调试总结

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

c0690b30b76a5f98d9d764a11f3f1495.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值