前言

最近研究了一下3线spi屏幕的驱动方式。屏幕的驱动芯片为ILI9488,相比于4线,3线spi屏幕没有用到DC写命令/写数据控制线。DC=0表示写命令,DC=1表示写数据。

3线spi数据格式


3线spi就是将DC命令放到了每个8位数据的最高位。这么说还是有些枯燥,看下具体的例子。
假如采用spi发送0x55,一般采用的MSB,高位在前的方式。
那么SDA(MOSI)数据线上是这样的:

01010101

如果要假如dc命令,则0x55要分为两个字节进行发送,假设DC=1,则SDA(MOSI)数据如下:

10101010 1
低字节 高字节

相当于要将0x55转换为:0x80AA。同时要在单片机中设置spi数据为9位。经过多次摸索,其转换公式为:

uint16_t data = (0x8000&(cmd<<15))|(0x7f&(cmd>>1)) ;

具体在esp32中需要将发送函数改为如下:

static void lcd_cmd(spi_device_handle_t spi, const uint8_t cmd)
{esp_err_t ret;spi_transaction_t t;uint16_t data=0;data = (0x8000&(cmd<<15))|(0x7f&(cmd>>1)) ;memset(&t, 0, sizeof(t));       //Zero out the transactiont.length=9;                     //Command is 8 bitst.tx_buffer=&data;               //The data is the cmd itselfret=spi_device_polling_transmit(spi, &t);  //Transmit!assert(ret==ESP_OK);            //Should have had no issues.
}static void lcd_data_byte(spi_device_handle_t spi, const uint8_t cmd)
{esp_err_t ret;spi_transaction_t t;uint16_t data=0;data = (0x8000&(cmd<<15))|(0x80|cmd>>1) ;memset(&t, 0, sizeof(t));       //Zero out the transactiont.length=8;                     //Command is 8 bitst.tx_buffer=&data;               //The data is the cmd itselfret=spi_device_polling_transmit(spi, &t);  //Transmit!assert(ret==ESP_OK);            //Should have had no issues.
}

只有改成为这样才能正常与屏幕通信。这个造成了通信速度降低,难以采用dma传输大量的数据。原因就是每个字节都要先进行拆解拼凑成2个字节再发送。及其不方便,当时调这个花了不少时间。

个人觉得3线spi通信方式及其扯淡,效率极低,还是老老实实用4线spi或者单片机8080接口来驱动屏幕。有的屏幕中DC引脚使用RS来表示的,笔者也是一开始没搞明白,发现这个屏幕没有DC引脚,才来研究3线spi,后面发现屏幕刷新率太低了,刷新一整屏需要10s钟。最后发现RS=DC,立刻改为4线spi,爽歪歪。

不过ILI9488这个驱动芯片最坑的一点是采用spi方式,只支持8bit和18bit的颜色格式,不支持16bit。这是实验所得,其规格书上写的是采用4线spi时,可以支持16bit颜色,
但将0x3A写入0x05(16bit)屏幕没有显示,只有将0x3A写入0x06(18bit)时,才能显示出颜色。这一点非常坑爹。

ILI9488 18位颜色格式


通常用的都是16位颜色,所以在采用18位颜色是需要进行装换。然后再通过spi发送。具体转换方式就是

    colors[0] = (color>>8)&0xf8;colors[1] = (color>>3)&0xfc;colors[2] = (color<<3)&0xfc;

红色放到第一个字节,绿色放到第二个字节,蓝色放到低三个字节,且都是高位对齐。低位空置。转换后屏幕即可正常显示。

