硬汉嵌入式论坛

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

[有问必答] 求助,RA8875点不亮

[复制链接]

10

主题

51

回帖

10

积分

初级会员

积分
10
发表于 2016-3-6 02:21:15 | 显示全部楼层 |阅读模式
我用的是野火的mini板子,换上RA8875 4.3 480* 272的LCD,目前无法点亮,原理图如下:

原理图

原理图



移植过来的驱动代码只修改了以下几个地方:
1. GPIO_D_13改为GPIO_D_11,因为RS为A16;
2.删除 init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
3. RA8875_InitHard()中去除了兼容部分。
4.


#define RA8875_REG    *(__IO uint16_t *)(0x60000000)
#define RA8875_RAM    *(__IO uint16_t *)(0x60020000)






硬件上的连接检查了,应该没有问题;


int main(void)
{
    int i = 0;

    /* LED 端口初始化 */
    ALL_GPIO_Config();

    GPIO_SetBits(GPIOB,GPIO_Pin_0);
    GPIO_SetBits(GPIOB,GPIO_Pin_1);
    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    RA8875_InitHard();
    RA8875_SetBackLight(200);

    /* 初始化定时器 */
//    SysTick_Init();

    /*CRC和emWin没有关系,只是他们为了库的保护而做的,这样STemWin的库只能用在ST的芯片上面,别的芯片是无法使用的。 */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);   

//    GUI_Init();

    GPIO_ResetBits(GPIOB,GPIO_Pin_0);

    /* 初始化串口 */
    USART1_Config();
    while (1)
    {
        //i = Key_Scan();
    }   
}

初始化代码如下:

static void LCD_CtrlLinesConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 使能复用IO时钟*/
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_AFIO, ENABLE );
    /* 使能FSMC对应相应管脚时钟*/
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE );
#endif   

    /* 设置 PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
     PD.10(D15), PD.14(D0), PD.15(D1) 为复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
                                GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* 设置 PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
     PE.14(D11), PE.15(D12) 为复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
                                GPIO_Pin_15;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /* 设置 PD.13(A18 (RS))  为复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* 设置 PD.7(NE1 (LCD/CS)) 为复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

/*
*********************************************************************************************************
*    函 数 名: LCD_FSMCConfig
*    功能说明: 配置FSMC并口访问时序
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void LCD_FSMCConfig(void)
{

    FSMC_NORSRAMInitTypeDef  init;
    FSMC_NORSRAMTimingInitTypeDef  timing;

    /*-- FSMC Configuration ------------------------------------------------------*/
    /*----------------------- SRAM Bank 1 ----------------------------------------*/
    /* FSMC_Bank1_NORSRAM4 configuration */
    timing.FSMC_AddressSetupTime = 1;
    timing.FSMC_AddressHoldTime = 0;
    timing.FSMC_DataSetupTime = 2;
    timing.FSMC_BusTurnAroundDuration = 0;
    timing.FSMC_CLKDivision = 0;
    timing.FSMC_DataLatency = 0;
    timing.FSMC_AccessMode = FSMC_AccessMode_A;

    /*
     LCD configured as follow:
        - Data/Address MUX = Disable
        - Memory Type = SRAM
        - Data Width = 16bit
        - Write Operation = Enable
        - Extended Mode = Enable
        - Asynchronous Wait = Disable
    */
    init.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
//    init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;    /* 注意旧库无这个成员 */
    init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    init.FSMC_WrapMode = FSMC_WrapMode_Disable;
    init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

    init.FSMC_ReadWriteTimingStruct = &timing;
    init.FSMC_WriteTimingStruct = &timing;

    FSMC_NORSRAMInit(&init);

    /* - BANK 3 (of NOR/SRAM Bank 1~4) is enabled */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}


