TFT LCD显示错位, 如何解决? - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6399|回复: 4

[未解决] TFT LCD显示错位, 如何解决?

[复制链接]

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
发表于 2023-4-14 14:42:06 | 显示全部楼层 |阅读模式
本帖最后由 lushidegreen 于 2023-4-14 14:43 编辑

平台:TMS320C6748
LCD接口:RGB565
LCD分辨率:480*360
问题描述:
在不同主频下,显示相同的画面,定时(1s)刷新一次显存数据。
CPU主频设为100M时,显示正常。提高到200M300M时,刷新显存数据,会导致显示错位。
正常画面和时序图:
(1).正常显示画面

如图1所示,是正常显示的画面。
此时CPU主频100MHzLCD_PCLK频率10MHz,屏幕刷新率约51Hz
逻辑分析仪抓取的信号如图2(红框是1帧范围)
(2).1画面对应的时序图

通道0PCLK (10MHz)
通道1VS(51.6Hz)
通道2HS(19.8kHz)
通道3DE
通道4DATA0.

异常画面和时序图:
(3).异常显示画面A
(4).异常显示画面B
如图3、图4所示,是异常显示的画面。
此时CPU主频300MHzLCD_PCLK频率10MHz,屏幕刷新率约51Hz
3画面对应的逻辑分析仪抓取的信号如图5(红框是1帧范围)
(5).3画面对应的时序图
正常和异常画面的时序图对比分析:
因为(1)(3)所示的显示内容基本相同,所以可以通过对比,可以确定图5中下面的红框所示的内容,就是一帧数据。只是图5的数据没有和VSDE等帧信号同步。
从上述分析可知,画面显示错位,是由于DATAVS等帧信号同步导致的。

问题:
1.前面描述的画面显示错位,和CPU主频没有关系?

2.Raster LCD控制器通过DMA把显存发送到LCD显示屏,如果此时CPU把图像数据写入显存,是否会发生冲突?如果有冲突,怎么解决?

3.Raster LCD控制器通过DMA把显存发送到LCD显示屏,如果CPU中也使用EDMA进行数据传输,是否会发生冲突?如果有冲突,怎么解决?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2023-4-14 14:47:40 | 显示全部楼层
本帖最后由 lushidegreen 于 2023-4-14 14:49 编辑

LCD驱动文件如下:// lcd_drv.h
#ifndef _LCD_DRV_H_
#define _LCD_DRV_H_

#include <xdc/std.h>
#include <stdio.h>
#include <stdarg.h>

#include "lcd_drv.h"

//================================宏定义=========================================================

// LCD 分辨率
#define LCD_WIDTH               (480)
#define LCD_HEIGHT              (360)

// 调试板的大小和偏移
#define PALETTE_SIZE            32
#define PALETTE_OFFSET          4

// TFT LCD显存数据结构体
typedef struct
{
        uint8_t palette[PALETTE_OFFSET+PALETTE_SIZE];
        uint16_t dat[LCD_HEIGHT][LCD_WIDTH];
}fb_data_t;

void tft_lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color);
void tft_lcd_draw_xline(uint16_t x, uint16_t y, uint16_t length, uint16_t color);
void tft_lcd_draw_yline(uint16_t x, uint16_t y, uint16_t length, uint16_t color);
void tft_lcd_fill_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color, uint8_t dir_mode);

void lcdc_raster_init(unsigned int cpu_freq);

#endif


// lcd_drv.c
#include <xdc/std.h>
#include <ti/sysbios/knl/Queue.h>
#include <ti/sysbios/knl/Task.h>

#include "hw_types.h"
#include "soc_C6748.h"
#include "hw_psc_C6748.h"
#include "hw_syscfg0_C6748.h"

#include "psc.h"
#include "gpio.h"
#include "spi.h"
#include "lidd.h"
#include "raster.h"

#include "lcd_drv.h"
#include "Drv_SpiFlash.h"

#include "board.h"

#include "DEBUG_config.h"

/************************外部变量******************************/
//无

/************************全局变量******************************/
//无

/************************模块局部变量******************************/
//无

#define GrOffScreen16BPPSize(lWidth, lHeight)            \
        (4 + (16*2) + (lWidth * lHeight * 2))

#pragma DATA_ALIGN(g_pucBuffer0, 4);
unsigned char g_pucBuffer0[GrOffScreen16BPPSize(LCD_WIDTH, LCD_HEIGHT)];

