STM32F103VE FSMC ILI9488TFT 能读到ID但是不管如何操作都是一片白

myrelativity 2020-10-11 01:44:18
厂家的程序和正点原子的程序都改了,使用A18地址线,FSMC_bank1驱动,另外我增加了1个LCD屏幕电源芯片,用于单独管理屏幕功耗。
不管如何操作写入D3名返回ID9488 这是正常的 然后初始化了一堆代码 最后设置屏幕位蓝色,但是实际没有任何反应。一片白茫茫,求助大神姥爷帮忙,我吧工程和原理图放到附件中了。
调了4天了,脸都绿了,是在是搞不明白了,焊接上肯定没问题,老拖焊手不是白练的。

void LCD_Init(void)
{
u16 i;

GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
FSMC_NORSRAMTimingInitTypeDef writeTiming;

RCC->AHBENR|=1<<8; //??FSMC??
RCC->APB2ENR|=1<<0; //??PORTB??
RCC->APB2ENR|=1<<3; //??PORTB??
RCC->APB2ENR|=1<<5; //??PORTD??
RCC->APB2ENR|=1<<6; //??PORTE??

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); //使能FSMC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE|RCC_APB2Periph_AFIO);//使能PORTB,D,E,G以及AFIO复用功能时钟


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB0 推挽输出 背光
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

//PORTD复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

//PORTE复用推挽输出
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; // //PORTD复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);

// // //PORTG12复用推挽输出 A0
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; // //PORTD复用推挽输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOG, &GPIO_InitStructure);

readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0xf; // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A


writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK
writeTiming.FSMC_AddressHoldTime = 0x0; //地址保持时间(A
writeTiming.FSMC_DataSetupTime = 0x3; ////数据保存时间为4个HCLK
writeTiming.FSMC_BusTurnAroundDuration = 0x00;
writeTiming.FSMC_CLKDivision = 0x00;
writeTiming.FSMC_DataLatency = 0x00;
writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A


FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_LCD_BACKx;// 这里我们使用NE4 ,也就对应BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置

FSMC_NORSRAMCmd(FSMC_LCD_BACKx, ENABLE); // 使能BANK1

LCD_EN=1;//开启TFT电源
LCD_LED=1; //点亮背光
LCD_RESET=1; //复位引脚
delay_ms(5); // delay 5 ms
LCD_RESET=0; //复位
delay_ms(200); // delay 50 ms
LCD_RESET=1; //复位完成
delay_ms(300); // delay 50 ms
LCD_WriteReg(0x0000,0x0001);

// if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
// {
//尝试9341 ID的读取
LCD_WR_REG(0XD3);
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读到0X00
lcddev.id=LCD_RD_DATA(); //读取93 或者94
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读取41 或者86或者88
// }

// printf(" LCD ID:%x\r\n",lcddev.id); //打印LCD ID
// LCD_WR_REG( 0x11 );
// delay_ms( 120 );
// LCD_WR_REG( 0x29 ); /* Display ON (29h) */


LCD_WR_REG( 0XF7 );
LCD_WR_DATA( 0xA9 );
LCD_WR_DATA( 0x51 );
LCD_WR_DATA( 0x2C );
LCD_WR_DATA( 0x82 ); /* DSI write DCS command, use loose packet RGB 666 */

/* Power Control 1 (C0h) */
LCD_WR_REG( 0xC0 );
LCD_WR_DATA( 0x11 );
LCD_WR_DATA( 0x09 );

/* Power Control 2 (C1h) */
LCD_WR_REG( 0xC1 );
LCD_WR_DATA( 0x41 );

/* VCOM Control (C5h) */
LCD_WR_REG( 0XC5 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x80 );

/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
LCD_WR_REG( 0xB1 );
LCD_WR_DATA( 0xB0 );
LCD_WR_DATA( 0x11 );

/* Display Inversion Control (B4h) */
LCD_WR_REG( 0xB4 );
LCD_WR_DATA( 0x02 );

/* Display Function Control (B6h) */
LCD_WR_REG( 0xB6 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x22 );

/* Entry Mode Set (B7h) */
LCD_WR_REG( 0xB7 );
LCD_WR_DATA( 0xc6 );

/* HS Lanes Control (BEh) */
LCD_WR_REG( 0xBE );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x04 );

/* Set Image Function (E9h) */
LCD_WR_REG( 0xE9 );
LCD_WR_DATA( 0x00 );

LCD_WR_REG( 0x36 );
LCD_WR_DATA( 0x08 );

/* Interface Pixel Format (3Ah) */
LCD_WR_REG( 0x3A );
LCD_WR_DATA( 0x55 ); /* 0x55 : 16 bits/pixel */

/* PGAMCTRL (Positive Gamma Control) (E0h) */
LCD_WR_REG( 0xE0 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x07 );
LCD_WR_DATA( 0x10 );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x0B );
LCD_WR_DATA( 0x41 );
LCD_WR_DATA( 0x89 );
LCD_WR_DATA( 0x4B );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x0C );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x18 );
LCD_WR_DATA( 0x1B );
LCD_WR_DATA( 0x0F );

/* NGAMCTRL (Negative Gamma Control) (E1h) */
LCD_WR_REG( 0XE1 );
LCD_WR_DATA( 0x00 );
LCD_WR_DATA( 0x17 );
LCD_WR_DATA( 0x1A );
LCD_WR_DATA( 0x04 );
LCD_WR_DATA( 0x0E );
LCD_WR_DATA( 0x06 );
LCD_WR_DATA( 0x2F );
LCD_WR_DATA( 0x45 );
LCD_WR_DATA( 0x43 );
LCD_WR_DATA( 0x02 );
LCD_WR_DATA( 0x0A );
LCD_WR_DATA( 0x09 );
LCD_WR_DATA( 0x32 );
LCD_WR_DATA( 0x36 );
LCD_WR_DATA( 0x0F );