/*
*********************************************************************************************************
*    函 数 名: RA8875_InitHard
*    功能说明: 初始化RA8875驱动芯片
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/

void RA8875_InitHard(void)
{
    uint8_t ucGPIX;

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

    //Add by Luoxingxing
    LCD_CtrlLinesConfig();
    LCD_FSMCConfig();

    Delay_Ms(20);


//    ucGPIX = RA8875_ReadReg(0xC7);

//    if (ucGPIX == 1)    /*     GPIX = 1 表示 4.3 寸屏 480x272 */
    {
        /* 初始化PLL.  晶振频率为25M */
        RA8875_REG = 0x88;
        RA8875_Delaly1us();        /* 延迟1us */
        RA8875_RAM = 10;          /* PLLDIVM [7] = 0 ;  PLLDIVN [4:0] = 10 */

        RA8875_Delaly1ms();

        RA8875_REG = 0x89;
        RA8875_Delaly1us();        /* 延迟1us */
        RA8875_RAM = 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, 0x82);    /* 设置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);    /* 选择绘图模式 */


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

    RA8875_SetDispWin(0, 0, LCD_43_HEIGHT, LCD_43_WIDTH);

    /* 设置单图层,水平扫描方向,垂直扫描方向 */
    RA8875_REG = 0x20;
    RA8875_RAM = 0x00;

    RA8875_REG = 0x52;
    RA8875_REG = 0x00;        
}
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-6 03:21:10 | 显示全部楼层
还有这个修改
#define RA8875_REG    *(__IO uint16_t *)(0x60000000)
#define RA8875_RAM    *(__IO uint16_t *)(0x60020000)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-6 09:56:23 | 显示全部楼层
你的背光是不是还没有初始化呢。
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-6 10:56:33 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的背光是不是还没有初始化呢。 (2016-03-06 09:56) 
背光不是RA8875控制的吗?我用的是安富莱二代的屏
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-6 13:05:31 | 显示全部楼层

回 cingcing 的帖子

cingcing:背光不是RA8875控制的吗?我用的是安富莱二代的屏 (2016-03-06 10:56)
1. 是的,初始化了没有?
2. 另外为什么把这个注释掉呢?//    init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    出于什么考虑,这个不能注释掉。
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-6 17:47:23 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 是的,初始化了没有?
2. 另外为什么把这个注释掉呢?//    init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    出于什么考虑,这个不能注释掉。
 (2016-03-06 13:05) 
这句后来加上了。
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-6 18:59:02 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 是的,初始化了没有?
2. 另外为什么把这个注释掉呢?//    init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    出于什么考虑,这个不能注释掉。
 (2016-03-06 13:05) 
我重新移植了一遍代码,加上背光后点亮了,但是我想修改为RS<==>A16,请问RA8875_BASE地址该怎么设置,我修改为:
#define RA8875_BASE        ((uint32_t)(0x60020000))    //A16
好像不行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-6 22:02:40 | 显示全部楼层

回 cingcing 的帖子

cingcing:

我重新移植了一遍代码,加上背光后点亮了,但是我想修改为RS<==>A16,请问RA8875_BASE地址该怎么设置,我修改为:
#define RA8875_BASE        ((uint32_t)(0x60020000))    //A16
好像不行。
是这个:
#define RA8875_REG        *(__IO uint16_t *)(0x60000000 +  (1 << (16 + 1)))    /* FSMC 16位总线模式下,FSMC_A16口线对应物理地址A17 */
#define RA8875_RAM        *(__IO uint16_t *)(0x60000000)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-6 22:10:44 | 显示全部楼层
对了你的这个延迟是怎么实现的,这个延迟时间要够,要不会出问题。 Delay_Ms(20);
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-6 22:33:54 | 显示全部楼层

回 eric2013 的帖子

eric2013:对了你的这个延迟是怎么实现的,这个延迟时间要够,要不会出问题。 Delay_Ms(20); (2016-03-06 22:10) 
void Delay_Ms(u16 myMs)
{
  u16 i;
  while(myMs--)
  {
    i=7200;
    while(i--);
  }
}

已经OK了,多谢!
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-7 00:10:30 | 显示全部楼层

回 eric2013 的帖子