3线spi屏幕驱动方式相关推荐

  1. Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解

    话不多说,直接入正题: 常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制 本人几乎浏览了网上所有关于控制OLED模块的教程,并都经过了项目实测:大力推荐u8g2这个库函数来控制,文章末尾 ...

  2. stm32 4线SPI方式驱动CH452A数码管驱动芯片

    stm32 采用的是4线SPI方式连接.操作命令是12位的数据,采用的是io模拟的方式驱动.试过使用硬件SPI驱动,但是命令只支持12位,硬件SPI发送的是8位或者16位,是驱动不起来的. 常用指令如 ...

  3. 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  4. STM32—4线SPI驱动SSD1306 OLED

    文章目录 一.OLED简介 二.驱动SSD1306所需知识 1.引脚介绍 2.通信时序 3.显存GRAM 4.字库 5.SSD1306基本命令 三.代码讲解 1.相关引脚配置 2.模拟SPI通信 3. ...

  5. TLE5012B ESP32驱动程序、硬件电路设计、4线SPI通信,驱动完美兼容4线SPI不用改MOSI开漏推挽输出

    一.TLE5012B 简介 TLE5012B 是一种款高分辨率旋转位置传感器,用于在整个 360 度范围内进行角度测量. 它通过使用单片集成 巨磁阻 (iGMR) 元件,来测量正弦和余弦角分量,这些原 ...

  6. STC单片机驱动1.8‘TFT SPI屏幕示例模板(含资料包)

    STC单片机驱动1.8'TFT SPI屏幕示例模板(含资料包) 驱动演示 STC单片机采用的是: STC12C5A60S2,采用的自制开发板:<[开源]STC12C5A60S2开发板> 1 ...

  7. Arduino UNO驱动合宙1.8‘TFT SPI屏幕示例演示(含资料包)

    Arduino UNO驱动合宙1.8"TFT SPI屏幕示例演示 效果展示 驱动参考资料包 来源于:http://www.lcdwiki.com/zh/1.8inch_Arduino_SPI ...

  8. OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式,8080并口,IIC,SPI三种驱动方式,采用的单片机是STM32F407. 文章目录 一.OLED驱动原理介绍 二.8080并口驱动方式 三.IIC驱动方式 四. ...

  9. 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

    [全志T113-S3_100ask]15-1 内核5.4驱动spi屏幕--ILI9341 背景 (一)spi设备树 1.修改设备树 2.完善设备树 (二)使能内核 (三)兼容性修改 (四)测试 背景 ...

  10. 树莓派安装android spi,12.树莓派SPI屏幕模块驱动安装教程

    树莓派SPI屏幕需要安装相应的驱动,软件,以及一些配置文件才可正常使用,相对稍许繁琐,之前本人制作的SPI屏幕集成相应制作了一些配置好的系统,但远远不够使用,于是制作了相应的自动化安装脚本,理论上适用 ...

最新文章

  1. 使用Ansible中的playbook
  2. 移动端 像素渲染流水线与GPU Hack
  3. 通过自己定义MVC的Controller的Json转换器解决日期序列化格式问题
  4. python十一:集合(set)
  5. Boost Asio总结(9)数据缓冲区class mutable_buffer和const_buffer
  6. 前端学习(3090):vue+element今日头条管理-参数传递
  7. av linux,linux下的开源clanav
  8. iis配置write模块
  9. R语言中怎么将一个字符串向量合成一个大字符串
  10. Hadoop权威指南学习笔记一
  11. 解决eclipse无法启动:Failed to create the Java Virtual Machine
  12. boost::test
  13. Axure RP 9.0 软件安装教程
  14. C#上位机与三菱PLC通讯的实现步骤(图文)
  15. 《游戏系统设计一》游戏任务系统太复杂,带你一步一步实现
  16. kettle 完成处理后的字母含义,(I)nput, (O)utput, (R)ead, (W)ritten, (U)pdated, (E)rror
  17. memory prefix hypo,hecto,hyper out1
  18. saveFile()方法
  19. OpenCV 形态学操作应用——提取水平与垂直线
  20. 第八次网页前端培训(JavaScript)

热门文章

  1. 机器学习中的数学(八):卡方分布(Chi-squared Distribution) t分布(T Distribution)F分布(T Distribution)
  2. 注意!这13件事会毁掉你的信用,千万别做!
  3. 如何将标准地图服务中的eps格式中国地图应用到论文中带审图号的地图制作?(二)
  4. 前端常用PS技巧总结之将图片上的LOGO(水印)去掉
  5. [zz]明月虽好by 王大根 from 豆瓣
  6. 服务器开机日志文件,大芒果启动WOW服务器 提示日志文件找不到怎么办
  7. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
  8. Java中的按拼音排序
  9. 在Pycharm中,全文搜索、替换,以及单独文件搜索、替换!
  10. “酷我音乐”借“大数据”名义 恐已窥探并收集用户隐私长达数年