查看: 3517|回复: 4

7寸模块8875电阻屏的使用说明书之移植STM32F103ZET6

[复制链接]

该用户从未签到

发表于 2016-12-6 11:26:25 | 显示全部楼层 |阅读模式
分享到:
WB-7寸模块说明书(RA8875)
电阻屏
图片1.png
电容屏
图片2.png

1、介绍【模块特点】
※支持电容屏和电阻屏可选
※背光可调控(PWM)
※四个定位孔,方便安装定位
※提供丰富的参考资料,应用例程
※按工业级、EMC等标准设计,稳定抗干扰性强
【技术参数】
※分辨率:800 x 480 (Pixel)
※接口方式:168080并列式MCU接口
LCD控制芯片:RA8875
※电容触控芯片:GT910
※电阻触控芯片:XPT2046
※工作电压:3.3V(背光单独5V供电)
※工作电流:500mA
※工作温度:-20~ +70
※外形尺寸:185mm x 106mm
【接口说明】
引脚号
标识
描述
1
3V3
+3.3V
2
GND
接地
3~18
D0~D15
数据线
19
CS
LCD使能信号(低有效)
20
RS
寄存器选择(RS=0,数据寄存器;RS=1,指令寄存器)
21
WR
写动作(WR=0;RD=1)
22
RD
读动作(WR=1;RD=0)
23
RESET
复位8875(脉宽不能低于50us)
24
LCD_Wait
忙等待(低电平处于忙状态)
25
空脚
26
TINT
电容触摸中断控制
27
TRST
电容触摸复位控制
28
INT
8875中断信号输出
29
TSCL
电容触摸控制IIC_SCL
30
空脚
31
TSDA
电容触摸控制IIC_SDA
32
空脚
33
GND
接地
34
5V
+5V
2、接线、调试指南
拿到模块后,先给模块供两组电压——5v和3.3v(5v的GND可以不接);当背光可以正常亮起的时候,就可以接16根数据线和5根控制线,所以,你的MCU至少要有21个IO;接好线后,就可以通过修改我们提供的参考程序来让液晶屏显示。
如果你的控制板刚好是STM32系列的,而且也带FSMC,那么只需简单修改下IO,应该都可以正常驱动,其他控制板可以按照我们提供的初始化流程来初始化RA8875。
这里以我们旺宝电子的红龙103开发板为例,讲解下如何移植;
图片3.png
LCD的CS是PG12,是FSMC_NE4功能,因为我们LCD和NOR Flash在同一CS,所以用到了SN74LVC1G139来选择是操作LCD还是NOR Flash。
PF0则是地址最低位FSMC_A0,PD4是FSMC_NOE输出使能端,PD5是FSMC_NWE写使能端,D0~D15则是对应FSMC的16位数据线。
如果对FSMC不熟悉,请查看STM32技术参考手册,学习FSMC,通过程序说明怎么通过FSMC实现数据的读写操作,片选端接的是FSMC_NE4;
外部内存块分组地址+地址。也就是说,在块1的分组4的第0位:每一个块分组占用64MB,就是:0x4000000*3+0=0xC000000。
图片4.png
FSMC的操作起始地址是0x60000000+0x0C000000 = 0x6C000000
RS端接的是FSMC_A0,则可以通过地址的最低位来控制数据和命令的发送,我们在程序中定义了两个宏来区分数据和命令的发送
#define RA8875_REG                *(__IO uint16_t *) 0x6C000002
#define RA8875_RAM                *(__IO uint16_t *) 0x6C000000
因为数据总线是16位的,所以是两字节对齐,也就是第2位来控制,当第2位为1时,实现的是指令传输,当A0为0时,实现的是数据传输。
RA8875存取周期
图片5.png
初始化完成后,通过调用RA8875_Clear(RED);来验证我们的移植是否正确,若液晶没有显示颜色,可以通过读取RA8875_Init()中初始化的寄存器是否都正确的初始化了,大部分情况下,都是因为IO没有对应上或接线错误引起的。
如果你的板卡没有FSMC,那么接下来的改动就比较大了。下面我们以旺宝电子的金龙107开发板为例,讲解如何用普通IO来驱动我们的7寸屏。
要驱动7寸屏,有几个重要的基础函数,
RA8875_WriteCmd(uint8_t RegAddr)
RA8875_WriteData(uint8_t RegValue)       
uint16_t RA8875_ReadData16(void)
第一个函数是写命令
/****************************************************************
** Function name:       void RA8875_WriteCmd(uint8_t RegAddr)
** Descriptions:        写RA8875指令寄存器
** input parameters:    无
** output parameters:   无
** Returned value:      无
***************************************************************/
static void RA8875_WriteCmd(uint8_t RegAddr)
{
        LCD_CS(0);                                  //拉低片选段CS
        LCD_RD(1);                                  //读失能
        LCD_RS(1);                                  //写入的是命令
        LCD_WR(0);                                 //拉低写入的引脚,准备写入       
       
  GPIO_Write(LCD_DATA_GPIO, RegAddr);        //写入命令
  RA8875_Delaly200us();
               
  LCD_WR(1);                                      //拉高写入的引脚,写入命令
  LCD_CS(1);                                      //拉高片选段CS
}
第二个是写数据
/*******************************************************************
** Function name:       void RA8875_WriteData(uint8_t RegValue)
** Descriptions:        写RA8875数据
** input parameters:    RegValue: 寄存器值
** output parameters:   无
** Returned value:      无
******************************************************************/
static void RA8875_WriteData(uint8_t RegValue)       
{
        LCD_CS(0);                                  //拉低片选段CS
        LCD_RD(1);                                  //读失能
        LCD_RS(0);                                  //写入的是数据       
        LCD_WR(0);                                  //拉低写入的引脚,准备写入
       
        GPIO_Write(LCD_DATA_GPIO, RegValue);//写入数据
        RA8875_Delaly200us();
               
        LCD_WR(1);                                   //拉高写入的引脚,写入数据
        LCD_CS(1);                                   //拉高片选段CS
}
第三个是读数据
/********************************************************************
** Function name:       uint16_t RA8875_ReadData16(void)
** Descriptions:        读RA8875显存,16bit RGB
** input parameters:    无
** output parameters:   无
** Returned value:      读取的数据
********************************************************************/
static uint16_t RA8875_ReadData16(void)
{
                                   //IO应设为输入模式,此处省略
        LCD_CS(0);                          //拉低片选段CS                       
        LCD_RD(0);                          //拉低读取的引脚,准备读取数据       
        LCD_RS(0);                          //读取的是数据
        LCD_WR(1);
        RA8875_Delaly1ms();
        t=GPIO_ReadInputData(LCD_DATA_GPIO);     //读取数据
  
                                                 //设为输出,此处省略
}
按上面的时序写好后,就可以封装几个函数来初始化8875的寄存器了
/****************************************************************
** Function name:       void RA8875_WriteReg(uint8_t RegAddr, uint8_t RegValue)
** Descriptions:        写RA8875寄存器
** input parameters:    RegAddr:寄存器地址  RegValue:要写入的数据
** output parameters:   无
** Returned value:      无
*****************************************************************/
static void RA8875_WriteReg(uint8_t RegAddr, uint8_t RegValue)
{
        RA8875_WriteCmd(RegAddr);
        RA8875_WriteData(RegValue);
}
/******************************************************************
** Function name:       uint8_t RA8875_ReadReg(uint8_t RegAddr)
** Descriptions:        读RA8875寄存器
** input parameters:    RegAddr:寄存器地址  
** output parameters:   无
** Returned value:      读取的寄存器值
********************************************************************/
static uint8_t RA8875_ReadReg(uint8_t RegAddr)
{
        uint8_t value;
        RA8875_WriteCmd(RegAddr);                                             //设置寄存器地址
        value = (uint8_t)RA8875_ReadData16();                         // 读取寄存器值
        return value;
}
初始化8875
/*******************************************************************
** Function name:       void RA8875_InitHard(void)
** Descriptions:        初始化RA8875驱动芯片
** input parameters:    无
** output parameters:   无
** Returned value:      无
********************************************************************/
void RA8875_InitHard(void)
{                       
                                     //此处省略控制LCD的IO配置
        RA8875_WriteCmd(0x88);       // 初始化PLL.  晶振频率为25M
        RA8875_Delaly1us();                    // 延迟1us
        RA8875_WriteData(12);            // PLLDIVM [7] = 0 ; PLLDIVN [4:0] = 10
        RA8875_Delaly1ms();
        RA8875_WriteCmd(0x89);
        RA8875_Delaly1us();               
        RA8875_WriteData(2);                //PLLDIVK[2:0] = 2, 除以4
        RA8875_Delaly1ms();     //为保证PLL 输出稳定,须等待一段(< 100us)
        RA8875_WriteReg(0x10, (1 <<3 ) | (1 << 1));// 16位MCU并口,65K色
    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);       
        RA8875_WriteReg(0x01, 0x80);
        RA8875_WriteReg(0x40, 0x01);        // 选择绘图模式
        RA8875_WriteReg(0x41, 0x00);        //选择绘图模式, 目的为CGRAM
        RA8875_SetDispWin(0, 0, LCD_HEIGHT, LCD_WIDTH);
   RA8875_WriteReg(0x20, (1 << 3));            // 水平扫描方向设定
  //RA8875_WriteReg(0x20, (1 << 2));            // 垂直扫描方向设定
}
   
