Hello,
Im trying to use LCD display from edu boosterpack MKII. I have problem with display because i cant write even pixel. I analyze several different codes and then I make my code. MCU is tm4c123gh6pm, chip which control display is ST7735S and here is code, signals on oscilloscope are fine :
void ST7735_Select(){
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, ~GPIO_PIN_5);
}
void ST7735_UnSelect(){
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, GPIO_PIN_5);
}
void Write_Command(uint8_t c){
while(SSIBusy(SSI2_BASE)){}
SSIDataPut(SSI2_BASE, c);
while(SSIBusy(SSI2_BASE)){}
}
void Write_Data(uint8_t c){
while(SSIBusy(SSI2_BASE)){}
SSIDataPut(SSI2_BASE, c | 0x100);
}
void static setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1){
Write_Command(ST7735_CASET); // Column addr set
Write_Data(0x00);
Write_Data(x0); // XSTART
Write_Data(0x00);
Write_Data(x1); // XEND
Write_Command(ST7735_RASET); // Row addr set
Write_Data(0x00);
Write_Data(y0); // YSTART
Write_Data(0x00);
Write_Data(y1); // YEND
Write_Command(ST7735_RAMWR); // write to RAM
}
void static pushColor(uint16_t color) {
Write_Data((uint8_t)(color >> 8));
Write_Data((uint8_t)color);
}
void Init_ST7735S(void){
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0x1F;
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5); // Chip select
GPIOPinConfigure(GPIO_PB4_SSI2CLK);
//GPIOPinConfigure(GPIO_PB5_SSI2FSS);
GPIOPinConfigure(GPIO_PB6_SSI2RX);
GPIOPinConfigure(GPIO_PB7_SSI2TX);
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7);
SSIDisable(SSI2_BASE);
SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 9);
SSIEnable(SSI2_BASE);
ST7735_UnSelect();
}
void main(void){
SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ | SYSCTL_SYSDIV_4); // clock set 50MHz
Init_ST7735S();
while(1){
ST7735_Select();
Write_Command(ST7735_SWRESET); // software reset
ST7735_UnSelect();
SysCtlDelay(2000000); // 120mS
ST7735_Select();
Write_Command(ST7735_SLPOUT); // turn off sleep mode
ST7735_UnSelect();
SysCtlDelay(2000000); // 120mS
ST7735_Select();
Write_Command(ST7735_COLMOD); // color mode 16-bit/pixel
Write_Data(0x05);
Write_Command(ST7735_FRMCTR1); // 32.25kHz
Write_Data(0x00);
Write_Data(0x06);
Write_Data(0x03);
Write_Command(ST7735_MADCTL); // BGR color fileter panel
Write_Data(0x08);
Write_Command(ST7735_INVCTR); // no inversion
Write_Data(0x00);
setAddrWindow(5, 5, 50, 50);
pushColor(0x4F31);
Write_Command(ST7735_NORON);
Write_Command(ST7735_DISPON);
ST7735_UnSelect();
SysCtlDelay(16666667);
}