LCD_WR_REG(0x11);
delay_ms(120);
LCD_WR_REG(0x29);
LCD_Display_Dir(0); //默认为竖屏
LCD_Clear(BLUE);//显示蓝色背景
// LCD_Fill(0,0,200,200,BLUE);

}
L

头文件如下
//LCD重要参数集
typedef struct
{
u16 width; //LCD 宽度
u16 height; //LCD 高度
u16 id; //LCD ID
u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
u16 wramcmd; //开始写gram指令
u16 setxcmd; //设置x坐标指令
u16 setycmd; //设置y坐标指令
}_lcd_dev;

//LCD参数
extern _lcd_dev lcddev; //管理LCD重要参数
//LCD的画笔颜色和背景色
extern u16 POINT_COLOR;//默认红色
extern u16 BACK_COLOR; //背景颜色.默认为白色
#define FSMC_LCD_BACKx FSMC_Bank1_NORSRAM1
//////////////////////////////////////////////////////////////////////////////////
//-----------------LCD端口定义----------------
#define LCD_LED PAout(8) //LCD背光 PB0
#define LCD_EN PAout(12) //LCD背光 PB0
#define LCD_RESET PDout(3) //LCD背光 PB0
#define LCD_DCX PDout(13) //LCD背光 PB0
#define LCD_CS PDout(13) //LCD背光 PB0
//LCD地址结构体
typedef struct
{
vu16 LCD_REG;
vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线
//注意设置时STM32内部会右移一位对其!
#define LCD_BASE ((u32)(0x60000000 | 0x0007FFFE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
//////////////////////////////////////////////////////////////////////////////////

//扫描方向定义
#define L2R_U2D 0 //从左到右,从上到下
#define L2R_D2U 1 //从左到右,从下到上
#define R2L_U2D 2 //从右到左,从上到下
#define R2L_D2U 3 //从右到左,从下到上

#define U2D_L2R 4 //从上到下,从左到右
#define U2D_R2L 5 //从上到下,从右到左
#define D2U_L2R 6 //从下到上,从左到右
#define D2U_R2L 7 //从下到上,从右到左

#define DFT_SCAN_DIR L2R_U2D //默认的扫描方向

//画笔颜色
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
//GUI颜色

#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
//以上三色为PANEL的颜色

#define LIGHTGREEN 0X841F //浅绿色
//#define LIGHTGRAY 0XEF5B //浅灰色(PANNEL)
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)
void LCD_WR_DATA(u16 data);
void LCD_WR_REG(u16 regval);
void LCD_Init(void); //初始化
...全文
13057 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ldmf 2022-10-21
  • 打赏
  • 举报
回复

Hi 楼主,我使用https://github.com/RobertoBenjami/stm32_graphics_display_drivers 中的STM32F407VET6 FSMC16 ILI9488,能够正常显示,但是竖屏是从右上角开始显示的,并且如果显示字符,也是反着的。想问一下你的LCD_Display_Dir这个里面是如何配置的?我有尝试去设置0x36寄存器,但是也不能正确的从左上角显示。

TheOne_99 2022-04-09
  • 打赏
  • 举报
回复 1

ID都读对了,怎么D0和D1会反呢?

myrelativity 2021-10-07
  • 打赏
  • 举报
回复

一年了,这么长的时间忘记结束了,这个事情解决了,是FSMC_D0 D1搞错顺序了

ssxcfffff 2020-11-12
  • 打赏
  • 举报
回复
请问问题解决了吗?
myrelativity 2021-10-07
  • 举报
回复
@ssxcfffff 这个事情解决了,是FSMC_D0 D1搞错顺序了
myrelativity 2020-10-12
  • 打赏
  • 举报
回复
如何回读,直接读取吗?像读取ID那样?
myrelativity 2020-10-12
  • 打赏
  • 举报
回复
引用 5 楼 yoveldf 的回复:
引用 3 楼 myrelativity 的回复:
如何回读,直接读取吗?像读取ID那样?
就像iic读写一样,你写进去了 还可以读出来这个寄存器值,你的这个不清楚是哪种通讯方式?点屏 初始化参数 时序 供电 就这么几个
听大神的有饭吃 马上试试 真是奇怪了
myrelativity 2020-10-12
  • 打赏
  • 举报
回复
引用 4 楼 Lenged_Zhao 的回复:
屏幕供电电源有没有问题,是不是电源设计提供不了那么大的电流
也有可能 RT9193芯片 按常理说100MA没问题 我找个别的3.3V 飞线过来尝试一下 改了好多代码了 FSMC玩的很溜了 没测试线序 示波器看了 读、写口 命令数据口 CS使能口 复位口都有动作 除了复位 其他都有脉冲发出来
yoveldf 2020-10-12
  • 打赏
  • 举报
回复
引用 3 楼 myrelativity 的回复:
如何回读,直接读取吗?像读取ID那样?
就像iic读写一样,你写进去了 还可以读出来这个寄存器值,你的这个不清楚是哪种通讯方式?点屏 初始化参数 时序 供电 就这么几个
Lenged_Zhao 2020-10-12
  • 打赏
  • 举报
回复
屏幕供电电源有没有问题,是不是电源设计提供不了那么大的电流
yoveldf 2020-10-11
  • 打赏
  • 举报
回复
初始化参数都有写进去吗?回读看下!另外 确保屏供电都正常!还有就是屏是否有个测试模式 看能否进入测试模式验证下
myrelativity 2020-10-11
  • 打赏
  • 举报
回复
自己顶自己个肺吧

27,508

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