eric2013:对了你的这个延迟是怎么实现的,这个延迟时间要够,要不会出问题。 Delay_Ms(20); (2016-03-06 22:10) 
我在移植emwin 5.22的时候,LCD初始化正常,但是无法显示数据,估计是移植得有点问题
RS接A16:
模仿别人的代码写的:
//方便emWin使用
#define         em_RA8875_REG                *(__IO uint16_t *)(0x60000000)
#define         em_RA8875_RAM                *(__IO uint16_t *)(0x60020000)

static void LcdWriteData(U16 Data) {
  // ... TBD by user
    em_RA8875_RAM = Data;
}

static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
      em_RA8875_RAM = *pData++;
  }
}

static void LcdReadDataMultiple(U16 * pData, int NumItems) {
               
  while (NumItems--) {
    // ... TBD by user
      *pData++ = em_RA8875_RAM;
  }
}

void LCD_X_Config(void) {
  GUI_DEVICE * pDevice;
  CONFIG_FLEXCOLOR Config = {0};
  GUI_PORT_API PortAPI = {0};
  //
  // Set display driver and color conversion
  //
  pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
  //
  // Display driver configuration, required for Lin-driver
  //
  LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
  //
  // Orientation
  //
//  Config.FirstCOM = 0;                                       
//  Config.FirstSEG = 0;                                          
//  Config.Orientation = GUI_MIRROR_Y|GUI_MIRROR_X;                           
  Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;                     
//  Config.NumDummyReads = 1;                                   
  GUIDRV_FlexColor_Config(pDevice, &Config);
  //
  // Set controller and operation mode
  //
  PortAPI.pfWrite16_A0  = LcdWriteReg;
  PortAPI.pfWrite16_A1  = LcdWriteData;
  PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
  PortAPI.pfReadM16_A1  = LcdReadDataMultiple;
//  GUIDRV_FlexColor_SetFunc(pDevice, &amportAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);        //modify by fire ԭGUIDRV_FLEXCOLOR_F66708
    GUIDRV_FlexColor_SetFunc(pDevice, &amportAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-7 00:28:07 | 显示全部楼层

回 cingcing 的帖子

cingcing:我在移植emwin 5.22的时候,LCD初始化正常,但是无法显示数据,估计是移植得有点问题
RS接A16:
模仿别人的代码写的:
//方便emWin使用
....... (2016-03-07 00:10) 
针对RA8875,我们没有用官方的移植方法,一直用的通用移植方法。官方的移植方法,参考下这个帖子:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=5910
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-7 10:24:25 | 显示全部楼层

回 eric2013 的帖子

eric2013:针对RA8875,我们没有用官方的移植方法,一直用的通用移植方法。官方的移植方法,参考下这个帖子:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=5910 (2016-03-07 00:28) 
这样啊,有通用移植方法相关的帖子吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107374
QQ
发表于 2016-3-7 10:26:49 | 显示全部楼层

回 cingcing 的帖子

cingcing:这样啊,有通用移植方法相关的帖子吗? (2016-03-07 10:24) 
教程是前年做的了,其中移植部分供参考:http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932

现在移植方案已经升级了好几个版本了,你用的是F1的话,具体参考我们V4板子的emWin例子即可
论坛置顶帖子里面有这个教程配套的例子。
回复

使用道具 举报

10

主题

51

回帖

10

积分

初级会员

积分
10
 楼主| 发表于 2016-3-8 01:26:12 | 显示全部楼层

回 eric2013 的帖子

eric2013:教程是前年做的了,其中移植部分供参考:http://www.armbbs.cn/forum.php?mod=viewthread&tid=2932

现在移植方案已经升级了好几个版本了,你用的是F1的话,具体参考我们V4板子的emWin例子即可
论坛置顶帖子里面有这个教程配套的例子。
....... (2016-03-07 10:26) 
有时间能弄一个官方的移植方法吗,我的移植好几天了,各种问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-28 19:48 , Processed in 0.344203 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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