// 图形库显示结构
// tDisplay g_s800x480x16Display;

// 调色板
unsigned short palette_32b[PALETTE_SIZE/2] =
                        {0x4000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
                         0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u};

// 全局显示上下文
// tContext g_sContext;
/****************************************************************************/
/*                                                                          */
/*              LCD 中断服务函数                                            */
/*                                                                          */
/****************************************************************************/
void LCDIsr(void)
{
    unsigned int  status;

    status = RasterIntStatus(SOC_LCDC_0_REGS,RASTER_END_OF_FRAME0_INT_STAT |
                                             RASTER_END_OF_FRAME1_INT_STAT );

    RasterClearGetIntStatus(SOC_LCDC_0_REGS, status);
}

// 输入频率的单位是MHz
void lcdc_raster_init(unsigned int cpu_freq)
{
    // 禁用光栅
    RasterDisable(SOC_LCDC_0_REGS);

    // 时钟配置
    RasterClkConfig(SOC_LCDC_0_REGS,10000000, cpu_freq*1000000/2);

    // 配置 LCD DMA 控制器
    RasterDMAConfig(SOC_LCDC_0_REGS, RASTER_DOUBLE_FRAME_BUFFER,
                    RASTER_BURST_SIZE_16, RASTER_FIFO_THRESHOLD_8,
                    RASTER_BIG_ENDIAN_DISABLE);

    // 模式配置(例如:TFT 或者 STN,彩色或者黑白 等等)
    RasterModeConfig(SOC_LCDC_0_REGS, RASTER_DISPLAY_MODE_TFT,
                     RASTER_PALETTE_DATA, RASTER_COLOR, RASTER_RIGHT_ALIGNED);

    // 帧缓存数据以 LSB 方式排列
    RasterLSBDataOrderSelect(SOC_LCDC_0_REGS);

    // 禁用 Nibble 模式
    RasterNibbleModeDisable(SOC_LCDC_0_REGS);

    // 配置光栅控制器极性
    RasterTiming2Configure(SOC_LCDC_0_REGS, RASTER_FRAME_CLOCK_LOW |
                                            RASTER_LINE_CLOCK_LOW  |
                                            RASTER_PIXEL_CLOCK_LOW |
                                            RASTER_SYNC_EDGE_RISING|
                                            RASTER_SYNC_CTRL_ACTIVE|
                                            RASTER_AC_BIAS_HIGH     , 0, 255);

        // RasterHparamConfig(baseAddr,     numOfppl, hsw,hfp,hbp);
    RasterHparamConfig(SOC_LCDC_0_REGS, LCD_WIDTH, 10, 4, 10);
        // RasterVparamConfig( baseAddr,    Lpp,       vsw,vfp,vbp);
        RasterVparamConfig(SOC_LCDC_0_REGS, LCD_HEIGHT, 4, 8, 12);

        // 配置 FIFO DMA 延时
        RasterFIFODMADelayConfig(SOC_LCDC_0_REGS, 2);

    unsigned int i = 0, j = 0;
        unsigned char *src, *dest;

          // 配置基本框架
        RasterDMAFBConfig(SOC_LCDC_0_REGS,
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET),
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET) + sizeof(g_pucBuffer0) - 2 - PALETTE_OFFSET,
                                          0);

        RasterDMAFBConfig(SOC_LCDC_0_REGS,
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET),
                                          (unsigned int)(g_pucBuffer0+PALETTE_OFFSET) + sizeof(g_pucBuffer0) - 2 - PALETTE_OFFSET,
                                          1);

        // 拷贝调色板到离屏显存中
        src = (unsigned char *)palette_32b;
        dest = (unsigned char *)(g_pucBuffer0+PALETTE_OFFSET);
        for( i = 4; i < (PALETTE_SIZE+4); i++)
        {
                *dest++ = *src++;
        }

        // 使能LCD帧结束中断
        RasterEndOfFrameIntEnable(SOC_LCDC_0_REGS);

        // 使能光栅
        RasterEnable(SOC_LCDC_0_REGS);
}

/****************************************************************************/
unsigned int LCDVersionGet(void)
{
    return 1;
}

