硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5209|回复: 11
收起左侧

[有问必答] RA8875回读像素点出错

[复制链接]

13

主题

20

回帖

59

积分

初级会员

积分
59
发表于 2014-7-25 15:51:35 | 显示全部楼层 |阅读模式
使用如下测试程序(其实有画矩形的,先不管了),在屏幕四个角上分别画6*6的矩形。
void test(void)
{
  //左上角画一个6*6的红色小矩形
  RA8875_DrawLine(0, 0, 5, 0, COLOR_RED);
  RA8875_DrawLine(0, 1, 5, 1, COLOR_RED);
  RA8875_DrawLine(0, 2, 5, 2, COLOR_RED);
  RA8875_DrawLine(0, 3, 5, 3, COLOR_RED);
  RA8875_DrawLine(0, 4, 5, 4, COLOR_RED);
  RA8875_DrawLine(0, 5, 5, 5, COLOR_RED);
  //右上角画一个6*6的绿色小矩形
  RA8875_DrawLine(474, 0, 479, 0, COLOR_GREEN);
  RA8875_DrawLine(474, 1, 479, 1, COLOR_GREEN);
  RA8875_DrawLine(474, 2, 479, 2, COLOR_GREEN);
  RA8875_DrawLine(474, 3, 479, 3, COLOR_GREEN);
  RA8875_DrawLine(474, 4, 479, 4, COLOR_GREEN);
  RA8875_DrawLine(474, 5, 479, 5, COLOR_GREEN);
  //左下角画一个6*6的蓝色小矩形
  RA8875_DrawLine(0, 266, 5, 266, COLOR_BLUE);
  RA8875_DrawLine(0, 267, 5, 267, COLOR_BLUE);
  RA8875_DrawLine(0, 268, 5, 268, COLOR_BLUE);
  RA8875_DrawLine(0, 269, 5, 269, COLOR_BLUE);
  RA8875_DrawLine(0, 270, 5, 270, COLOR_BLUE);
  RA8875_DrawLine(0, 271, 5, 271, COLOR_BLUE);
  //右下角画一个6*6的黑色小矩形
  RA8875_DrawLine(474, 266, 479, 266, COLOR_BLACK);
  RA8875_DrawLine(474, 267, 479, 267, COLOR_BLACK);
  RA8875_DrawLine(474, 268, 479, 268, COLOR_BLACK);
  RA8875_DrawLine(474, 269, 479, 269, COLOR_BLACK);
  RA8875_DrawLine(474, 270, 479, 270, COLOR_BLACK);
  RA8875_DrawLine(474, 271, 479, 271, COLOR_BLACK);


}
在开发板的屏幕上是正常的,接着回读象素点数,如下

void rgb_read(void)
{  
  uint16_t x, y;

  for (y = 271; y >= 0; y--) // 0-271, 271先是由于BMP图像数据是从下往上的
  {
    for (x = 0; x <= 479; x++)  //0-479
    {
      缓冲 = RA8875_GetPixel(x, y);      
    }
  }
}
屏幕显示效果如下
2.JPG