初始化完后可以通过调用RA8875_ReadReg来读取初始化的寄存器是否都被正确的配置了,如果是,那么可以调用RA8875_Clear(RED),颜色正常显示的话,说明移植成功了;若读回的寄存器没有被正确的初始化,那么就要检查下自己的连接线会不会有出错和IO是否可以正常操作。
3、背光控制
图片6.png
    要实现背光控制,需要把R23拆下,因RA8875带PWM输出,所以LCD初始化完后,可以调用RA8875_SetBackLight(uint8_t right)来控制液晶的背光。
/********************************************************************
** Function name:     void RA8875_SetBackLight(uint8_t right)
** Descriptions:       配置RA8875芯片的PWM1相关寄存器,控制LCD背光
** input parameters:    right : 亮度 0~255
** output parameters:   无
** Returned value:     无
********************************************************************/
void RA8875_SetBackLight(uint8_t right)
{
        if (right == 0)
        {       
          RA8875_WriteReg(0x8A, 0 << 6); //关闭PWM, PWM1引脚缺省输出0              
        }
        else if (right == BRIGHT_MAX)               //最大亮度
        {
          RA8875_WriteReg(0x8A, 1 << 6);          //关闭PWM, PWM1引脚缺省输出1
        }
        else
        {       
      RA8875_WriteReg(0x8A, (1 << 7) | 7);        //PWM频率为2.4k               
          RA8875_WriteReg(0x8B, right);
        }
}
如果设置背光后有波纹,可通过提高PWM的频率解决。
图片7.png
4、触摸移植【电阻式触摸部分】
RA8875内建一组10位ADC和控制电路,可以连接4线电阻式的触控面板。因触控部分和LCD共用数据线,所以,如果显示是正常的,那么通过调用我们写好的函数,来实现触摸功能。
【电容式触摸部分】
7寸电容触控芯片是GT910,要实现电容触摸,需要有4根IO。
图片8.png
WB-7寸LCD电容触摸接口
4个脚对应我们7寸屏丝印的TRST 、TINT 、TSCL 、 TSDA
移植到自己的控制板的话,只需要改这4个控制IO,
1)#define SDA_H()           GPIO_SetBits(GPIOB,GPIO_Pin_12);
  #define SDA_L()           GPIO_ResetBits(GPIOB,GPIO_Pin_12);