/**
* @brief: TFT LCD写一个像素到显存
* @author: lusd
* @param [in] x, 横轴坐标, 范围0~479
* @param [in] y, 纵轴坐标, 范围0~359
* @param [in] color, RGB565颜色值
* @return none.
*/
void tft_lcd_draw_pixel(uint16_t x, uint16_t y, uint16_t color)
{
        fb_data_t *fb_dat;

        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) {
                fb_dat = (fb_data_t *)(g_pucBuffer0);
                fb_dat->dat[y][x] = color;
        }
}


/**
* @brief: TFT LCD在显存中画横线
* @author: lusd
* @param [in] x, 横轴起始坐标, 范围0~479
* @param [in] y, 纵轴起始坐标, 范围0~359
* @param [in] length, 长度, 范围0~479, 超出屏幕部分忽略
* @param [in] color, RGB565颜色值
* @return none.
*/
void tft_lcd_draw_xline(uint16_t x, uint16_t y, uint16_t length, uint16_t color)
{
        uint16_t *dest16;
        fb_data_t *fb_dat;

        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) {
                fb_dat = (fb_data_t *)(g_pucBuffer0);
                dest16 = &(fb_dat->dat[y][x]);
                if ((x + length) > LCD_WIDTH) {
                        length = LCD_WIDTH - x;
                }
                while (length--) {
                        *dest16++ = color;
                }               
        }
}

/**
* @brief: TFT LCD在显存中画竖线
* @author: lusd
* @param [in] x, 横轴起始坐标, 范围0~479
* @param [in] y, 纵轴起始坐标, 范围0~359
* @param [in] length, 长度, 范围0~359, 超出屏幕部分忽略
* @param [in] color, RGB565颜色值
* @return none.
*/
void tft_lcd_draw_yline(uint16_t x, uint16_t y, uint16_t length, uint16_t color)
{
        uint16_t h, y_end;
        fb_data_t *fb_dat;

        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) {
                fb_dat = (fb_data_t *)(g_pucBuffer0);
                if ((y + length) > LCD_HEIGHT) {
                        length = LCD_HEIGHT - y;
                }
                y_end = y + length;
                for (h=y; h<y_end; h++) {
                        fb_dat->dat[h][x] = color;
                }
        }
}

/**
* @brief: TFT LCD在显存中填充一个矩形区域
* @author: lusd
* @param [in] x, 横轴起始坐标, 范围0~479
* @param [in] y, 纵轴起始坐标, 范围0~359
* @param [in] width, 宽, 范围0~479, 超出屏幕部分忽略
* @param [in] height, 高, 范围0~359, 超出屏幕部分忽略
* @param [in] color, RGB565颜色值
* @return none.
*/
void tft_lcd_fill_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
{
        uint16_t w, h, x_end, y_end;
        fb_data_t *fb_dat;

        if ((x < LCD_WIDTH) && (y < LCD_HEIGHT)) {
                fb_dat = (fb_data_t *)(g_pucBuffer0);
                if ((x + width) > LCD_WIDTH) {
                        width = LCD_WIDTH - x;
                }
                if ((y + height) > LCD_HEIGHT) {
                        height = LCD_HEIGHT - y;
                }
                x_end = x + width;
                y_end = y + height;

                for (h=y; h<y_end; h++) {
                        for (w=x; w<x_end; w++) {
                                fb_dat->dat[h][w] = color;
                        }
                }
        }
}

回复 支持 反对

使用道具 举报

24

主题

125

帖子

1466

积分

金牌会员

Rank: 6Rank: 6

积分
1466
 楼主| 发表于 2023-4-14 14:54:14 | 显示全部楼层
在TI论坛也发了该问题:
TMS320C6748: RGB LCD display misalignment issue

回复说已经不支持Starterware开发。

请问创龙是否有Starterware驱动之外的RGBLCD的相关例程?
回复 支持 反对

使用道具 举报

0

主题

112

帖子

484

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
484
发表于 2023-4-19 17:30:00 | 显示全部楼层
您好,从您目前测试分析,大概率与CPU性能有关
回复 支持 反对

使用道具 举报

0

主题

112

帖子

484

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
484
发表于 2023-5-8 08:15:27 | 显示全部楼层
lushidegreen 发表于 2023-4-14 14:54
在TI论坛也发了该问题:
TMS320C6748: RGB LCD display misalignment issue

您好,可以参考SYS/BIOS中的LCD_TOUCH——7英寸LCD显示屏案例
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-12-8 14:49 , Processed in 0.042211 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表