简要说明
例如,该公司最近更换了820*320屏幕,移植stemwin,使用3线spi通讯+16RGB,这个屏幕的工作流程是:首先通过三线spi通过16发送初始化指令bitRGB发送像素点。 移植过程参考安富莱、野火、https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html
移植过程
首先对屏幕进行初始化,使用模拟3线SPI因为9bit方式,第一代表命令。 手册上的通讯时序如下: 但实际上这个时序是个坑,实际时序如下: SCL在空闲状态下高电平,然后在第一个上升沿采样,即CPOL=1、CPHA=1。 初始化代码如下:最重要的是把它放在SCL拉高。
void SPI3_GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd ( SDI_GPIO_CLK| SCL_GPIO_CLK| CS_GPIO_CLK| RES_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = SDI_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //SDA有上拉电阻 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(SDI_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Pin = SCL_PIN; GPIO_Init(SCL_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = CS_PIN; GPIO_Init(CS_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RES_PIN; GPIO_Init(RES_GPIO_PORT, &GPIO_InitStructure); SET_LSCE_HIGH; SET_LSCK_LOW; SET_LSCK_HIGH; }
时序部分参考https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html
static void St7701_Write_Byte(unsigned shorttemp)
{
unsigned char i;
SET_LSCE_LOW;
// GPIO_PortClear(GPIO, 4U, 1<<0U);
for(i=0;i<9;i++)
{
SET_LSCK_LOW;
// ST7701_SCL(0);
if(temp&0x0100)
// ST7701_SDA(1);
SET_LSDA_HIGH;
else
// ST7701_SDA(0);
SET_LSDA_LOW;
UDELAY(5);
SET_LSCK_HIGH;
// ST7701_SCL(1);
UDELAY(5);
temp = temp<<1;
}
SET_LSCE_HIGH;
// GPIO_PortSet(GPIO, 4U, 1<<0U);
}
static void St7701_WriteCommand(uint8_t c)
{
unsigned short temp = 0x00;
temp = temp | c;
St7701_Write_Byte(temp);
UDELAY(100);
}
static void St7701_WriteData(uint8_t c)
{
unsigned short temp = 0x100;
temp = temp | c;
St7701_Write_Byte(temp);
UDELAY(100);
}
#define W_C(x) St7701_WriteCommand(x)
#define W_D(x) St7701_WriteData(x)
void LCD_SPI_Init(void)
{
uint8_t id1, id2, id3;
SPI3_GPIO_Config();
SET_LRES_HIGH;
mdelay(1);
SET_LRES_LOW;
mdelay(100);
SET_LRES_HIGH;
mdelay(200);
//id1 = SPI_St7701s_ReadByte(0xDA);
//id2 = SPI_St7701s_ReadByte(0xDB);
//id3 = SPI_St7701s_ReadByte(0xDC);
#if 1
W_C (0x11);
mdelay(20); //Delayms 20ms
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x13);
W_C (0xEF);
W_D (0x08);
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x10);
W_C (0xC0); //设置显示行为820
W_D (0xE5);
W_D (0x02);
W_C (0xC1); //设置VBP=12,VFP=10
W_D (0x0C);
W_D (0x0A);
W_C (0xC2); //反转选择性和帧率控制
W_D (0x07); //7Column
W_D (0x0F); //PCLK=512+(0X0F*16)=752
W_C (0xC3); //RGB控制
W_D (0x02); //RGB DE mode--VSYNC信号极性(LOW)--HSYNC信号极性(LOW)--DP = “1” The data is input on the negative edge of DOTCLK--|||||||EP = 0 The data DB23-0 is written when ENABLE = “1”. Disable data write operation when ENABLE = “0”
//HBP--0x10 VBP=0x08(猜测为HFP)
W_C (0xCC);
W_D (0x10);
W_C(0xCd);
W_D(0x08);
W_C (0xB0);
W_D (0x00);
W_D (0x08);
W_D (0x51);
W_D (0x0D);
W_D (0xCE);
W_D (0x06);
W_D (0x00);
W_D (0x08);
W_D (0x08);
W_D (0x1D);
W_D (0x02);
W_D (0xD0);
W_D (0x0F);
W_D (0x6F);
W_D (0x36);
W_D (0x3F);
W_C (0xB1);
W_D (0x00);
W_D (0x10);
W_D (0x4F);
W_D (0x0C);
W_D (0x11);
W_D (0x05);
W_D (0x00);
W_D (0x07);
W_D (0x07);
W_D (0x1F);
W_D (0x05);
W_D (0xD3);
W_D (0x11);
W_D (0x6E);
W_D (0x34);
W_D (0x3F);
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x11);
W_C (0xB0);
W_D (0x4D);
W_C (0xB1);
W_D (0x1C);
W_C (0xB2);
W_D (0x87);
W_C (0xB3);
W_D (0x80);
W_C (0xB5);
W_D (0x47);
W_C (0xB7);
W_D (0x85);
W_C (0xB8);
W_D (0x21);
W_C (0xB9);
W_D (0x10);
W_C (0xC1);
W_D (0x78);
W_C (0xC2);
W_D (0x78);
W_C (0xD0);
W_D (0x88);
UDELAY(100); //---------------------------------------
W_C (0xE0);
W_D (0x80);
W_D (0x00);
W_D (0x02);
W_C (0xE1);
W_D (0x04);
W_D (0xA0);
W_D (0x00);
W_D (0x00);
W_D (0x05);
W_D (0xA0);
W_D (0x00);
W_D (0x00);
W_D (0x00);
W_D (0x60);
W_D (0x60);
W_C (0xE2);
W_D (0x30);
W_D (0x30);
W_D (0x60);
W_D (0x60);
W_D (0x3C);
W_D (0xA0);
W_D (0x00);
W_D (0x00);
W_D (0x3D);
W_D (0xA0);
W_D (0x00);
W_D (0x00);
W_D (0x00);
W_C (0xE3);
W_D (0x00);
W_D (0x00);
W_D (0x33);
W_D (0x33);
W_C (0xE4);
W_D (0x44);
W_D (0x44);
W_C (0xE5);
W_D (0x06);
W_D (0x3E);
W_D (0xA0);
W_D (0xA0);
W_D (0x08);
W_D (0x40);
W_D (0xA0);
W_D (0xA0);
W_D (0x0A);
W_D (0x42);
W_D (0xA0);
W_D (0xA0);
W_D (0x0C);
W_D (0x44);
W_D (0xA0);
W_D (0xA0);
W_C (0xE6);
W_D (0x00);
W_D (0x00);
W_D (0x33);
W_D (0x33);
W_C (0xE7);
W_D (0x44);
W_D (0x44);
W_C (0xE8);
W_D (0x07);
W_D (0x3F);
W_D (0xA0);
W_D (0xA0);
W_D (0x09);
W_D (0x41);
W_D (0xA0);
W_D (0xA0);
W_D (0x0B);
W_D (0x43);
W_D (0xA0);
W_D (0xA0);
W_D (0x0D);
W_D (0x45);
W_D (0xA0);
W_D (0xA0);
W_C (0xEB);
W_D (0x00);
W_D (0x01);
W_D (0x4E);
W_D (0x4E);
W_D (0xEE);
W_D (0x44);
W_D (0x00);
W_C (0xED);
W_D (0xFF);
W_D (0xFF);
W_D (0x04);
W_D (0x56);
W_D (0x72);
W_D (0xFF);
W_D (0xFF);
W_D (0xFF);
W_D (0xFF);
W_D (0xFF);
W_D (0xFF);
W_D (0x27);
W_D (0x65);
W_D (0x40);
W_D (0xFF);
W_D (0xFF);
W_C (0xEF);
W_D (0x10);
W_D (0x0D);
W_D (0x04);
W_D (0x08);
W_D (0x3F);
W_D (0x1F);
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x13);
W_C (0xE8);
W_D (0x00);
W_D (0x0E);
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x00);
W_C (0x11);
UDELAY(100); //----------------------------
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x13);
W_C (0xE8);
W_D (0x00);
W_D (0x0C);
UDELAY(10 ); //-------------------------------
W_C (0xE8);
W_D (0x00);
W_D (0x00);
W_C (0xFF);
W_D (0x77);
W_D (0x01);
W_D (0x00);
W_D (0x00);
W_D (0x00);
W_C(0x36);
W_D(0x00); //0x00
W_C(0x3A);
W_D(0x50);
W_C(0x11);
/* W_C (0xFF); W_D (0x77); W_D (0x01); W_D (0x00); W_D (0x00); W_D (0x12); W_C (0xD1); W_D (0x81); W_D (0x08); W_D (0x03); W_D (0x20); W_D (0x08); W_D (0x01); W_D (0xA0); W_D (0x01); W_D (0xE0); W_D (0xA0); W_D (0x01); W_D (0xE0); W_D (0x03); W_D (0x20); W_C (0xD2); W_D (0x08); */
UDELAY(100);
W_C(0x29);
Delay1ms(20);
#else
#endif
}
初始化过程注意SCL空闲电平就成,其他没啥好说的。 之后就是LCD的初始化,一把抄,改一下VBP、HBP、HFP、VFP这几个参数
void LCD_Init(void) 标签:
电容0r4crc6电容电阻b3a