我所使用的是3.5寸电容触摸显示屏
所谓电容触摸显示屏其实是两个屏幕的叠加:

  • 显示屏,其驱动芯片为ILI9488
  • 触摸屏,其驱动芯片为FT6336

一、显示屏

首先驱动显示屏,买到屏幕之后问卖家拿到驱动程序、原理图和技术文档。
这个屏幕有七种驱动方式:

(一)MIPI-DBI Operating Mode

1、MIPI-DBI Type B

IM2 IM1 IM0 Interface Data Pin in Use
0 0 0 24-bit bus (DB_EN=1) DB [23:0]
0 0 0 18-bit bus (DB_EN=0) DB [17:0]
0 0 1 9-bit bus DB [8:0]
0 1 0 16-bit bus DB [15:0]
0 1 1 8-bit bus DB [7:0]

表一 TFT驱动方式MIPI-DBI Type B

1、MIPI-DBI Type C

IM2 IM1 IM0 Interface Data Pin in Use
1 0 1 3-line SPI SDA,SDO
1 1 1 4-line SPI SDA,SDO

表二 TFT驱动方式MIPI-DBI Type C

(二)、TFT几种接口

MCU接口所用引脚:/RES , /CS , RS(寄存器选择) , /WR , /RD , DB0 ~ DB17 (18bit)
RGB接口所用引脚:DE , VSYNC , HSYNC , PCLK , R0~R5 , G0~G5 , B0~B5 (18bit)
(RGB接口和MPU接口区别)
SPI接口所用引脚:/RST、/CS、SDO、SDI、SCL、RS

MCU模式:目前最常用的连接模式,一般是80系统(68系统已经不存在了)。数据位传输有8位,9位,16位和18位。
优点是:控制简单方便,无需时钟和同步信号。
缺点是:要耗费GRAM,所以难以做到大屏。

RGB模式:大屏采用较多的模式,数据位传输也有6位,16位和18位之分。连线一般有:VSYNC,HSYNC ,DOTCLK,VLD,ENABLE,剩下就是数据线。
它的优缺点正好和MCU模式相反。

SPI模式:相对上面接口所用线较少,但速度也相对较慢,对于小屏来说用起来方便。

这里的三线和四线SPI的区别:
三线SPI: SDI(接MOSI)、CS、SCL
四线SPI: SDI、CS、SCL、RS(data/command,用于数据还是指令)
三线SPI通过发送9位data的第1位决定该data是数据还是指令,其余的D1到D8相对应是data/command

SPI总线也是一种事实标准,它没有被任何的国际委员会承认。
有的三线SPI指的是类似半双工的SISO,即将MISO和MOSI合并为一根线;有的则是直接将片选省略(直接拉低),即不需要片选(不共享SPI总线),一直都选择这一设备。
SPI 三线与四线区别总结

(三)FSMC介绍

可变静态存储控制器FSMC是STM32系列采用的一种新型存储器扩展技术,这种控制器被设
置在芯片内部集成超过256 KB Flash并且名字后缀为xC、xD以及xE的大容量产品所特有的存储控制机制。它可以方便地控制诸如SRAM/PSRAM/NOR/NAND/ROM/PC卡等存储器,只需要将对应管脚相连,芯片内部就能处理时序逻辑问题,操作起来十分方便。
FSMC地址映射及支持的存储器类型如图所示。FSMC管理1GB的映射地址,划分为4个大小都为4x64MB的存储块Bank,每个大存储块又划分为4个64MB的子Bank即Sector。由于驱动的是屏幕,而驱动NOR/PSRAM的方式和8080接口差不多,故FSMC选择Bank1,其地址映射为0x6000 0000至0x6FFF FFFF。

图一 FSMC内存划分

下面介绍8080接口和FSMC在时序和所用引脚的相似之处,从下面图二可以看到8080接口有这几种信号线:数据/命令信号(RS)、片选信号(CS)、写数据信号(WR)、数据信号(D[17:0])、读数据信号(RD)。而从图三可以看到FSMC主要有这些信号线:区块片选信号(FSMC_NEx)、读数据信号(FSMC_NOE)、写数据信号(FSMC_NWE)、地址信号(FSMC_A[25:0])、数据信号(FSMC_D[15:0])。

图二 8080时序图

图三 FSMC时序图

对比来看这两者很相似但却并不完全相同,由于FSMC没有数据/命令信号,所以利用它的地址线充当这种信号。假如使用地址线的FSMC_A0充当数据命令信号,并且使用第一个Bank的第四个Sector即FSMC_Bank1_NORSRAM4,如表3-3所示可知需要将寄存器基地址设置为0x6C00 0000,RAM基地址就设置为0x6C00 0000+(1<<(0+1))=0x6C00 0002,简单来说寄存器基地址就为命令操作的地址,而RAM基地址就是数据操作的地址。需要注意的是由于我们选择的是16位宽度的SRAM,FSMC在设置这些地址时STM32内部会自动它们右移1位对齐,方便用户操作。

