打印
[STM32F1]

WB-7寸模块说明书(RA8875)

[复制链接]
1479|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WB-7寸模块说明书(RA8875)
电阻屏


电容屏
1、介绍【模块特点】
※支持电容屏和电阻屏可选
※背光可调控(PWM)
※四个定位孔,方便安装定位
※提供丰富的参考资料,应用例程
※按工业级、EMC等标准设计,稳定抗干扰性强
【技术参数】
※分辨率:800 x 480(Pixel)
※接口方式:168080并列式MCU接口
LCD控制芯片:RA8875
※电容触控芯片:GT910
※电阻触控芯片:XPT2046
※工作电压:3.3V(背光单独5V供电)
※工作电流:500mA
※工作温度:-20 ~ +70
※外形尺寸:185mm x106mm
【接口说明】
  
引脚号
  
标识
描述
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开发板为例,讲解下如何移植;
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。
则FSMC的操作起始地址是0x60000000+0x0C000000= 0x6C000000
在RS端接的是FSMC_A0,则可以通过地址的最低位来控制数据和命令的发送,我们在程序中定义了两个宏来区分数据和命令的发送
#defineRA8875_REG        *(__IO uint16_t *) 0x6C000002
#defineRA8875_RAM       *(__IO uint16_t *) 0x6C000000
因为数据总线是16位的,所以是两字节对齐,也就是第2位来控制,当第2位为1时,实现的是指令传输,当A0为0时,实现的是数据传输。

9.png (95.32 KB )

9.png

8.png (67.03 KB )

8.png

7.png (36.79 KB )

7.png
沙发
openmcu889|  楼主 | 2016-12-13 10:41 | 只看该作者
RA8875存取周期
初始化完成后,通过调用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:       voidRA8875_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_tRegValue)   
{
    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_tRA8875_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:       voidRA8875_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_tRA8875_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:       voidRA8875_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、背光控制
    要实现背光控制,需要把R23拆下,因RA8875带PWM输出,所以在LCD初始化完后,可以调用RA8875_SetBackLight(uint8_t right)来控制液晶的背光。
/********************************************************************
** Functionname:     voidRA8875_SetBackLight(uint8_t right)
**Descriptions:       配置RA8875芯片的PWM1相关寄存器,控制LCD背光
** inputparameters:    right : 亮度0~255
** outputparameters:   
** Returnedvalue:     
********************************************************************/
void RA8875_SetBackLight(uint8_tright)
{
    if(right == 0)
    {   
      RA8875_WriteReg(0x8A, 0 << 6); //关闭PWM, PWM1引脚缺省输出0              
    }
    elseif (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的频率解决。


10.png (42.26 KB )

10.png

11.png (22.91 KB )

11.png

使用特权

评论回复
板凳
openmcu889|  楼主 | 2016-12-13 10:44 | 只看该作者
4、触摸移植【电阻式触摸部分】
RA8875内建一组10位ADC和控制电路,可以连接4线电阻式的触控面板。因触控部分和LCD共用数据线,所以,如果显示是正常的,那么通过调用我们写好的函数,来实现触摸功能。
【电容式触摸部分】
7寸电容触控芯片是GT910,要实现电容触摸,需要有4根IO。
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();
如果能读到这些数据,说明和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);                        }

使用特权

评论回复
地板
maggie6969| | 2016-12-13 15:47 | 只看该作者
1.汉字是用集通的字库芯片吗?

使用特权

评论回复
5
openmcu889|  楼主 | 2016-12-17 14:33 | 只看该作者
maggie6969 发表于 2016-12-13 15:47
1.汉字是用集通的字库芯片吗?

有啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

35

帖子

0

粉丝