RA8875的屏一直点不亮,硬汉哥帮忙看看
调了几天的RA8875还是不见点亮;附上LCD接线图跟代码,请群主帮忙看下;硬件主板接口图:
https://img.anfulai.cn/dz/attachment/forum/pw/Fid_25/25_13556_3e2674166925f20.png?31
这个是RA8875的接口图:
其中https://img.anfulai.cn/dz/attachment/forum/pw/Fid_25/25_13556_ea9c8f37f401983.png?193https://img.anfulai.cn/dz/attachment/forum/pw/Fid_25/25_13556_ea9c8f37f401983.png?193
由于用的是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_NORSRAMInitTypeDefinit;
FSMC_NORSRAMTimingInitTypeDeftimingWrite;
FSMC_NORSRAMTimingInitTypeDeftimingRead;
/* 使能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 = \r\n",lcd_id);
/* 初始化PLL.晶振频率为25M */
RA8875_WriteCmd(0x88);
RA8875_Delaly1us(); /* 延迟1us */
RA8875_WriteData(11); /* PLLDIVM = 0 ;PLLDIVN = 12 */
RA8875_Delaly1ms();
value = RA8875_ReadData(0x88);
printf("value1 = \r\n",value);
RA8875_Delaly1ms();
RA8875_WriteCmd(0x89);
RA8875_Delaly1us(); /* 延迟1us */
RA8875_WriteData(2); /* PLLDIVK = 2, 除以4 */
/* RA8875 的内部系统频率 (SYS_CLK) 是结合振荡电路及PLL 电路所产生,频率计算公式如下 :
SYS_CLK = FIN * ( PLLDIVN +1 ) / ((PLLDIVM+1 ) * ( 2^PLLDIVK ))
= 25M * (11 + 1) / ((0 + 1) * (2 ^ 2))
= 75MHz
*/
/* REG或REG被设定后,为保证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 Pixel Clock Setting Register (PCSR)
bit7PCLK 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 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 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 = \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. ID读取正确了没有。
2. 如果是用的我们的显示屏,看下显示屏的背面,有个8080和SPI接口切换的按键,将其拨到8080端。 是用你们的屏,并且开关是拨动到8080这边,难道屏坏了? ID读取也不正确,但是FSMC配置函数都正确的,代码如上传的, 另外我发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 ,那传输的代表的就是地址,而不是数据;
回 东北f4 的帖子
东北f4:另外我发V5开发板的程序;定义#define RA8875_BASE ((uint32_t)(0x6C000000))
#define RA8875_RAM *(__IO uint16_t *)(RA8875_BASE + (1 << (18 .. (2017-03-09 11:29) images/back.gif
RA8875这个寄存器和RAM地址跟ili9488等这类屏是反着的。 已经成功点亮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的定义
RS = 0 时写数据; 1时写入命令; 东北f4 发表于 2017-3-9 15:45
已经成功点亮RA8875;
硬件工程师重新帮我接了一下线,能点亮了;
点不亮最后是因为接线的原因吗老哥
页:
[1]