Jump to content
IlyaM

Can't use uGFX with ST7735 on nrf51

Recommended Posts

Hey, I gonna use uGFX with ST7735, unfortunately there is no board_ST7735_template.h for this driver and I wrote my own:

#ifndef GDISP_LLD_BOARD_H
#define GDISP_LLD_BOARD_H

#include "nrf_gpio.h"
#include "nrf_drv_spi.h"
#include "nrf_delay.h"
#include "nrf_log.h"
#include "app_error.h"

#define GDISP_LLD_PIXELFORMAT			GDISP_PIXELFORMAT_RGB565

#define LCD_SCK     29
#define LCD_MISO    22
#define LCD_MOSI    28
#define LCD_CS      24
#define LCD_DC      20
#define LCD_RST     23
//#define LCD_RW      6

#define SPI_INSTANCE  1 /**< SPI instance index. */
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);  /**< SPI instance. */
nrf_drv_spi_config_t lcd_spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
static volatile bool lcd_spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */

void lcd_spi_event_handler(nrf_drv_spi_evt_t const * p_event)
{
    lcd_spi_xfer_done = true;
    //NRF_LOG_DEBUG("spi transfer completed.\n");
}

static GFXINLINE void init_board(GDisplay *g) {
  NRF_LOG_RAW_INFO("ST7735 init_board\n");
  // setup pins
  nrf_gpio_cfg_output(LCD_CS);
  nrf_gpio_cfg_output(LCD_DC);
  nrf_gpio_cfg_output(LCD_RST);
  //nrf_gpio_cfg_output(LCD_RW);

  nrf_gpio_pin_write(LCD_CS, 1);
  //nrf_gpio_pin_write(LCD_RW, 1);

  // reset board
  nrf_gpio_pin_write(LCD_RST, 0);
  nrf_delay_ms(100);
  nrf_gpio_pin_write(LCD_RST, 1);

  // setup spi
  lcd_spi_config.miso_pin = LCD_MISO;
  lcd_spi_config.mosi_pin = LCD_MOSI;
  lcd_spi_config.sck_pin  = LCD_SCK;
  lcd_spi_config.frequency = NRF_DRV_SPI_FREQ_8M;
  APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &lcd_spi_config, lcd_spi_event_handler));
	(void) g;
}

static GFXINLINE void post_init_board(GDisplay *g) {
	(void) g;
}

static GFXINLINE void setpin_reset(GDisplay *g, gBool state) {
  NRF_LOG_RAW_INFO("setpin_reset: %d\r\n", state);
  nrf_gpio_pin_write(LCD_RST, state);
	(void) g;
	(void) state;
}

static GFXINLINE void set_backlight(GDisplay *g, uint8_t percent) {
	(void) g;
	(void) percent;
}

static GFXINLINE void acquire_bus(GDisplay *g) {
  nrf_gpio_pin_write(LCD_CS, 0);
	(void) g;
}

static GFXINLINE void release_bus(GDisplay *g) {
  nrf_gpio_pin_write(LCD_CS, 1);
	(void) g;
}

static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) {
  // dc low
  nrf_gpio_pin_write(LCD_DC, 0);
  lcd_spi_xfer_done = false;
  APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &cmd, 1, NULL, 0));
  //while (!lcd_spi_xfer_done){};
	(void) g;
	(void) cmd;
}

static GFXINLINE void write_data(GDisplay *g, uint8_t data) {
	(void) g;
	(void) data;
  nrf_gpio_pin_write(LCD_DC, 1);
  lcd_spi_xfer_done = false;
  APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &data, sizeof(data), NULL, 0));
  //while (!lcd_spi_xfer_done){};
}

static GFXINLINE void write_data_byte(GDisplay *g, uint8_t arg) {
  // dc high
  nrf_gpio_pin_write(LCD_DC, 1);
  lcd_spi_xfer_done = false;
  APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, &arg, 1, NULL, 0));
  //while (!lcd_spi_xfer_done){};
	(void) g;
	(void) arg;
}

static GFXINLINE uint16_t read_data(GDisplay *g) {
	(void) g;
	return 0;
}

#endif /* GDISP_LLD_BOARD_H */

nrf51 doesn't have systick and instead of this one I use RTC timer with frequency 32kHz, but when I compile it (without errors) I see nothing on my display and in the console output. if I comment out everything with uGFX I see console output, more over I have my own lib for ST7735 and it works fine. May I use uGFX without systick, I think it needs for display's backligh?

Maybe someone had have an experience with this display and nrf51822?

Share this post


Link to post
Share on other sites

Please excuse the late reply - I wanted to digg out some sources.

We've plenty of people that use µGFX on nRF51 and nRF52 platforms. The nRF51 does have a systick. I've attached a GOS port and the corresponding systick handler implementation for an nRF51 port I made quite some time ago.  

In general: You might want to check whether the µGFX core runs before starting to use optional modules such as GDISP and GINPUT. You can have a look at the GOS demos - they allow you to check whether the µGFX core is working correctly without using the display code.

ugfx_port.c

gos_nrf5sdk11.c

gos_nrf5sdk11.h

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×