硬汉嵌入式论坛

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

[有问必答] RA8875的屏一直点不亮,硬汉哥帮忙看看

[复制链接]

35

主题

80

回帖

185

积分

初级会员

积分
185
发表于 2017-3-9 10:48:19 | 显示全部楼层 |阅读模式
调了几天的RA8875还是不见点亮;附上LCD接线图跟代码,请群主帮忙看下;
硬件主板接口图:



这个是RA8875的接口图:
其中

由于用的是8080模式;

SPI3_MISO\SPI3_MOSI\SPI3_SCK\ TP_INIT\TP_NCS\LCD_PWM都没有接;

由于硬件地址接口为A6,采用bank4

#define RA8875_BASE        ((uint32_t)(0x6C000000))  //用的是bank1,NE4   A6  所以就是0x6C000000+A6 的偏移量

#define RA8875_REG          *(__IO uint16_t *)(RA8875_BASE +(1<<7))
#define RA8875_RAM              *(__IO uint16_t *)(RA8875_BASE)




配置RA8875屏的代码如下:

配置GPIO口跟FSMC代码;

static void LCD_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;      //定义GPIO初始化结构体
    FSMC_NORSRAMInitTypeDef  init;

    FSMC_NORSRAMTimingInitTypeDef  timingWrite;
    FSMC_NORSRAMTimingInitTypeDef  timingRead;
     
    /* 使能FSMC的AHB3时钟,这里注意,不同芯片总线会不同 */
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);   
    /* 使能GPIOB,GPIOD,GPIOE的AHB1时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE |
                           RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG , ENABLE);


    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_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  


    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);//PE7~15,AF OUT
                                    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  

   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PF12,FSMC_A6
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;    //Pg12,FSMC_A6
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

    GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12

    GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12

    GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
    GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);//PG12,AF12

    //delay_ms(10);

    /*-- FSMC Configuration ------------------------------------------------------*/
    /*----------------------- SRAM Bank 4 ----------------------------------------*/
    /* FSMC_Bank1_NORSRAM4 configuration */
    /* 摄像头DMA麻点,需设置 4 0 5 2 0 0 */
    timingWrite.FSMC_AddressSetupTime = 4;                                           //地址建立时间
      timingWrite.FSMC_AddressHoldTime = 0;                                            //地址保持时间
      timingWrite.FSMC_DataSetupTime = 6;                                              //数据建立时间
      timingWrite.FSMC_BusTurnAroundDuration = 1;
      timingWrite.FSMC_CLKDivision = 0;
      timingWrite.FSMC_DataLatency = 0;
    timingWrite.FSMC_AccessMode = FSMC_AccessMode_A;
   
    timingRead.FSMC_AddressSetupTime = 4;                                           //地址建立时间
      timingRead.FSMC_AddressHoldTime = 0;                                            //地址保持时间
      timingRead.FSMC_DataSetupTime = 8;                                              //数据建立时间
      timingRead.FSMC_BusTurnAroundDuration = 1;
      timingRead.FSMC_CLKDivision = 0;
      timingRead.FSMC_DataLatency = 0;
    timingRead.FSMC_AccessMode = FSMC_AccessMode_A;
     
    init.FSMC_Bank = FSMC_Bank1_NORSRAM4;
    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_Enable;
    init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    init.FSMC_ReadWriteTimingStruct = &timingWrite;
    init.FSMC_WriteTimingStruct = &timingRead;

    FSMC_NORSRAMInit(&init);
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}

此部分代码为RA8875的初始化;
void RA8875_InitHard(void)
{
//    g_LcdHeight = LCD_70_HEIGHT;
//    g_LcdWidth = LCD_70_WIDTH;
    u16 lcd_id = 0;
    u8 value = 0;
   
    LCD_Reset();
    LCD_GPIO_Config();   
    //LCD_Mode8080();
    //GPIO_AF_FSMC_Config();   
    //LCD_FSMC_Config();

    delay_ms(50);
    LCD_Reset();
   
    lcd_id = ReadLcdID();
    printf("lcd id = [0x%4x]\r\n",lcd_id);
   
   
    /* 初始化PLL.  晶振频率为25M */
    RA8875_WriteCmd(0x88);
    RA8875_Delaly1us();    /* 延迟1us */
    RA8875_WriteData(11);    /* PLLDIVM [7] = 0 ;  PLLDIVN [4:0] = 12 */
    RA8875_Delaly1ms();

    value = RA8875_ReadData(0x88);
    printf("value1 = [0x%x]\r\n",value);

    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 * (11 + 1) / ((0 + 1) * (2 ^ 2))
                  = 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, 0x81);
    RA8875_Delaly1ms();
    RA8875_WriteReg(0x14, 0x63);
    RA8875_WriteReg(0x15, 0x00);
    RA8875_WriteReg(0x16, 0x03);
    RA8875_WriteReg(0x17, 0x03);
    RA8875_WriteReg(0x18, 0x0B);
    RA8875_WriteReg(0x19, 0xDF);
    RA8875_WriteReg(0x1A, 0x01);
    RA8875_WriteReg(0x1B, 0x1F);
    RA8875_WriteReg(0x1C, 0x00);
    RA8875_WriteReg(0x1D, 0x16);
    RA8875_WriteReg(0x1E, 0x00);
    RA8875_WriteReg(0x1F, 0x01);

    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_WriteReg(0x13, 0x01);  // 原理图TN92 的屏 上下左右显示用8875 输出的四个按键控制了,所以这里相应的设置一下,如果用到按键可能有冲突

    RA8875_SetDispWin(0, 0, 480, 800);
   
    RA8875_DispOn();

}