回读后显示数据如下(存为BMP):左边第一列数据不对,为什么呢?
1.JPG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107604
QQ
发表于 2014-7-25 18:06:00 | 显示全部楼层
把你的RA8875_GetPixel(x, y);   贴出来看下,以及你的RA8875的初始化也贴出来
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-28 08:50:12 | 显示全部楼层
删除,发错了
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-28 08:52:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:把你的RA8875_GetPixel(x, y);   贴出来看下,以及你的RA8875的初始化也贴出来
(2014-07-25 18:06)
用的都是例程中的,如下是初始化
void RA8875_InitHard(void)
{
    uint8_t ucGPIX;

    /* 读取 RA8875 芯片额GPIX引脚的电平状态;1表示4.3寸屏;0表示7寸屏
    【备注】这是安富莱电子为了便于统一测试例程,在LCD模块上做的硬件标识。在做产品时,不必自动识别。
    */
    ucGPIX = RA8875_ReadReg(0xC7);


    /* 初始化PLL.  晶振频率为25M */
    RA8875_WriteCmd(0x88);
    RA8875_Delaly1us();        /* 延迟1us */
    RA8875_WriteData(10);    /* PLLDIVM [7] = 0 ;  PLLDIVN [4:0] = 10 */

    RA8875_Delaly1ms();

    RA8875_WriteCmd(0x89);
    RA8875_Delaly1us();        /* 延迟1us */
    RA8875_WriteData(2);        /* PLLDIVK[2:0] = 2, 除以4 */

    /* RA8875 的内部系统频率 (SYS_CLK) 是结合振荡电路及PLL 电路所产生,频率计算公式如下 :
      SYS_CLK = FIN * ( PLLDIVN [4:0] +1 ) / ((PLLDIVM+1 ) * ( 2^PLLDIVK [2:0] ))
              = 25M * (10 + 1) / ((0 + 1) * (2 ^ 2))
              = 68.75MHz
    */

    /* REG[88h]或REG[89h]被设定后,为保证PLL 输出稳定,须等待一段「锁频时间」(< 100us)。*/
    RA8875_Delaly1ms();

    /*
        配置系统控制寄存器。 中文pdf 第18页:

        bit3:2 色彩深度设定 (Color Depth Setting)
            00b : 8-bpp 的通用TFT 接口, i.e. 256 色。
            1xb : 16-bpp 的通用TFT 接口, i.e. 65K 色。     【选这个】

        bit1:0 MCUIF 选择
            00b : 8-位MCU 接口。
            1xb : 16-位MCU 接口。 【选这个】
    */
    RA8875_WriteReg(0x10, (1 <<3 ) | (1 << 1));    /* 配置16位MCU并口,65K色 */

    /* REG[04h] Pixel Clock Setting Register   PCSR
        bit7  PCLK Inversion
            0 : PDAT 是在PCLK 正缘上升 (Rising Edge) 时被取样。
            1 : PDAT 是在PCLK 负缘下降 (Falling Edge) 时被取样。
        bit1:0 PCLK 频率周期设定
            Pixel Clock  PCLK 频率周期设定。
            00b: PCLK 频率周期= 系统频率周期。
            01b: PCLK 频率周期= 2 倍的系统频率周期。
            10b: PCLK 频率周期= 4 倍的系统频率周期。
            11b: PCLK 频率周期= 8 倍的系统频率周期。
    */

    RA8875_WriteReg(0x04, 0x02);    /* 设置PCLK同相 */

    RA8875_Delaly1ms();

    //Horizontal set
    //HDWR//Horizontal Display Width Setting Bit[6:0]
    //Horizontal display width(pixels) = (HDWR + 1)*8
    RA8875_WriteReg(0x14, 0x3B);
    RA8875_WriteReg(0x15, 0x00);

    //HNDR//Horizontal Non-Display Period Bit[4:0]
    //Horizontal Non-Display Period (pixels) = (HNDR + 1)*8
    RA8875_WriteReg(0x16, 0x01);

    //HSTR//HSYNC Start Position[4:0]
    //HSYNC Start Position(PCLK) = (HSTR + 1)*8
    RA8875_WriteReg(0x17, 0x00);

    //HPWR//HSYNC Polarity ,The period width of HSYNC.
    //HSYNC Width [4:0]   HSYNC Pulse width(PCLK) = (HPWR + 1)*8
    RA8875_WriteReg(0x18, 0x05);

    //Vertical set
    //VDHR0 //Vertical Display Height Bit [7:0]
    //Vertical pixels = VDHR + 1
    RA8875_WriteReg(0x19, 0x0F);

    //VDHR1 //Vertical Display Height Bit [8]
    //Vertical pixels = VDHR + 1
    RA8875_WriteReg(0x1A, 0x01);

    //VNDR0 //Vertical Non-Display Period Bit [7:0]
    //Vertical Non-Display area = (VNDR + 1)
    RA8875_WriteReg(0x1B, 0x02);

    //VNDR1 //Vertical Non-Display Period Bit [8]
    //Vertical Non-Display area = (VNDR + 1)
    RA8875_WriteReg(0x1C, 0x00);

    //VSTR0 //VSYNC Start Position[7:0]
    //VSYNC Start Position(PCLK) = (VSTR + 1)
    RA8875_WriteReg(0x1D, 0x07);

    //VSTR1 //VSYNC Start Position[8]
    //VSYNC Start Position(PCLK) = (VSTR + 1)
    RA8875_WriteReg(0x1E, 0x00);

    //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
    //VSYNC Pulse Width(PCLK) = (VPWR + 1)
    RA8875_WriteReg(0x1F, 0x09);


    g_LcdHeight = LCD_43_HEIGHT;
    g_LcdWidth = LCD_43_WIDTH;


    /* 设置TFT面板的 DISP  引脚为高,使能面板. 安富莱TFT模块的DISP引脚连接到RA8875芯片的GP0X脚 */
    RA8875_WriteReg(0xC7, 0x01);    /* DISP = 1 */

    /* LCD 显示/关闭讯号 (LCD Display on) */
    RA8875_WriteReg(0x01, 0x80);

    /*     REG[40h] Memory Write Control Register 0 (MWCR0)

        Bit 7    显示模式设定
            0 : 绘图模式。
            1 : 文字模式。

        Bit 6    文字写入光标/内存写入光标设定
            0 : 设定文字/内存写入光标为不显示。
            1 : 设定文字/内存写入光标为显示。

        Bit 5    文字写入光标/内存写入光标闪烁设定
            0 : 游标不闪烁。
            1 : 游标闪烁。

        Bit 4   NA

        Bit 3-2  绘图模式时的内存写入方向
            00b : 左 -> 右,然后上 -> 下。
            01b : 右 -> 左,然后上 -> 下。
            10b : 上 -> 下,然后左 -> 右。
            11b : 下 -> 上,然后左 -> 右。

        Bit 1     内存写入光标自动增加功能设定
            0 : 当内存写入时光标位置自动加一。
            1 : 当内存写入时光标位置不会自动加一。

        Bit 0 内存读取光标自动增加功能设定
            0 : 当内存读取时光标位置自动加一。
            1 : 当内存读取时光标位置不会自动加一。
    */
    RA8875_WriteReg(0x40, 0x00);    /* 选择绘图模式 */
    这个函数要修改,这里改成0x01试试,RA8875_WriteReg(0x40, 0x01);

    /*     REG[41h] Memory Write Control Register1 (MWCR1)
        写入目的位置,选择图层1
    */
    RA8875_WriteReg(0x41, 0x00);    /* 选择绘图模式, 目的为CGRAM */

    RA8875_SetDispWin(0, 0, g_LcdHeight, g_LcdWidth);

    RA8875_ClrScr(SYSTEM_BG_COLOR);

    RA8875_SetBackLight(BRIGHT_DEFAULT);
}
设置读取位置
void RA8875_SetReadCursor(uint16_t _usX, uint16_t _usY)
{
    /* 设置内存读光标的坐标 */
    RA8875_WriteReg(0x4A, _usX);
    RA8875_WriteReg(0x4B, _usX >> 8);
    RA8875_WriteReg(0x4C, _usY);
    RA8875_WriteReg(0x4D, _usY >> 8);
}
读取像素点颜色值
uint16_t  RA8875_GetPixel(uint16_t _usX, uint16_t _usY)
{
    uint16_t usRGB;

    RA8875_SetReadCursor(_usX, _usY);    /* 设置读取光标位置 */

    s_ucRA8875Busy = 1;

    RA8875_WriteCmd(0x02);
    usRGB = RA8875_ReadData16();

    s_ucRA8875Busy = 0;

    return usRGB;
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107604
QQ
发表于 2014-7-28 09:31:00 | 显示全部楼层
我把你的函数修改了一个地方,你看到了不,就是函数:RA8875_WriteReg(0x40, 0x00);    /* 选择绘图模式 */
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-28 10:28:19 | 显示全部楼层

回 eric2013 的帖子

eric2013:
我把你的函数修改了一个地方,你看到了不,就是函数:RA8875_WriteReg(0x40, 0x00);    /* 选择绘图模式 */
还是这样
Snap3.jpg

我改为只画一条线,如下
RA8875_DrawLine(0, 10, 479, 10, COLOR_RED);
得到如下图,第一点偏了一行
Snap5.jpg

改为从第二点开始画,成这样,第二点空了
RA8875_DrawLine(1, 10, 479, 10, COLOR_RED);
Snap6.jpg

改为从第一点开始画到倒数第二点,第一点空了
Snap8.jpg

但是上面那几个测试,在TFT屏上看都是正常的!![s:128]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107604
QQ
发表于 2014-7-28 10:34:01 | 显示全部楼层
这个函数源代码看下:
RA8875_ReadData16();
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-28 10:43:46 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个函数源代码看下:
RA8875_ReadData16(); (2014-07-28 10:34) 
    /* 定义LCD驱动器的访问地址 */
    #define RA8875_BASE        ((uint32_t)(0x60000000 | 0x0C000000))

    #define RA8875_REG        *(__IO uint16_t *)(RA8875_BASE + 2)
    #define RA8875_RAM        *(__IO uint16_t *)(RA8875_BASE)

static uint16_t RA8875_ReadData16(void)
{
    uint16_t value;

    value = RA8875_RAM;        /* 读取寄存器值 */

    return value;
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107604
QQ
发表于 2014-7-28 10:44:57 | 显示全部楼层
改成这样,多读2次。
static uint16_t RA8875_ReadData16(void)
{
    uint16_t value;

    value = RA8875_RAM;        /* 读取寄存器值 */
    value = RA8875_RAM;        /* 读取寄存器值 */
   value = RA8875_RAM;        /* 读取寄存器值 */

‘    return value;
}
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-28 11:18:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:改成这样,多读2次。
static uint16_t RA8875_ReadData16(void)
{
    uint16_t value;

....... (2014-07-28 10:44) 
还是一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107604
QQ
发表于 2014-7-28 11:19:09 | 显示全部楼层

回 pigy0754 的帖子

pigy0754:还是一样 (2014-07-28 11:18) 
那就帮不了你了。
回复

使用道具 举报

13

主题

20

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2014-7-29 08:09:34 | 显示全部楼层

回 eric2013 的帖子

eric2013:那就帮不了你了。 (2014-07-28 11:19) 
[s:142]谢谢,我再整整看!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-7 22:16 , Processed in 0.368016 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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