CH582M 移植LVGL时使用DMA发送数据异常的问题

在移植LVGL的时候 使用SPI一个个点去画的时候显示时正常的

但是因为LVGL生成的是16位RGB565数据格式,显示出现异常

// LVGL 屏幕数据 驱动

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t *color_p){

#if 1 // 逐点画

    if(disp_flush_enabled) {

        //The most simple case (but also the slowest) to put all pixels to the screen one-by-one

        int32_t x;

        int32_t y;

        for(y = area->y1; y <= area->y2; y++) {

            for(x = area->x1; x <= area->x2; x++) {

                //Put a pixel to the display. For example:

                //put_px(x, y, *color_p)

                LCD_DrawPoint(x, y, color_p->full);  // 单独一个个点画是正常的 但是这样太慢了

                color_p++;

            }

        }

    }

#else // DMA

    LCD_Address_Set(area->x1, area->y1, area->x2, area->y2); // 设置屏幕起始和结束地址

   // 这里的color_p是一个16位的RGB565颜色缓冲区

    LCD_Write_DMA_Data(color_p, (area->x2-area->x1+1)*(area->y2-area->y1+1)*2); 

#endif

    /*IMPORTANT!!!

     *Inform the graphics library that you are ready with the flushing*/

    lv_disp_flush_ready(disp_drv);

}

//******************* SPI 单独画点**********

void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color){

    LCD_Address_Set(x,y,x,y);//设置光标位置

    LCD_WR_DATA(color);

}

void LCD_WR_DATA(uint16_t dat){

    LCD_Writ_Bus(dat>>8);

    LCD_Writ_Bus(dat);

}

//******************* SPI 单独画点********** 

// DMA 数据发送时序

void LCD_Write_DMA_Data(uint8_t* data,uint16_t len){

       GPIOA_SetBits(DC_PIN); // 写数据

       GPIOA_ResetBits(CS_PIN);

       SPI0_MasterDMATrans(data,len);

       GPIOA_SetBits(CS_PIN);

}

// 这里是官方库文件 没有修改

void SPI0_MasterDMATrans(uint8_t *pbuf, uint16_t len){

    R8_SPI0_CTRL_MOD &= ~RB_SPI_FIFO_DIR;

    R16_SPI0_DMA_BEG = (uint32_t)pbuf;

    R16_SPI0_DMA_END = (uint32_t)(pbuf + len);

    R16_SPI0_TOTAL_CNT = len;

    R8_SPI0_INT_FLAG = RB_SPI_IF_CNT_END | RB_SPI_IF_DMA_END;

    R8_SPI0_CTRL_CFG |= RB_SPI_DMA_ENABLE;

    while(!(R8_SPI0_INT_FLAG & RB_SPI_IF_CNT_END));

    R8_SPI0_CTRL_CFG &= ~RB_SPI_DMA_ENABLE;

}

  1. 我想请教的问题,因为颜色数据时16位的,而SPI的DMA发送的是8位数据,我看到有帖子说可以设置位宽,不知道CH582M是否支持设置,规格书没找到配置项,找到一个数据位序选择

  2. 请问DMA最大一次性只能发送4095个数据吗?能否修改那么CH32V208这类的MCU是否没这个限制呢

    下图是我用两种方式的显示效果

    上图是DMA方式  下图是逐个画的 



  3. 1671604407152876.jpg

  4. 1671604407130765.jpg

经过排查,显示异常是因为自己代码中配置屏幕的区域造成的,现在显示正常了

感觉SPI 驱动 320*240屏幕还是有点慢,有拉窗帘的感觉,就是不知道DMA的4095的限制能不能去掉


主机模式下 SPI 数据收发总字节数,低12 位有效。在使用 DMA 时一次最多可以收发 4095 个字节。不支持从机模式。

目前暂支持该模式。



楼主你好,可以参考一下你的移植程序吗,我的lvgl一直移植不成功,谢谢!


只有登录才能回复,可以选择微信账号登录