|
在做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;
} |
|