st7789s顯示晶片驅動程式碼
gpiofd_write(resetIO, 1); usleep(50000); gpiofd_write(resetIO, 0); usleep(100000); gpiofd_write(resetIO, 1); usleep(100000);
st7789s晶片是分大小端的,當使用RGB16位方式傳送資料時要注意傳送資料的大小端問題
send_ctrl_cmd(0x11); usleep(120000);
send_ctrl_cmd(0x36); send_data_cmd(0x00);//更改顯示方式
send_ctrl_cmd(0x3a); send_data_cmd(0x06);//更改rgb顏色為多少位
send_ctrl_cmd(0xb0); send_data_cmd(0xa0);//06
send_ctrl_cmd(0xb2); send_data_cmd(0x28); send_data_cmd(0x28); send_data_cmd(0x05); send_data_cmd(0x33); send_data_cmd(0x33);
send_ctrl_cmd(0xb7); send_data_cmd(0x35);
send_ctrl_cmd(0xbb); send_data_cmd(0x3c);//23
send_ctrl_cmd(0xb1); send_data_cmd(0x80); send_data_cmd(0x10);
send_ctrl_cmd(0xc0); send_data_cmd(0x2c);
send_ctrl_cmd(0xc2); send_data_cmd(0x01);
send_ctrl_cmd(0xc3); send_data_cmd(0x05);//14
send_ctrl_cmd(0xc4); send_data_cmd(0x20);
send_ctrl_cmd(0xc6); send_data_cmd(0x14); // 14
send_ctrl_cmd(0xd0); send_data_cmd(0xa4); send_data_cmd(0xa1);
send_ctrl_cmd(0xe0); send_data_cmd(0xd0); send_data_cmd(0x00); send_data_cmd(0x02); send_data_cmd(0x07); send_data_cmd(0x07); send_data_cmd(0x19); send_data_cmd(0x2e); send_data_cmd(0x54); send_data_cmd(0x41); send_data_cmd(0x2d); send_data_cmd(0x17); send_data_cmd(0x18); send_data_cmd(0x14); send_data_cmd(0x18);
send_ctrl_cmd(0xe1); send_data_cmd(0xd0); send_data_cmd(0x00); send_data_cmd(0x02); send_data_cmd(0x07); send_data_cmd(0x04); send_data_cmd(0x24); send_data_cmd(0x2c); send_data_cmd(0x44); send_data_cmd(0x42); send_data_cmd(0x1c); send_data_cmd(0x1a); send_data_cmd(0x17); send_data_cmd(0x15); send_data_cmd(0x18); send_ctrl_cmd(0x35); send_data_cmd(0x00);//40
send_ctrl_cmd(0x44); send_data_cmd(0x19); send_ctrl_cmd(0x29);
********************************清屏程式碼,把螢幕全部刷成一個色判斷驅動是否有問題**********************
static void sw_clear_panel(unsigned int color) { unsigned short x0, y0, x1, y1, x, y; unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
x0 = (unsigned short)0; y0 = (unsigned short)0; x1 = (unsigned short)FRAME_WIDTH-1; y1 = (unsigned short)FRAME_HEIGHT-1;
h_X_start=((x0&0xFF00)>>8); l_X_start=(x0&0x00FF); h_X_end=((x1&0xFF00)>>8); l_X_end=(x1&0x00FF);
h_Y_start=((y0&0xFF00)>>8); l_Y_start=(y0&0x00FF); h_Y_end=((y1&0xFF00)>>8); l_Y_end=(y1&0x00FF);
send_ctrl_cmd(0x2A); send_data_cmd(h_X_start); send_data_cmd(l_X_start); send_data_cmd(h_X_end); send_data_cmd(l_X_end);
send_ctrl_cmd(0x2B); send_data_cmd(h_Y_start); send_data_cmd(l_Y_start); send_data_cmd(h_Y_end); send_data_cmd(l_Y_end);
send_ctrl_cmd(0x29); send_ctrl_cmd(0x2C);
for (y = y0; y <= y1; ++ y) { for (x = x0; x <= x1; ++ x) { //採用了RGB24位的資料,所以傳送三次
send_data_cmd(0xff); send_data_cmd(0); send_data_cmd(0);
} }
}
我使用這個2.8寸的螢幕有IO引腳控制傳送的是資料還是命令給主控晶片,所以在傳送時候要注意在主控晶片控制命令和資料引腳的高低電平
VOID send_ctrl_cmd (UCHAR cmd) {
gpiofd_write(cmdDataIO, 0);
lib_bzero(&spiMsg, sizeof(spiMsg)); spiMsg.SPIMSG_pucRdBuffer =pucDestBuffer; spiMsg.SPIMSG_pucWrBuffer = &cmd; spiMsg.SPIMSG_uiLen = 1; if (API_SpiDeviceTransfer(pSpiDevice, &spiMsg, 1) != 1) { printf("failed to spi transfer!\n"); API_SpiDeviceDelete(pSpiDevice); API_VmmDmaFree(pucSrcBuffer); return; } gpiofd_write(cmdDataIO, 1);
}
VOID send_data_cmd (UCHAR data) {
gpiofd_write(cmdDataIO, 1);
lib_bzero(&spiMsg, sizeof(spiMsg)); spiMsg.SPIMSG_pucRdBuffer = pucDestBuffer; spiMsg.SPIMSG_pucWrBuffer = &data; spiMsg.SPIMSG_uiLen = 1;
if (API_SpiDeviceTransfer(pSpiDevice, &spiMsg, 1) != 1) { printf("failed to spi transfer!\n"); API_SpiDeviceDelete(pSpiDevice); API_VmmDmaFree(pucSrcBuffer); return; }
gpiofd_write(cmdDataIO, 0);
}