在学习Esp8266_RTOS_SDK移植LVGL时,发现使用官方示例中的SPI驱动ST7789屏幕时,驱动效率没有达到自己的期望,我认为还能提高点效率,想着能不能直接操作寄存器,这样更有效率,同时也能学习esp8266的SPI。
1.首先看看,官方给的SPI驱动OLED的示例,在examples->peripherals->spi_oled->main文件夹中的spi_oled_example_main.c。
直接上程序。
//包含的头文件
#include "esp8266/spi_struct.h"
#include "esp8266/gpio_struct.h"
#include "driver/gpio.h"
#include "driver/spi.h"
//引脚定义
#define CONFIG_ST7789V_PIN_RES 0
#define CONFIG_ST7789V_PIN_DC 5
#define CONFIG_ST7789V_PIN_CS 4
#define ST7789V_PIN_RES (CONFIG_ST7789V_PIN_RES)
#define ST7789V_PIN_DC (CONFIG_ST7789V_PIN_DC)
#define ST7789V_PIN_CS (CONFIG_ST7789V_PIN_CS)
#define ST7789V_PIN_BLK (CONFIG_ST7789V_PIN_BLK)
//DC引脚引脚高低电平设置
#define LCD_DAT GPIO.out_w1ts |= (0x1 << ST7789V_PIN_DC)
#define LCD_CMD GPIO.out_w1tc |= (0x1 << ST7789V_PIN_DC)
//ST7789初始化指令结构体定义
typedef struct {
uint8_t cmd;
uint8_t data[16];
uint8_t databytes; // No of data in data; bit 7 = delay after set; 0xFF = end
// of cmds.
} lcd_init_cmd_t;
//变量定义
static bool s_is_st7789v_inited = false;
spi_trans_t spi_trans_tmp = {0};//为了增加速度,减少不必要的指令执行时间,设置成全局变量。
//中断使能或者禁止宏定义
#define spi_intr_enable() _xt_isr_unmask(1 << ETS_SPI_INUM)
#define spi_intr_disable() _xt_isr_mask(1 << ETS_SPI_INUM)
//HSPI初始化程序
void my_spi_init(void)
{
//中断使能配置
SPI1.slave.rd_buf_inten = 0;
SPI1.slave.wr_buf_inten = 0;
SPI1.slave.rd_sta_inten = 0;
SPI1.slave.wr_sta_inten = 0;
SPI1.slave.trans_inten = 0;
// Clear interrupt status register
SPI1.slave.rd_buf_done = false;
SPI1.slave.wr_buf_done = false;
SPI1.slave.rd_sta_done = false;
SPI1.slave.wr_sta_done = false;
SPI1.slave.trans_done = false;
//禁止中断
spi_intr_disable();
//以下是根据SDK里面的设置缩减而成,只适合SPI master模式发送,其他模式请自行修改。
// Waiting for all transfers to complete
while (SPI1.cmd.usr);
SPI1.user.flash_mode = false;
// Set to Master mode
SPI1.pin.slave_mode = false;
SPI1.slave.slave_mode = false;
// Master uses the entire hardware buffer to improve transmission speed
SPI1.user.usr_mosi_highpart = false;
SPI1.user.usr_miso_highpart = false;
SPI1.user.usr_mosi = true;
// Create hardware cs in advance
SPI1.