QSPI驱动带NV3030B的LCD屏

发布于:2023-01-19 ⋅ 阅读:(572) ⋅ 点赞:(0)

(说明:本文没有详细描写有关QSPI通信时的细节,只是作为一个简要记录,说明一下QSPI驱动屏幕时的一些要点)

1、引脚说明:

 (1)LED_K:LCD屏背光负极

 (2)LED_A:LCD屏背光正极

    (该应用中,LED_A常供电3.3V,通过调节LED_K来控制背光的亮灭)

 (3)LCD_CS:片选脚,低电平选中

 (4)LCD_DA0:QSPI通信0脚

 (5)LCD_DA1:QSPI通信1脚

 (6)LCD_DA2:QSPI通信2脚

 (7)LCD_DA3:QSPI通信3脚

 (8)LCD_CLK:QSPI通信始终脚

 (9)LCD_RST:复位脚

注:有些驱动IC还需要LCD_RS脚,用于控制当前发送的是命令还是数据,NV3030B不需要

2、空闲时各引脚电平说明:

    LED_K:高或悬空,关闭背光;

    LCD_CS:高,没有选中IC;

    LCD_CLK:高,空闲电平默认为高,驱动IC-NV3030B在CLK上升沿采样数据;

    LCD_RST:高,需要复位时下拉RST脚100ms,再拉高即可

    LCD_DA0~LCD_DA3:高,QSPI通信时的数据引脚,半双工通信;发送命令阶段都是通过LCD_DA0单线进行的,只有在发送图片数据时才会使用到LCD_DA1~LCD_DA3

3、通信时序图:

(1)发送命令,以及给寄存器发送数据时只使用三根线CS,CLK,DA0,而DA1~DA3固定为高阻或高,RST为高,时序图如下(DA0在CLK下降沿切换数据,上升沿保持数据稳定):

 

(2)发送图像数据时使用6根线CS,CLK,DA0,DA1,DA2,DA3,而RST固定为高,时序图如下(DA0~DA3在CLK下降沿切换数据,上升沿保持数据稳定):

 在传输数据高4位时,DA3~DA0分别表示Bit7~Bit4;

 在传输数据低4位时,DA3~DA0分别表示Bit3~Bit0;

4、例程:

.h文件:

//------------------------------------------------------
#define RED    0xF800         //定义颜色常量 
#define GREEN  0x07E0
#define BLUE   0x001F
#define WHITE  0xFFFF
#define BLACK  0x0000
#define GRAY   0xEF5D         //0x2410
#define GRAY75 0x39E7 
#define GRAY50 0x7BEF    
#define GRAY25 0xADB5    
//------------------------------------------------------


#define QSPI_CS_PIN     34 //片选脚
#define QSPI_CLK_PIN    35 //时钟脚
#define QSPI_RS_PIN     38 //数据/命令脚
#define QSPI_DA0_PIN    40 //数据脚0
#define QSPI_DA1_PIN    41 //数据脚1
#define QSPI_DA2_PIN    11 //数据脚2
#define QSPI_DA3_PIN    12 //数据脚3
#define QSPI_BL_EN_PIN  33 //背光使能脚
#define QSPI_RST_PIN    37 //硬件复位脚
#define QSPI_PWR_EN_PIN 22 //LCD的VCC使能脚

#define QSPI_CS_Clr()  nrf_gpio_pin_clear(QSPI_CS_PIN)//CS1
#define QSPI_CS_Set()  nrf_gpio_pin_set(QSPI_CS_PIN)

#define QSPI_CLK_Clr() nrf_gpio_pin_clear(QSPI_CLK_PIN);
#define QSPI_CLK_Set() nrf_gpio_pin_set(QSPI_CLK_PIN)

#define QSPI_RS_Clr()   nrf_gpio_pin_clear(QSPI_RS_PIN)//DC
#define QSPI_RS_Set()   nrf_gpio_pin_set(QSPI_RS_PIN)

