• 3线spi屏幕驱动方式


    前言

    最近研究了一下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 transaction
        t.length=9;                     //Command is 8 bits
        t.tx_buffer=&data;               //The data is the cmd itself
        ret=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 transaction
        t.length=8;                     //Command is 8 bits
        t.tx_buffer=&data;               //The data is the cmd itself
        ret=spi_device_polling_transmit(spi, &t);  //Transmit!
        assert(ret==ESP_OK);            //Should have had no issues.
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    只有改成为这样才能正常与屏幕通信。这个造成了通信速度降低,难以采用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;
    
    • 1
    • 2
    • 3

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

  • 相关阅读:
    Apache 服务器的搭建和配置
    【docker】配置深度学习环境
    什么是PaaS平台
    【无标题】
    第23天中视频伙伴计划通过!分享本人心得,希望能帮到路上的你
    13 最大子数组和
    使用 Verdaccio 建立私有npm库
    python与分形0020 - Stack of Hexagons
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-17-处理鼠标悬停
    linux-gic中断分析
  • 原文地址:https://blog.csdn.net/sinat_36568888/article/details/125430827