(说明:本文没有详细描写有关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);
}
}