主函数代码:
int main(void)
{
    u16 led0pwmval=0;
    u16 value = 0;
    u8 dir=1;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
    uart_init(115200);//初始化串口波特率为115200
     TIM14_PWM_Init(500-1,84-1);    //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.   
    RA8875_InitHard();
    RA8875_SetBackLight(255);
   
     value = ReadLcdID();
     printf("value = [0x%x]\r\n",value);
// LCD_Reset();
  // RA8875_ClrScr(CL_WHITE);
   
  while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
    {
         delay_ms(10);     
        if(dir)led0pwmval++;//dir==1 led0pwmval递增
        else led0pwmval--;    //dir==0 led0pwmval递减
         if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
        if(led0pwmval==0)dir=1;    //led0pwmval递减到0后,方向改为递增

        TIM_SetCompare1(TIM14,led0pwmval);    //修改比较值,修改占空比
    }


求群主帮忙看看,感觉都没错啊,但是屏一直点不亮?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-3-9 10:52:07 | 显示全部楼层
1. ID读取正确了没有。
2. 如果是用的我们的显示屏,看下显示屏的背面,有个8080和SPI接口切换的按键,将其拨到8080端。
回复

使用道具 举报

35

主题

80

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2017-3-9 11:08:35 | 显示全部楼层
是用你们的屏,并且开关是拨动到8080这边,难道屏坏了?
回复

使用道具 举报

35

主题

80

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2017-3-9 11:10:04 | 显示全部楼层
ID读取也不正确,但是FSMC配置函数都正确的,代码如上传的,
回复

使用道具 举报

35

主题

80

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2017-3-9 11:29:50 | 显示全部楼层
另外我发V5开发板的程序;定义

#define RA8875_BASE        ((uint32_t)(0x6C000000))

    #define RA8875_RAM      *(__IO uint16_t *)(RA8875_BASE +  (1 << (18 + 1)))    /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */
    #define RA8875_REG        *(__IO uint16_t *)(RA8875_BASE)

    #define RA8875_RAM_ADDR        RA8875_BASE

这个跟我理解的不对,RA8875_RAM是用来传输数据的,但是定义的地址线A18却拉高,即RS =1 ,那传输的代表的就是地址,而不是数据;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2017-3-9 12:22:31 | 显示全部楼层

回 东北f4 的帖子

东北f4:另外我发V5开发板的程序;定义

#define RA8875_BASE        ((uint32_t)(0x6C000000))

    #define RA8875_RAM      *(__IO uint16_t *)(RA8875_BASE +  (1 << (18 .. (2017-03-09 11:29) 
RA8875这个寄存器和RAM地址跟ili9488等这类屏是反着的。
回复

使用道具 举报

35

主题

80

回帖

185

积分

初级会员

积分
185
 楼主| 发表于 2017-3-9 15:45:44 | 显示全部楼层
已经成功点亮RA8875;
硬件工程师重新帮我接了一下线,能点亮了;

另外软件上将V5定义的数据#define RA8875_BASE        ((uint32_t)(0x6C000000))

    #define RA8875_RAM      *(__IO uint16_t *)(RA8875_BASE +  (1 << (18 + 1)))    /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */
    #define RA8875_REG        *(__IO uint16_t *)(RA8875_BASE)

更改为:
  #define RA8875_BASE        ((uint32_t)(0x6C000000))  //用的是bank1,NE4   A6  所以就是0x6C000000+A6 的偏移量

#define RA8875_REG               *(__IO uint16_t *)(RA8875_BASE + (1<<7))
#define RA8875_RAM        *(__IO uint16_t *)(RA8875_BASE)


  查看了RA8875的数据手册:关于RS的定义
11.png


RS = 0 时写数据; 1时写入命令;
回复

使用道具 举报

9

主题

28

回帖

55

积分

初级会员

积分
55
发表于 2023-9-12 20:56:38 | 显示全部楼层
东北f4 发表于 2017-3-9 15:45
已经成功点亮RA8875;
硬件工程师重新帮我接了一下线,能点亮了;

点不亮最后是因为接线的原因吗老哥
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 22:34 , Processed in 0.317236 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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