关于全志R11如何驱动4线ST7789芯片的屏幕

标题 关于全志R11如何驱动ST7789芯片的屏幕
1、本次采用的是4线SPI通信,IM3-0为[1,1,1,0]模式
2、屏的接口为50ping,接线分别为如下
CS接地(或者软件控制)
## 标题在这里插入图片描述
因为是SPI串口通信有些管脚已经被复用,最后二根数据线分别为
在这里插入图片描述
在这里插入图片描述
目前代码里只控制屏幕所以SDO可以悬空
其他的一些电源接地脚需要自己注意一下,下面为放置在内核中的代码。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

/*本次通信采用的4线SPI通信
RS直接接地没有处理
RS是数据和命令的控制脚
SCLK为时钟
SDI和SDO为数据线(SDO目前是悬空未进行操作)
RST为复位脚
平台为全志R11
*/
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 //棕色
#define BRRED 0XFC07 //棕红色
#define GRAY 0X8430 //灰色
//GUI颜色

#define DARKBLUE 0X01CF //深蓝色
#define LIGHTBLUE 0X7D7C //浅蓝色
#define GRAYBLUE 0X5458 //灰蓝色
//以上三色为PANEL的颜色

#define LIGHTGREEN 0X841F //浅绿色
#define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色)

#define LCD_W 240
#define LCD_H 320
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long

#define GPIO_PB_0 160
#define GPIO_PB_1 161
#define GPIO_PB_6 164
#define GPIO_PB_7 165

#define SCLK GPIO_PB_0
#define SDI GPIO_PB_1
#define RS GPIO_PB_6
#define Reset GPIO_PB_7

#define OLED_SCLK_Clr() gpio_direction_output(SCLK, 0)//CLK
#define OLED_SCLK_Set() gpio_direction_output(SCLK, 1)

#define OLED_SDIN_Clr() gpio_direction_output(SDI, 0)//DIN
#define OLED_SDIN_Set() gpio_direction_output(SDI, 1)

#define OLED_RST_Clr() gpio_direction_output(Reset, 0)//RES
#define OLED_RST_Set() gpio_direction_output(Reset, 1)

#define OLED_DC_Clr() gpio_direction_output(RS, 0)//DC
#define OLED_DC_Set() gpio_direction_output(RS, 1)

//先释放一下几个gpio口为了方便以后的占用
static void spi_free_gpio(void)
{
gpio_free(SDI);
gpio_free(SCLK);
gpio_free(RS);
gpio_free(Reset);
}

//申请GPIO口资源
static int spi_request_gpio(void)
{
if (gpio_request(SDI, “spi_SDI”) < 0)
{
printk(“fail to request SDI\n”);
return -1;
}
if (gpio_request(SCLK, “spi_sclk\n”) < 0)
{
printk(“fail to request sclk\n”);
return -1;
}
if (gpio_request(RS, “spi_RS”) < 0)
{
printk(“fail to request RS\n”);
return -1;
}
if (gpio_request(Reset, “spi_reset”) < 0)
{
printk(“fail to request reset\n”);
return -1;
}
return 0;
}

u16 BACK_COLOR, POINT_COLOR; //背景色,画笔色
void LCD_Writ_Bus(char dat) //串行数据写入
{
u8 i;

for(i=0;i<8;i++)
{			  
	OLED_SCLK_Clr();
	if(dat&0x80)
	   OLED_SDIN_Set();
	else 
	   OLED_SDIN_Clr();
	OLED_SCLK_Set();
	dat<<=1;   
}			

}

void LCD_WR_DATA8(char da) //发送数据-8位参数
{ //OLED_CS_Clr();
OLED_DC_Set();
LCD_Writ_Bus(da);
//OLED_CS_Set();
}
void LCD_WR_DATA(int da)
{// OLED_CS_Clr();
OLED_DC_Set();
LCD_Writ_Bus(da>>8);
LCD_Writ_Bus(da);
// OLED_CS_Set();
}
void LCD_WR_REG(char da)
{ // OLED_CS_Clr();
OLED_DC_Clr();
LCD_Writ_Bus(da);
// OLED_CS_Set();
}
void LCD_WR_REG_DATA(int reg,int da)
{// OLED_CS_Clr();
LCD_WR_REG(reg);
LCD_WR_DATA(da);
// OLED_CS_Set();
}

void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
LCD_WR_REG(0x2a);
LCD_WR_DATA8(x1>>8);
LCD_WR_DATA8(x1);
LCD_WR_DATA8(x2>>8);
LCD_WR_DATA8(x2);

LCD_WR_REG(0x2b);
LCD_WR_DATA8(y1>>8);
LCD_WR_DATA8(y1);
LCD_WR_DATA8(y2>>8);
LCD_WR_DATA8(y2);

LCD_WR_REG(0x2C);
}

//清屏函数
//Color:要清屏的填充色
void LCD_Clear(u16 Color)
{
u16 i,j;
Address_set(0,0,LCD_W-1,LCD_H-1);
for(i=0;i {
for (j=0;j {
LCD_WR_DATA(Color);
}

      }

}

void Lcd_Init(void)
{
// spi_free_gpio();
// mdelay(120);
// spi_request_gpio();
// mdelay(120);
//OLED_CS_Clr(); //打开片选使能
OLED_RST_Clr();
mdelay(20);
OLED_RST_Set();
mdelay(20);
// OLED_BLK_Set();

//************* Start Initial Sequence **********//
LCD_WR_REG(0x36);
LCD_WR_DATA8(0x00);

LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x05);

LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);

LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x35);

LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x19);

LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);

LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);

LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x12);

LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);

LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);

LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);

LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0x4C);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x23);

LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x44);
LCD_WR_DATA8(0x51);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x23);

LCD_WR_REG(0x21);

LCD_WR_REG(0x11);
//Delay (120);

LCD_WR_REG(0x29);

// delay_ms (120);
// LCD_WR_REG(0x23);
}

//入口主函数
static int __init ya15c_spi_init(void)
{

spi_free_gpio();
mdelay(50);
if (spi_request_gpio())
{
    printk("ya15c spi initializer failure...\n");
    return -1;
}    
mdelay(50);
OLED_SCLK_Set();
OLED_SDIN_Set();
OLED_RST_Set();
OLED_DC_Set();
mdelay(50);   

// printk("\n\n\n\n\n\n111111111111111111111111111===================\n\n\n\n\n\n\n\n\n");
// printk(“start 11to set color! …\n”);
Lcd_Init();
mdelay(120);

LCD_Clear(WHITE); //清屏
return 0;
}

static void __exit ya15c_spi_exit(void)
{
printk(“ya15c exit!\n”);
}

module_init(ya15c_spi_init);
module_exit(ya15c_spi_exit);
MODULE_LICENSE(“GPL”);

调试的过程中遇到的坑是真的不少。希望能够帮助到大家

你可能感兴趣的:(全志,驱动程序,嵌入式)