表二 FSMC地址选择

Bank1所选区 片选信号 地址范围 [27:26] [25:0]
第1区 FSMC_NE1 0X60000000~0X63FFFFFF 00 FSMC_A[25:0]
第2区 FSMC_NE2 0X64000000~0X67FFFFFF 01 FSMC_A[25:0]
第3区 FSMC_NE3 0X68000000~0X6BFFFFFF 10 FSMC_A[25:0]
第4区 FSMC_NE4 0X6C000000~0X6FFFFFFF 11 FSMC_A[25:0]

(四)FSMC配置

表三 FSMC引脚配置连接表

FSMC引脚 GPIO配置 与屏幕连接的引脚
FSMC_A0 推挽复用输出模式 LCD_DC
FSMC_D[15:0] 同上 LCD_D[15:0]
FSMC_NOE 同上 LCD_RD
FSMC_NWE 同上 LCD_WR
FSMC_NE4 同上 LCD_CS

之后需要配置FSMC_NORSRAMInitTypeDef和FSMC_NORSRAMTimingInitTypeDef结构体,代码如下:

static void LCD_FSMC_Config ( void )
{FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef  fsmc_lcd;    /* 使能FSMC时钟*/RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );fsmc_lcd.FSMC_AddressSetupTime      = 0x02;   //地址建立时间fsmc_lcd.FSMC_AddressHoldTime       = 0x00;    //地址保持时间fsmc_lcd.FSMC_DataSetupTime         = 0x05;    //数据建立时间fsmc_lcd.FSMC_BusTurnAroundDuration = 0x00;fsmc_lcd.FSMC_CLKDivision           = 0x00;fsmc_lcd.FSMC_DataLatency           = 0x00;fsmc_lcd.FSMC_AccessMode            = FSMC_AccessMode_B;   //模式B比较适用于LCDFSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_LCD_BACKx;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_NOR;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;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_Disable;FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = & fsmc_lcd;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = & fsmc_lcd;  FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure ); /* 使能 FSMC_Bank1_NORSRAM4 */FSMC_NORSRAMCmd ( FSMC_LCD_BACKx, ENABLE );
}

需要说明的是FSMC读写数据是对FSMC映射的地址进行操作的,具体宏定义如下:

#define FSMC_LCD_CMD                   ((uint32_t)0x6C000000)        //FSMC_Bank1_NORSRAM1用于LCD命令操作的地址
#define FSMC_LCD_DATA                  ((uint32_t)0x6C000002)      //FSMC_Bank1_NORSRAM1用于LCD数据操作的地址
#define LCD_WRITE_CMD(x)               *(__IO uint16_t *)FSMC_LCD_CMD  = x
#define LCD_WRITE_DATA(x)              *(__IO uint16_t *)FSMC_LCD_DATA = x
#define LCD_READ_DATA()                *(__IO uint16_t *)FSMC_LCD_DATA
#define FSMC_LCD_BACKx                 FSMC_Bank1_NORSRAM4

下面给出ILI9488的参考驱动代码:

static void ILI9488_REG_Config ( void )
{//************* Start Initial Sequence **********///* PGAMCTRL (Positive Gamma Control) (E0h) */LCD_WRITE_CMD(0xE0);LCD_WRITE_DATA(0x00);LCD_WRITE_DATA(0x07);LCD_WRITE_DATA(0x10);LCD_WRITE_DATA(0x09);LCD_WRITE_DATA(0x17);LCD_WRITE_DATA(0x0B);LCD_WRITE_DATA(0x41);LCD_WRITE_DATA(0x89);LCD_WRITE_DATA(0x4B);LCD_WRITE_DATA(0x0A);LCD_WRITE_DATA(0x0C);LCD_WRITE_DATA(0x0E);LCD_WRITE_DATA(0x18);LCD_WRITE_DATA(0x1B);LCD_WRITE_DATA(0x0F);/* NGAMCTRL (Negative Gamma Control) (E1h)  */LCD_WRITE_CMD(0XE1);LCD_WRITE_DATA(0x00);LCD_WRITE_DATA(0x17);LCD_WRITE_DATA(0x1A);LCD_WRITE_DATA(0x04);LCD_WRITE_DATA(0x0E);LCD_WRITE_DATA(0x06);LCD_WRITE_DATA(0x2F);LCD_WRITE_DATA(0x45);LCD_WRITE_DATA(0x43);LCD_WRITE_DATA(0x02);LCD_WRITE_DATA(0x0A);LCD_WRITE_DATA(0x09);LCD_WRITE_DATA(0x32);LCD_WRITE_DATA(0x36);LCD_WRITE_DATA(0x0F);/* Adjust Control 3 (F7h)  */LCD_WRITE_CMD(0XF7);LCD_WRITE_DATA(0xA9);LCD_WRITE_DATA(0x51);LCD_WRITE_DATA(0x2C);LCD_WRITE_DATA(0x82);/* DSI write DCS command, use loose packet RGB 666 *//* Power Control 1 (C0h)  */LCD_WRITE_CMD(0xC0);LCD_WRITE_DATA(0x11);LCD_WRITE_DATA(0x09);/* Power Control 2 (C1h) */LCD_WRITE_CMD(0xC1);LCD_WRITE_DATA(0x41);/* VCOM Control (C5h)  */LCD_WRITE_CMD(0XC5);LCD_WRITE_DATA(0x00);LCD_WRITE_DATA(0x0A);LCD_WRITE_DATA(0x80);/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */LCD_WRITE_CMD(0xB1);LCD_WRITE_DATA(0xB0);LCD_WRITE_DATA(0x11);/* Display Inversion Control (B4h) */LCD_WRITE_CMD(0xB4);LCD_WRITE_DATA(0x02);/* Display Function Control (B6h)  */LCD_WRITE_CMD(0xB6);LCD_WRITE_DATA(0x02);LCD_WRITE_DATA(0x22);/* Entry Mode Set (B7h)  */LCD_WRITE_CMD(0xB7);LCD_WRITE_DATA(0xc6);/* HS Lanes Control (BEh) */LCD_WRITE_CMD(0xBE);LCD_WRITE_DATA(0x00);LCD_WRITE_DATA(0x04);/* Set Image Function (E9h)  */LCD_WRITE_CMD(0xE9);LCD_WRITE_DATA(0x00);/* 设置屏幕方向和尺寸 */LCD_SetDirection(LCD_DIRECTION);/* Interface Pixel Format (3Ah) */LCD_WRITE_CMD(0x3A);LCD_WRITE_DATA(0x55);/* 0x55 : 16 bits/pixel  *//* Sleep Out (11h) */LCD_WRITE_CMD(0x11);LCD_DELAY(120*2000);/* Display On */LCD_WRITE_CMD(0x29);
}

之后就可以根据屏幕操作函数进行显示操作啦!

代码参考来源:硬石嵌入式开发团队

二、触摸屏

我使用的是IIC总线驱动的触摸屏,IIC的程序都一样,主要是由于驱动芯片和厂家不同所导致的驱动程序不同。实际操作中直接读写寄存器即可,下面给出屏幕按键扫描参考代码。

void FT6236_Scan(void)
{u8 i=0;u8 sta = 0;u8 buf[4] = {0};    FT6236_RD_Reg(0x02,&sta,1);//读取触摸点的状态        if(sta & 0x0f)   //判断是否有触摸点按下,0x02寄存器的低4位表示有效触点个数{TPR_Structure.TouchSta = ~(0xFF << (sta & 0x0F));    //~(0xFF << (sta & 0x0F))将点的个数转换为触摸点按下有效标志for(i=0;i<5;i++)                                  //分别判断触摸点1-5是否被按下{if(TPR_Structure.TouchSta & (1<<i))             //读取触摸点坐标{                                              //被按下则读取对应触摸点坐标数据FT6236_RD_Reg(FT6236_TPX_TBL[i],buf,4);    //读取XY坐标值TPR_Structure.x[i]=((u16)(buf[0]&0X0F)<<8)+buf[1];TPR_Structure.y[i]=((u16)(buf[2]&0X0F)<<8)+buf[3];if((buf[0]&0XC0)!=0X80){TPR_Structure.x[i]=TPR_Structure.y[i]=0;//必须是contact事件,才认为有效 return;}}}TPR_Structure.TouchSta |= TP_PRES_DOWN;     //触摸按下标记}else{if(TPR_Structure.TouchSta &TP_PRES_DOWN)   //之前是被按下的TPR_Structure.TouchSta &= ~0x80;        //触摸松开标记  else{TPR_Structure.x[0] = 0;TPR_Structure.y[0] = 0;TPR_Structure.TouchSta &=0xe0;    //清除触摸点有效标记}}
}

代码参考来源:正点原子

详细代码下载链接。

