硬汉嵌入式论坛

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

[有问必答] 有做RA8875 FSMC驱动的请帮忙看下

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2013-10-19 21:01:27 | 显示全部楼层 |阅读模式
在做RA8875驱动时遇到了两个问题:
1:读取状态寄存器时值总为0
2:读指定像素点时值时总为0

有遇到的请指教。。。。。。。。。。
注:显示、清屏、写汉字都正常。

代码如下:

#define RA8875_BASE        ((u32)(0x68000000 | 0x00000000))           /*NE3*/

#define RA8875_cmd        *(vu16 *)(RA8875_BASE + (1 << ( 17 + 1 )) )
#define RA8875_dat        *(vu16 *)(RA8875_BASE )

/*************************************************************************************************************
*函数名:LCD_GPIO_Config                                                                                    
*描述  :配置LCD用到的I/O口                                                                                    
* | D0   | D1   | D2   | D3  | D4  | D5  | D6  | D7   | D8    | D9  |D10  |D11  |D12  |D13 |D14  |D15  |NOE/RD|NEW/WR| RS   | CS |     
* |PD14|PD15| PD0| PD1|    PE7| PE8| PE9|PE10|PE11|PE12|PE13|PE14|PE15|PD8 |PD9 |PD10|  PD4     | PD5      |PD12|PG10|                                                         
*************************************************************************************************************/

void RA8875_GPIO_Config(void)
{   
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
   
/*初始化GPIO-D引脚:*/                                                               
      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_12|
    /*选择要控制的GPIO引脚*/         GPIO_Pin_14| GPIO_Pin_15 ;        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //设置引脚模式为复用推挽输出   
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //设置引脚速率为50MHz        
      GPIO_Init(GPIOD, &GPIO_InitStructure);//调用库函数,初始化GPIO         

/*初始化GPIO-E引脚:*/                                                               
      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引脚*/         GPIO_Pin_15 ;            
      GPIO_Init(GPIOE, &GPIO_InitStructure);  //调用库函数,初始化GPIO

/*初始化GPIO-G引脚:*/                                                               
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                   
      GPIO_Init(GPIOG, &GPIO_InitStructure);      //调用库函数,初始化GPIO
}


void RA8875_FSMC_Config(void)
{
    FSMC_NORSRAMInitTypeDef  A;       //结构体变量。
    FSMC_NORSRAMTimingInitTypeDef  B; //结构体变量。
   
    B.FSMC_AddressSetupTime      = 1;                 //地址建立时间
    B.FSMC_AddressHoldTime        = 0;                 //地址保持时间
    B.FSMC_DataSetupTime           = 2;             //数据建立时间
    B.FSMC_BusTurnAroundDuration = 0;                //总线恢复时间
    B.FSMC_CLKDivision              = 0;                    //时钟分频
    B.FSMC_DataLatency             = 0;                   //数据保持时间
    B.FSMC_AccessMode             = FSMC_AccessMode_A;//在地址\数据线不复用的情况下ABCD模式区别不大。
   
    A.FSMC_Bank                           = FSMC_Bank1_NORSRAM3;                      //NOR FLASH 的Bank 1
    A.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;               //数据线与地址线不复用。
    A.FSMC_MemoryType              = FSMC_MemoryType_SRAM;
    A.FSMC_MemoryDataWidth      = FSMC_MemoryDataWidth_16b;                  //数据宽度为16位。
    A.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;            //使用异步写模式,禁止突发模式
    A.FSMC_WaitSignalPolarity      = FSMC_WaitSignalPolarity_Low;                  //本成员的配置只在突发模式下有效,等待信号极性为低。
    A.FSMC_WrapMode                 = FSMC_WrapMode_Disable;                        //禁止非对齐突发模式
    A.FSMC_WaitSignalActive        = FSMC_WaitSignalActive_BeforeWaitState; //本成员配置仅在突发模式下有效。NWAIT信号在什么时期产生
    A.FSMC_WriteOperation          = FSMC_WriteOperation_Enable;                   //写使能
    A.FSMC_WaitSignal                 = FSMC_WaitSignal_Disable;                        //本成员的配置只在突发模式下有效,禁用NWAIT信号
    A.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;                 //禁止扩展模式,扩展模式可以使用独立的读、写模式
    A.FSMC_WriteBurst                 = FSMC_WriteBurst_Disable;                       //禁止突发写操作
    A.FSMC_ReadWriteTimingStruct = &B;    //配置读写时序
    A.FSMC_WriteTimingStruct         = &B;     //配置写时序
   
    FSMC_NORSRAMInit(&A);  
   
    /* 使能 FSMC Bank1_SRAM Bank */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
}
//写寄存器

