在移植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;
}
我想请教的问题,因为颜色数据时16位的,而SPI的DMA发送的是8位数据,我看到有帖子说可以设置位宽,不知道CH582M是否支持设置,规格书没找到配置项,找到一个数据位序选择
请问DMA最大一次性只能发送4095个数据吗?能否修改那么CH32V208这类的MCU是否没这个限制呢
下图是我用两种方式的显示效果
上图是DMA方式 下图是逐个画的