FSMC驱动TFT显示屏(和驱动触摸屏)相关推荐

  1. TFT显示屏驱动设计与验证

    TFT显示屏驱动设计与验证 RGB 接口的 TFT 屏扫描方式和 VGA (Video Graphics Array)标准类似,也是使用行列扫描的方式.在介绍 TFT 屏扫描原理之前,先来介绍下 VG ...

  2. ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏

    ESP8266/ESP32/nodeMcu/wemos D1 MINI开发板用TFT_eSPI库驱动ST7789(240*240)TFT显示屏 材料 硬件连接 引脚连接表 引脚连接图 安装TFT_eS ...

  3. Arduino与Proteus仿真实例-TFT显示屏(ILI9341驱动器)SPI驱动仿真

    TFT显示屏(ILI9341驱动器)SPI驱动仿真 薄膜晶体管液晶显示器 (TFT LCD) 是一种利用薄膜晶体管技术来提高对比度和可寻址性等品质的液晶显示器 (LCD). TFT 技术意味着使用单独 ...

  4. stm32 驱动 TFT LCD

    LCD/LCM的基本概念 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状 ...

  5. Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  6. 单片机开发教程5——51单片机驱动TFT彩屏

    文章目录 代码例程 TFT模块 介绍 使用要点 减少刷新像素 坐标系 游戏设计 对象 VS Code 代码例程 TFT.zip 开发资料中的例程有些瑕疵,上面是整理后的例程,修改了一些参数,也添加了不 ...

  7. 简单明了操作——ESP8266 NodeMCU驱动TFT LCD液晶屏(制作透明小电视前奏)

    简单明了操作--ESP8266 NodeMCU驱动TFT LCD液晶屏(制作透明小电视前奏) 前言 准备材料 esp8266 NodeMCU(串口WiFi模块) 1.44inch SPI Arduin ...

  8. [lcm] Qualcomm平台的显示屏lcd驱动移植步骤

    1lk部分 1-1 target_displayc 1-2 oem_panelc 1-3 panel_innont51021b_1200p_videoh 2Kernel 2-1 dsi-panel-b ...

  9. fpga硬件驱动TFT液晶屏-小结

    最近折腾了一下fpga,发现还真是不好搞,硬件描述语言和顺序代码的真的是天差地别,还好电路的底子还在一些.通过发挥不怕效率低,只要能运行的精神,终于把ili9320的初始化和写操作调通了.最后跑了下时 ...

  10. 使用8080并口协议驱动NT35510LCD显示屏

    使用8080并口协议驱动NT35510LCD显示屏   本文记录如何使用8080协议驱动LCD显示屏,其中LCD显示屏驱动为NT35510芯片,正点原子的4.3寸显示屏,像素480X800,基于正点原 ...

最新文章

  1. ajax请求获取服务器数据,jquery.ajax发布从app引擎服务器获取数据的请求
  2. elasticsearch原理_花几分钟看一下Elasticsearch原理解析与性能调优
  3. python实现视频关键帧提取(基于帧间差分)
  4. php smarty 语法,5. Smarty基本语法
  5. 数字孪生智慧交通仿真推演解决方案
  6. 深度学习-训练集图片输入神经网络前的标准化(附代码)
  7. 8086 CPU 内部结构
  8. CTFshow - 七夕杯复现
  9. 探究正雅S8-SGTB与S8-SGHB
  10. 互联网创业的未来挖掘思路分享
  11. 磕磕绊绊的全景相机之路
  12. Springboot AOP注解方式获取请求参数及返回值并发送至rabbitMQ
  13. Mysql数据库存储ip地址
  14. 2021年全新Java学习路线图
  15. Tournament
  16. 【读博客/翻译】A Visual Guide to Evolution Strategies 进化策略的视觉指南
  17. H.266/VVC相关技术学习笔记4:HEVC和VVC中块划分的差别
  18. 历史演变有助于理解css布局的本质
  19. 32位系统能够识别多达内存_C ++程序可打印多达N个术语的卢卡斯系列
  20. 数学之美-【算法】 - 用来流方式计算UV的基数算法

热门文章

  1. mfs java_mFS文件系统 - java学者 - OSCHINA - 中文开源技术交流社区
  2. 抗生素对微生物组和人体健康的影响
  3. 第一讲:摄影和记录的区别(照相机摄影和手机摄影的区别)
  4. 理解服务器证书 CASSL
  5. 支付宝首次揭秘红包技术
  6. 苹果手机电池恢复方法_recover恢复实用教程:苹果手机恢复误删照片的几种方法...
  7. python输出偶数_如何用Python 判断奇偶数
  8. 数据可视化发挥流程的价值——江汽物流数据监控平台建设经验
  9. linux怎么生成arm文件,AMR 文件扩展名: 它是什么以及如何打开它?
  10. 基于python的图片比较