2)#define SCL_H()           GPIO_SetBits(GPIOB,GPIO_Pin_13);
  #define SCL_L()           GPIO_ResetBits(GPIOB,GPIO_Pin_13);
3)Reset                     GPIO_SetBits(GPIOB,GPIO_Pin_15);
4)Int                       GPIO_SetBits(GPIOG,GPIO_Pin_7);
需要注意的是,GT910需要烧写一段32k左右的固件,所以,要使用电容屏,需要确保自己的系统有足够的存储空间;关于GT910的驱动移植,在我们提供的《GT9XXF驱动调试指南V1.0》已有很详细的描述,大家可以结合着手册和我们提供的例程来移植到自己的控制板。这里我简单描述下GT910的初始化流程,方便大家调试。
GT910 IIC地址
GT910_IIC_RADDR 0xBB
GT910_IIC_WADDR 0xBA
1)IO初始化->
SDA=0;
SCL=0 ;
INT=1 ;
RESET=1;
2)上电初始化->
RST=0;
INT=0;
    delay15MS
RST=1;
delay5MS
3)读取IC类型gtp_get_chip_type();
图片9.png
如果能读到这些数据,说明和GT910的通信是没问题了。
4)固件烧写gup_fw_download_proc(0x00)
    烧写固件的过程会有些长,在我们红龙103上,烧写固件的过程大概要8秒,红龙407上是4秒,可以通过加快IIC速率来减少烧写固件的等待时间,因GT910这颗IC不带Flash,所以,固件在系统掉电后会失效,每次上电都需要烧写一次固件才能使用。
5)启动固件;gtp_fw_startup();
    INT改为上拉输入,并把INT对应的IO开启外部中断(下降沿触发)
6)读取固件版本号gt910_read_version(&version_info)
7)触摸面板初始化gtp_init_panel()
调试中可能遇到的问题
1 和GT910通信失败
检查IIC通信是否正常,是否有按照上述步骤1、2执行;
2         启动固件失败
INT是否有设为上拉输入(硬件带上拉,设为普通输入也可以)和下降沿触发,并在中断函数中调用gt910_isr();       
/****************************************************************
* Function Name  : EXTI9_5_IRQHandler
* Description    : This function handles External lines 9 to 5      
* Input          : None
* Output         : None
* Return         : None
********************************************************************/
void EXTI9_5_IRQHandler(void)
{
         if(EXTI_GetITStatus(EXTI_Line7) != RESET)
        {
          gt910_isr();       
    Pen_Point.Key_Sta=Key_Down;     //触摸屏被按下   
    EXTI_ClearITPendingBit(EXTI_Line7);                                    }
   }
}
修订记录
日期
版本
内容
作者
2016-03-30
Rev1.0
初始版本
openmcu666
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
[size=12.0000pt]
            

回复

使用道具 举报

  • TA的每日心情
    难过
    2016-12-9 09:23
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2016-12-6 11:44:06 | 显示全部楼层
    资料很全面,原理图,用户手册都有,非常好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:21
  • 签到天数: 183 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-6 11:48:55 | 显示全部楼层
    谢谢分享                     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-10 10:11
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-12-8 14:40:55 | 显示全部楼层

    有7寸8875电容屏吗,l还不错啊。你的板子有图片吗。淘宝买的吗,发给我链接我看看
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2016-12-8 14:48:52 | 显示全部楼层
    资料很齐全,收藏了。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 06:41 , Processed in 0.184110 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.