|
调了几天的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); //修改比较值,修改占空比
}
求群主帮忙看看,感觉都没错啊,但是屏一直点不亮? |
|