#define QSPI_DA0_Clr() nrf_gpio_pin_clear(QSPI_DA0_PIN)
#define QSPI_DA0_Set() nrf_gpio_pin_set(QSPI_DA0_PIN)
#define QSPI_DA1_Clr() nrf_gpio_pin_clear(QSPI_DA1_PIN)
#define QSPI_DA1_Set() nrf_gpio_pin_set(QSPI_DA1_PIN)
#define QSPI_DA2_Clr() nrf_gpio_pin_clear(QSPI_DA2_PIN)
#define QSPI_DA2_Set() nrf_gpio_pin_set(QSPI_DA2_PIN)
#define QSPI_DA3_Clr() nrf_gpio_pin_clear(QSPI_DA3_PIN)
#define QSPI_DA3_Set() nrf_gpio_pin_set(QSPI_DA3_PIN)

#define QSPI_BLK_Clr() nrf_gpio_pin_clear(QSPI_BL_EN_PIN)//BLK
#define QSPI_BLK_Set() nrf_gpio_pin_set(QSPI_BL_EN_PIN)

#define QSPI_RES_Clr()  nrf_gpio_pin_clear(QSPI_RST_PIN)//RES
#define QSPI_RES_Set()  nrf_gpio_pin_set(QSPI_RST_PIN)

#define QSPI_PWR_EN_Clr()  nrf_gpio_pin_clear(QSPI_PWR_EN_PIN)//RES
#define QSPI_PWR_EN_Set()  nrf_gpio_pin_set(QSPI_PWR_EN_PIN)

typedef enum{
      SINGLE_LINE,
      QUAD_LINE
}ENUM_QSPI_IO_NUM;              

void Nv3030BInit(void);
void DispColor(unsigned int color);

.c文件:

void NV3030BGpioInit(void)
{
     nrf_gpio_cfg_output(QSPI_CS_PIN);
     nrf_gpio_cfg_output(QSPI_CLK_PIN);
     nrf_gpio_cfg_output(QSPI_RS_PIN);
     nrf_gpio_cfg_output(QSPI_DA0_PIN);
     nrf_gpio_cfg_output(QSPI_DA1_PIN);
     nrf_gpio_cfg_output(QSPI_DA2_PIN);
     nrf_gpio_cfg_output(QSPI_DA3_PIN);
     nrf_gpio_cfg_output(QSPI_BL_EN_PIN);
     nrf_gpio_cfg_output(QSPI_RST_PIN);
     nrf_gpio_cfg_output(QSPI_PWR_EN_PIN);
    
     QSPI_CS_Set();  
     QSPI_CLK_Set();
     QSPI_DA0_Set();
     QSPI_DA1_Set();
     QSPI_DA2_Set();
     QSPI_DA3_Set();
     QSPI_RES_Set();
     QSPI_RS_Set();
     QSPI_BLK_Set();  
     QSPI_PWR_EN_Set();  
}

