525添加QSPI-LCD实例

1 确认rt-driver工程正常运行

调屏推荐采用rt-driver工程,调试前确认rt-driver工程能正常运行并有Log打印

1.1 编译

进入example\rt_driver\project目录,右键选择ComEmu_Here弹出编译命令串口,依次执行

> D:\sifli\git\sdk\v2.2.4\set_env.bat   #设置编译环境路径
> scons --board=em-lb525 -j8   #指定em-lb525模块编译rt-driver工程

alt text

1.2 进入BOOT模式

确认525em-lb525模块板进入boot模式便于下载,如下图操作
alt text

1.3 下载

> build_em-lb525\uart_download.bat

     Uart Download

please input the serial port num:7 #然后选择em-lb525模块连接的串口号进行下载 

1.4 确认正常LOG

如下图,运行用户程序需要去掉勾选进入BOOT选项,确认板子跑起来后,就可以继续下一步添加新屏幕模组
alt text

2 添加屏驱NV3041A

2.1 创建NV3041A驱动

1) 屏驱位置 屏驱动位于sdk\customer\peripherals目录
2) 复制驱动 复制一份其他qspi接口的驱动更名为qspi_nv3041a

2.3 Menuconfig选中NV3041A

以上步骤完成后,编译窗口输入下面命令,并选中刚添加的nv3041a屏

menuconfig --board=em-lb525 (打开menuconfig窗口) 在这个路径下(Top) Config LCD on board Enable LCD on the board SelecCD选中刚添加的屏,示例如下,保存退出,即选中了qspi_nv3041a目录下屏驱动参加编译
alt text

3 生成SourceInsight工程

为了便于查看参加编译的代码,可以生成rt-driver整个工程参加编译的文件list,再导入到Source Insight中便于查看,可以跳过此章节

3.1 生成文件List

命令scons --board=em-lb525 --target=si生成si_filelist.txt
alt text

3.2 文件List导入

打开Source Insight导入si_filelist.txt进入工程

alt text

3.3 查看屏驱是否生效

可以在SI(Source Insight)工程中查看rtconfig.h对应宏是否生成和是否已经包含了qspi_nv3041a.c加入编译
alt text

4 屏硬件连接

4.1 排线连接

如果购买的是匹配的屏幕模组,直接排线连接到插座即可,如下图
alt text

4.2 飞线连接

如果新的屏幕模组,排线排列不一致,就需要自己设计排线转接板或者从插针飞线调试。
转接板的设计可以参考SF32LB52-DevKit-LCD转接板制作指南

5 屏驱动配置

5.1 默认IO配置

如果采用的默认IO,此处可以跳过

5.1.1 IO模式设置

LCD采用的是LCDC1硬件来输出波形,需配置为对应的FUNC模式,
每个IO有哪些Funtion可以参考硬件文档 下载SF32LB52X_Pin_config
alt text
LCD和TP的RESET脚都是采用GPIO模式,则默认已经配置为GPIO模式

 HAL_PIN_Set(PAD_PA00, GPIO_A0,  PIN_NOPULL, 1);     // #LCD_RESETB
 HAL_PIN_Set(PAD_PA09, GPIO_A9,  PIN_NOPULL, 1);     // CTP_RESET

5.1.2 IO上下电操作

下面是上电LCD初始化流程
rt_hw_lcd_ini->api_lcd_init->lcd_task->lcd_hw_open->BSP_LCD_PowerUp-find_right_driver->LCD_drv.LCD_Init->LCD_drv.LCD_ReadID->lcd_set_brightness->LCD_drv.LCD_DisplayOn
可以看到上电BSP_LCD_PowerUp在屏驱动初始化LCD_drv.LCD_Init之前
所以需要在初始化LCD前,确保BSP_LCD_PowerUp中已经打开LCD供电
alt text

5.2 屏驱复位时序

下面几个延时比较关键,需要参照屏驱IC相关文档的初始化时序,谨慎修改

    BSP_LCD_Reset(1);
    rt_thread_mdelay(1);    //延时1ms
    BSP_LCD_Reset(0);       //Reset LCD
    rt_thread_mdelay(10);   //延时10ms
    BSP_LCD_Reset(1);

    /* Wait for 200ms */
    rt_thread_mdelay(120);  //延时120ms

5.3 屏驱寄存器修改

每个屏驱IC的初始化寄存器配置差异较大,需要按照屏厂提供的寄存器参数,按照他们的SPI时序依次通过QSPI写入屏驱IC,特别注意0x11和0x29寄存器后的延时长度要求

    parameter[0] = 0x16;
    LCD_WriteReg(hlcdc, 0x92, parameter, 1);

    parameter[0] = 0x16;
    LCD_WriteReg(hlcdc, 0xB2, parameter, 1);

    parameter[0] = 0x00;
    LCD_WriteReg(hlcdc, 0xff, parameter, 1);

    LCD_WriteReg(hlcdc, 0x11, parameter, 0); // internal reg enable
    rt_thread_mdelay(60);

    LCD_WriteReg(hlcdc, 0x29, parameter, 0); // internal reg enable
    rt_thread_mdelay(120);

5.4 屏驱参数配置

  • .lcd_itf : 选择LCDC_INTF_SPI_DCX_4DATA表示QSPI 4线模式

  • .freq :选择36000000,表示QSPI的clk主频为36Mhz,这个时钟要依据屏驱IC支持的最高时钟来选择,越高每帧送数时间越短,帧率会越高

  • .color_mode :选择RGB565 还是RGB888格式

  • .syn_mode :选择是否启用TE防撕裂功能,如果启动TE,屏驱IC无TE信号,不会送屏,会出现Timeout死机,前期调试建议关闭TE

  • .vsyn_polarity :选择TE的极性

  • .vsyn_delay_us :选择TE波形到来后多久LCDC1开始送数给屏驱IC

  • .readback_from_Dx : 选择QSPI读Chipid时,屏驱IC的数据是从D0-D3的哪条信号线输出(参照屏驱IC手册)

static LCDC_InitTypeDef lcdc_int_cfg_qadspi =
{
    .lcd_itf = LCDC_INTF_SPI_DCX_4DATA,
    .freq = 36000000,                          // 实际频率为Hcpu的整数分频后频率,240Mhz(HCLK)/7 = 34.28Mhz
    .color_mode = LCDC_PIXEL_FORMAT_RGB565,    // RGB565 format

    .cfg = {
        .spi = {
            .dummy_clock = 1,
#ifndef DEBUG
            .syn_mode = HAL_LCDC_SYNC_VER,     //Enable TE, Prevent tearing
#else
            .syn_mode = HAL_LCDC_SYNC_DISABLE, //Disable TE, For debugging
#endif /* LCD_LCD_VSYNC_ENABLE */
            .vsyn_polarity = 1,
            .vsyn_delay_us = 0,
            .hsyn_num = 0,
            .readback_from_Dx = 0,             //qspi read from d0, ( 0-3: d0-d3 ) 
        },
    },
};

6 编译烧录下载结果

6.1 显示结果展示

如下图,如果显示正常会依次6种图像,3秒定时循环显示
alt text