void RA8875_WriteDat(u8 Addr, u8 Value)
{
    RA8875_cmd = Addr;    /* 设置寄存器地址 */
    RA8875_dat = Value;    /* 写入寄存器值   */
}
// 读寄存器

u8 RA8875_ReadDat(u8 Addr)
{
    u8 value;

    RA8875_cmd = Addr;    /* 设置寄存器地址 */

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

    return value;
}
//读状态寄存器

u8 RA8875_ReadSta(void)
{
    u8 Data;
    Data = RA8875_cmd;
    return Data;
}

void RA8875_Init(void)
{
/**********************************端口初始化**************************************************/

    RA8875_GPIO_Config();            //GPIO初始化。
    RA8875_FSMC_Config();    //FSMC初始化。

       delay_ms(20);  //延时20ms(FSMC初始化后必须先延时后才能使用。)

    RA8875_WriteDat(0x88, 12);      //PLLC1
    delay_ms(1);
    RA8875_WriteDat(0x89,  2);      //PLLC2
    delay_ms(1);
     
    RA8875_WriteDat(0x10, (1 <<3 ) | (1 << 1));    /* 配置16位MCU并口,65K色 (SYSR) */   
        
    RA8875_WriteDat(0x04, 0x81);     //PCSR
    delay_ms(1);

/***********************水平显示设置集-中文pdf 第19页起:******************************************/

    RA8875_WriteDat(0x14, 0x63);  //水平显示区域宽度设定位            [6:0] (HDWR)
    RA8875_WriteDat(0x15, 0x00);  //水平非显示期间微调宽度设定位 [3:0] (HNDFT)   
                                                       //DE 信号的极性                      [7]
    RA8875_WriteDat(0x16, 0x03);  //水平非显示期间宽度设定位        [4:0] (HNDP)
    RA8875_WriteDat(0x17, 0x03);  //水平同步信号 (HSYNC) 起始地址宽度设定位[4:0]  (HSTR)
    RA8875_WriteDat(0x18, 0x0B);  //水平同步信号 (HSYNC) 脉波宽度设定位      [4:0]  (HPWR)
                                    //HSYNC 动作准位                                          [7]

/***********************垂直显示设置集-中文pdf 第20页起:******************************************/

    RA8875_WriteDat(0x19, 0xDF);  //垂直显示区域高度设定位     [7:0]  (VDHR0)
    RA8875_WriteDat(0x1A, 0x01);  //垂直显示区域高度设定位     [8]    (VDHR1)
    RA8875_WriteDat(0x1B, 0x1F);  //垂直非显示期间设定位        [7:0]  (VNDR0)
    RA8875_WriteDat(0x1C, 0x00);  //垂直非显示区域期间设定位 [8]    (VNDR1)
    RA8875_WriteDat(0x1D, 0x16);  //垂直同步信号 (VSYNC) 起始地址高度设定位 [7:0]  (VSTR0)
    RA8875_WriteDat(0x1E, 0x00);  //垂直同步信号 (VSYNC) 起始地址设定位        [8]    (VSTR1)
    RA8875_WriteDat(0x1F, 0x01);  //VSYNC 脉波宽度                                           [6:0]  (VPWR)
                               //VSYNC 动作准位                        [7]

/***********************工作窗口的设定-中文pdf 第27页起:******************************************/

    RA8875_WriteDat(0x30, 0x00);  //工作窗口的水平起始点[7:0]  (HSAW0)
        RA8875_WriteDat(0x31, 0x00);  //工作窗口的水平起始点[9:8]  (HSAW1)
    RA8875_WriteDat(0x32, 0x00);  //工作窗口的垂直起始点[7:0]  (VSAW0)
        RA8875_WriteDat(0x33, 0x00);  //工作窗口的垂直起始点[8]       (VSAW1)
          /***可参考中文pdf 第28页:( 图 5-3 : 工作窗口 )***/
    RA8875_WriteDat(0x34, 0x1F);  //工作窗口的水平结束点[7:0]  (HEAW0)
        RA8875_WriteDat(0x35, 0x03);  //工作窗口的水平结束点[9:8]  (HEAW1)
    RA8875_WriteDat(0x36, 0xDF);  //工作窗口的垂直结束点[7:0]  (VEAW0)
        RA8875_WriteDat(0x37, 0x01);  //工作窗口的垂直结束点[8]    (VEAW1)
        
/********************************  TFTAT070TN94 显示设置  ****************************************
**************************************************************************************************
选择扫描方向:          LR            UD        说明:
                         0             1             :从上到下,从左到右。
                         1             0             :从下到上,从右到左。
                         0             0             :从上到下,从右到左。
                         1             1             :从下到上,从左到右。
--------------------------------------------------------------------------------------------------
DITHB控制内部抖动的使能信号:        当DITHB =1,禁用功能。
                               当DITHB =0,启用功能。
*************************************************************************************************/

    RA8875_WriteDat(0x13, (1 <<2 ) | (1 << 1)| (0 << 0));  /*bit2: DITHB ;bit1: UD ;bit0: LR*/   

    RA8875_WriteDat(0x01, 0x80);

    RA8875_Backlight_PWM1(backlight);

    RA8875_ClrScr(BLUE);  //清屏。   
}