/*
**********************************************************************************
 *Function:     QspiSingleIOWrite
 *Description:  QSPI单线IO传输数据
 *Calls:       
 *Called By:   
 *Input:        dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiSingleIOWriteData(uint8_t dat) 
{    
        uint8_t i;
    
//        QSPI_CS_Clr();
        for(i=0;i<8;i++){              
                QSPI_CLK_Clr();
                if(dat&0x80)
                {
                     QSPI_DA0_Set();
                }
                else
                {
                     QSPI_DA0_Clr();
                }
                QSPI_CLK_Set();
                dat<<=1;
        }    
//        QSPI_CS_Set();    
}

/*
**********************************************************************************
 *Function:     Nv3030bQspiQuadIOWrite
 *Description:  QSPI四线IO传输数据
 *Calls:        
 *Called By:    
 *Input:        dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiQuadIOWriteData(uint8_t dat) 
{    
        uint8_t i;
    
//        QSPI_CS_Clr();
        for(i=0;i<2;i++){              
                QSPI_CLK_Clr();
                if(dat&0x80)
                {
                     QSPI_DA3_Set();
                }
                else
                {
                     QSPI_DA3_Clr();
                }
                dat<<=1;
                
                if(dat&0x80)
                {
                     QSPI_DA2_Set();
                }
                else
                {
                     QSPI_DA2_Clr();
                }
                dat<<=1;
                
                if(dat&0x80)
                {
                     QSPI_DA1_Set();
                }
                else
                {
                     QSPI_DA1_Clr();
                }
                dat<<=1;
                
                if(dat&0x80)
                {
                     QSPI_DA0_Set();
                }
                else
                {
                     QSPI_DA0_Clr();
                }
                QSPI_CLK_Set();
                dat<<=1;                
        }    
//        QSPI_CS_Set();    
}

/*
**********************************************************************************
 *Function:     QspiSingleIOWrData8
 *Description:  QSPI单线IO传输1字节数据
 *Calls:       
 *Called By:   
 *Input:        dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiSingleIOWrData8(uint8_t dat)
{
    QspiSingleIOWriteData(dat);
}

/*
**********************************************************************************
 *Function:     QspiQuadIOWrData8
 *Description:  QSPI四线IO传输1字节数据
 *Calls:       
 *Called By:   
 *Input:        dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiQuadIOWrData8(uint8_t dat)
{
    QspiQuadIOWriteData(dat);
}

/*
**********************************************************************************
 *Function:     QspiWrData16
 *Description:  QSPI传输4字节数据
 *Calls:       
 *Called By:   
 *Input:        l_line:传输数据时使用的线数,
                       SINGLE_LINE:用单根IO传输
                       QUAD_LINE:  用4根IO传输
                   dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiWrData16(ENUM_QSPI_IO_NUM l_line, uint16_t dat)
{
    if(SINGLE_LINE == l_line){
            QspiSingleIOWriteData(dat>>8);
            QspiSingleIOWriteData(dat);
        }
        else{
            QspiQuadIOWriteData(dat>>8);
            QspiQuadIOWriteData(dat);
        }
}

/*
**********************************************************************************
 *Function:     QspiWrComm
 *Description:  QSPI写寄存器
 *Calls:       
 *Called By:   
 *Input:        l_line:传输数据时使用的线数,
                       SINGLE_LINE:用单根IO传输
                       QUAD_LINE:  用4根IO传输
                  dat:要传输的数据
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiWrComm(uint8_t dat)
{
//        QSPI_RS_Clr();//写命令
    QspiSingleIOWriteData(0x02);
    QspiSingleIOWriteData(0x00);
    QspiSingleIOWriteData(dat);
    QspiSingleIOWriteData(0x00);
//        QSPI_RS_Set();//写数据
}

/*
**********************************************************************************
 *Function:     Nv3030bQspiAddressSet
 *Description:  设置起始和结束地址
 *Calls:       
 *Called By:   
 *Input:        x1,x2 设置列的起始和结束地址
                    y1,y2 设置行的起始和结束地址
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void QspiAddressSet(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
    QSPI_CS_Clr();
    QspiWrComm(0x2a);//列地址设置
    QspiWrData16(SINGLE_LINE,x1);
    QspiWrData16(SINGLE_LINE,x2);
    QSPI_CS_Set();
    
    QSPI_CS_Clr();
    QspiWrComm(0x2b);//行地址设置
    QspiWrData16(SINGLE_LINE,y1);
    QspiWrData16(SINGLE_LINE,y2);
    QSPI_CS_Set();
    
    QSPI_CS_Clr();
    QspiWrComm(0x2c);//储存器写
    QSPI_CS_Set();
}

/*
**********************************************************************************
 *Function:     Nv3030BInit
 *Description:  Nv3030B初始化
 *Calls:       
 *Called By:   
 *Input:        
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void Nv3030BInit(void)
{
    NV3030BGpioInit();
    
    QSPI_CS_Clr();
    QSPI_RES_Set();
    nrf_delay_ms(10);
    QSPI_RES_Clr();
    nrf_delay_ms(100);
    QSPI_RES_Set();
    nrf_delay_ms(100);
      
    QspiWrComm(0xFD); //私有访问
    QspiSingleIOWrData8(0x06);    //进入私有寄存器模式
    QspiSingleIOWrData8(0x08);
    QSPI_CS_Set();
    nrf_delay_ms(1);
    
    //QspiWrComm(0x60);         //时钟频率调整
    //QspiQuadIOWrData8(0x03);
    //QspiQuadIOWrData8(0x01);
    //QspiQuadIOWrData8(0x01);
    QSPI_CS_Clr();
    QspiWrComm(0x61);//VDD设置
    QspiSingleIOWrData8(0x06);   //唤醒时VDD1.68
    QspiSingleIOWrData8(0x04);   //睡眠时VDD1.29
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x62);//
    QspiSingleIOWrData8(0x00);
    QspiSingleIOWrData8(0x44);
    QspiSingleIOWrData8(0x40);
    //QspiQuadIOWrData8(0x03);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x63);//
    QspiSingleIOWrData8(0x41);
    QspiSingleIOWrData8(0x07);
    QspiSingleIOWrData8(0x12);
    QspiSingleIOWrData8(0x12);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x64);
    QspiSingleIOWrData8(0x37);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x65);
    QspiSingleIOWrData8(0x09);
    QspiSingleIOWrData8(0x10);
    QspiSingleIOWrData8(0x21);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x66);
    QspiSingleIOWrData8(0x09);
    QspiSingleIOWrData8(0x10);
    QspiSingleIOWrData8(0x21);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x67);
    QspiSingleIOWrData8(0x21);
    QspiSingleIOWrData8(0x40);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x68);
    QspiSingleIOWrData8(0x5d);
    QspiSingleIOWrData8(0x4c);//
    QspiSingleIOWrData8(0x2c);//
    QspiSingleIOWrData8(0x1c);//
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xB1);
    QspiSingleIOWrData8(0x0f); //0c
    QspiSingleIOWrData8(0x02); //00
    QspiSingleIOWrData8(0x07); //01
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xB4);
    QspiSingleIOWrData8(0x02);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xB5);
    QspiSingleIOWrData8(0x02);
    QspiSingleIOWrData8(0x02);//
    QspiSingleIOWrData8(0x0a);//
    QspiSingleIOWrData8(0x14);//
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xb6);
    QspiSingleIOWrData8(0x44);
    QspiSingleIOWrData8(0x01);
    QspiSingleIOWrData8(0x9f);
    QspiSingleIOWrData8(0x00);
    QspiSingleIOWrData8(0x02);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xdf);
    QspiSingleIOWrData8(0x11);
    QSPI_CS_Set();

    ///NV3030A2 GAMMA/
    QSPI_CS_Clr();
    QspiWrComm(0xe0); //gmama set 2.2
    QspiSingleIOWrData8(0x01); //PKP0[4:0]
    QspiSingleIOWrData8(0x06); //PKP1[4:0]
    QspiSingleIOWrData8(0x0e); //PKP2[4:0]
    QspiSingleIOWrData8(0x10); //PKP3[4:0]
    QspiSingleIOWrData8(0x0e); //PKP4[4:0]
    QspiSingleIOWrData8(0x0c); //PKP5[4:0]
    QspiSingleIOWrData8(0x0a); //PKP6[4:0]
    QspiSingleIOWrData8(0x16); //PKP6[4:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe3);
    QspiSingleIOWrData8(0x16); //PKN0[4:0]
    QspiSingleIOWrData8(0x13); //PKN1[4:0]
    QspiSingleIOWrData8(0x14); //PKN2[4:0]
    QspiSingleIOWrData8(0x10); //PKN3[4:0]
    QspiSingleIOWrData8(0x0f); //PKN4[4:0]
    QspiSingleIOWrData8(0x0f); //PKN5[4:0]
    QspiSingleIOWrData8(0x04); //PKN6[4:0]
    QspiSingleIOWrData8(0x01); //PKN6[4:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe1);
    QspiSingleIOWrData8(0x14); //PRP0[6:0]
    QspiSingleIOWrData8(0x68); //PRP1[6:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe4);
    QspiSingleIOWrData8(0x68); //PRN0[6:0]
    QspiSingleIOWrData8(0x14); //PRN1[6:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe2);
    QspiSingleIOWrData8(0x00); //VRP0[5:0]
    QspiSingleIOWrData8(0x0a); //VRP1[5:0]
    QspiSingleIOWrData8(0x09); //VRP2[5:0]
    QspiSingleIOWrData8(0x30); //VRP3[5:0]
    QspiSingleIOWrData8(0x39); //VRP4[5:0]
    QspiSingleIOWrData8(0x3f); //VRP5[5:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe5);
    QspiSingleIOWrData8(0x3f); //VRN0[5:0]
    QspiSingleIOWrData8(0x33); //VRN1[5:0]
    QspiSingleIOWrData8(0x28); //VRN2[5:0]
    QspiSingleIOWrData8(0x09); //VRN3[5:0]
    QspiSingleIOWrData8(0x0a); //VRN4[5:0]
    QspiSingleIOWrData8(0x00); //VRN5[5:0]
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe6);
    QspiSingleIOWrData8(0x00);
    QspiSingleIOWrData8(0xff);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xe7);
    QspiSingleIOWrData8(0x01);
    QspiSingleIOWrData8(0x04);
    QspiSingleIOWrData8(0x03);
    QspiSingleIOWrData8(0x03);
    QspiSingleIOWrData8(0x00);
    QspiSingleIOWrData8(0x12);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xE8);
    QspiSingleIOWrData8(0x00);
    QspiSingleIOWrData8(0x60);
    QspiSingleIOWrData8(0x00);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xec);
    QspiSingleIOWrData8(0x62);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xf1);
    QspiSingleIOWrData8(0x00);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0xfd); //私有访问
    QspiSingleIOWrData8(0xfa);    //退出私有访问
    QspiSingleIOWrData8(0xfc);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x3a);
    QspiSingleIOWrData8(0x55);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x35);
    QspiSingleIOWrData8(0x00);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x11); // exit sleep
    nrf_delay_ms(200);
    QSPI_CS_Set();

    QSPI_CS_Clr();
    QspiWrComm(0x29); // display on
    nrf_delay_ms(10);
    QSPI_CS_Set();
}

/*
**********************************************************************************
 *Function:     DispColor
 *Description:  用统一颜色刷屏
 *Calls:       
 *Called By:   
 *Input:        
 *Output:      
 *Return:      
 *Others:       
*********************************************************************************
*/
void DispColor(unsigned int color)
{
    unsigned int i,j;    
    QspiAddressSet(0,0,240,320);

    QSPI_CS_Clr();
    QspiSingleIOWriteData(0x12);
    QspiQuadIOWriteData(0x00);
    QspiQuadIOWriteData(0x2c);
    QspiQuadIOWriteData(0x00);
    
    for(i=0; i<320; i++)
          for(j=0; j<240; j++){
                    QspiWrData16(QUAD_LINE,color);
                }
    QSPI_CS_Set();
}

main函数:

int main(void)
{
        Nv3030BInit();

        while(true){
                DispColor(RED);            
                DispColor(GREEN);
                DispColor(BLUE);
                DispColor(WHITE);
                DispColor(BLACK);
                DispColor(GRAY);
                nrf_delay_ms(2000);
        }
}
 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到