在移植LVGL的時候 使用SPI一個個點去畫的時候顯示時正常的
但是因為LVGL生成的是16位RGB565數(shù)據(jù)格式,顯示出現(xiàn)異常
// LVGL 屏幕數(shù)據(jù) 驅(qū)動
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);?// 設(shè)置屏幕起始和結(jié)束地址
? ?// 這里的color_p是一個16位的RGB565顏色緩沖區(qū)
? ? 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);//設(shè)置光標位置
? ? LCD_WR_DATA(color);
}
void LCD_WR_DATA(uint16_t dat){
? ? LCD_Writ_Bus(dat>>8);
? ? LCD_Writ_Bus(dat);
}
//******************* SPI 單獨畫點**********?
// DMA 數(shù)據(jù)發(fā)送時序
void LCD_Write_DMA_Data(uint8_t* data,uint16_t len){
? ? ? ?GPIOA_SetBits(DC_PIN); // 寫數(shù)據(jù)
? ? ? ?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;
}
我想請教的問題,因為顏色數(shù)據(jù)時16位的,而SPI的DMA發(fā)送的是8位數(shù)據(jù),我看到有帖子說可以設(shè)置位寬,不知道CH582M是否支持設(shè)置,規(guī)格書沒找到配置項,找到一個數(shù)據(jù)位序選擇
請問DMA最大一次性只能發(fā)送4095個數(shù)據(jù)嗎?能否修改那么CH32V208這類的MCU是否沒這個限制呢
下圖是我用兩種方式的顯示效果
上圖是DMA方式? 下圖是逐個畫的?