//读取指定位置的像素点

u16 RA8875_GetPixel(u16 X, u16 Y)
{
    u16 RGB;

       /* 设置内存读光标的坐标 */
       RA8875_WriteDat(0x4A, X);
       RA8875_WriteDat(0x4B, X >> 8);
       RA8875_WriteDat(0x4C, Y);
       RA8875_WriteDat(0x4D, Y >> 8);

    RA8875_cmd = 0x02;

    RGB = RA8875_dat;
    RGB = RA8875_dat;

    return RGB;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2013-10-19 21:13:17 | 显示全部楼层
你用的那个版本的库,查看一下FSMC驱动上面加上这个,能识别出来不,
这个好像是3.4以后的版本加上的,这个必须要有,要是没有读点会出问题的。
init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-10-19 21:16:42 | 显示全部楼层
用的是3.5的库.

加上试了下还是不行。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2013-10-19 21:17:43 | 显示全部楼层

回 18259657 的帖子

18259657:用的是3.5的库 (2013-10-19 21:16) 
把这个加上,必须加上,不加上问题一大堆。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2013-10-19 21:32:51 | 显示全部楼层
加上试了下还是不行,问下你遇上这个问题没有?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2013-10-19 21:36:54 | 显示全部楼层

回 18259657 的帖子

18259657:加上试了下还是不行,问下你遇上这个问题没有? (2013-10-19 21:32) 
不行的话,你用用我们板子上提供的驱动,我们的这个很好用。
回复

使用道具 举报

0

主题

11

回帖

0

积分

新手上路

积分
0
发表于 2014-7-6 09:52:48 | 显示全部楼层
楼主 问题 解决了吧?  我也 遇到相同的问题,,,EMWIN光标 要读 像数点  总是 对的 0,所以 光标移动 有 黑影。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2014-7-6 11:09:18 | 显示全部楼层

回 zhaxiaobian_ 的帖子

zhaxiaobian_:楼主 问题 解决了吧?  我也 遇到相同的问题,,,EMWIN光标 要读 像数点  总是 对的 0,所以 光标移动 有 黑影。。。 (2014-07-06 09:52) 
你用的什么驱动IC,一般都要读取两次的。
回复

使用道具 举报

0

主题

11

回帖

0

积分

新手上路

积分
0
发表于 2014-7-22 11:36:28 | 显示全部楼层

回 eric2013 的帖子

eric2013:你用的什么驱动IC,一般都要读取两次的。 (2014-07-06 11:09) 
R8875 ,,问题解决了  ,,8875的片选 没加 上拉~~  加上拉后正常~
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115717
QQ
发表于 2014-7-22 12:02:48 | 显示全部楼层

回 zhaxiaobian_ 的帖子

zhaxiaobian_:R8875 ,,问题解决了  ,,8875的片选 没加 上拉~~  加上拉后正常~ (2014-07-22 11:36) 
原来是这样,谢谢告知
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 20:20 , Processed in 0.354767 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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