学习目标:
掌握正点原子潘多拉板载LCD的用法,熟悉IIC和SPI的用法及其区别
学习内容:
1.LCD屏幕 潘多拉开发板板载LCD屏幕大小1.3寸,分辨率240*240,色彩深度16bit,使用ST7789V2液晶控制器,小巧细腻很喜欢。
潘多拉开发板板载的lcd硬件原理图如上所示,因为显示问题,所以只是写操作 ,不用读取。因而用到的引脚为:
屏幕美照
2.学会使用st7789驱动,芯片手册臭又长,网上有好多可以借鉴的例子。
这里定义了控制引脚的高低电平控制
#define LCD_PWR(n) (n?\
HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_RESET))
#define LCD_WR_RS(n) (n?\
HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_RESET))
#define LCD_RST(n) (n?\
HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_SET):\
HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_RESET)
当然根据手册关键字,要有如下的宏定义:
//LCD屏幕分辨率定义
#define LCD_Width 240
#define LCD_Height 240
//颜色定义
#define WHITE 0xFFFF //白色
#define YELLOW 0xFFE0 //黄色
#define BRRED 0XFC07 //棕红色
#define PINK 0XF81F //粉色
#define RED 0xF800 //红色
#define BROWN 0XBC40 //棕色
#define GRAY 0X8430 //灰色
#define GBLUE 0X07FF //兰色
#define GREEN 0x07E0 //绿色
#define BLUE 0x001F //蓝色
#define BLACK 0x0000 //黑色
3.在程序编写时采用的RT-thread stdiuo 平台,在配置中使能spi硬件后,在config.h中 打开define SPI MODE ENABLE的注释,在board.c中添加宏定义#define BSP_USING_SPI3,这样在RT-thread为你配置好的很多预定义函数才会生效。最后不要忘了在board.c中添加关于用到的spi硬件引脚初始化(用cube生成void HAL_SPI_MspInit()后复制到board.c即可)
好,让我们复习一下spi吧!!!!!!!!!!!!!!!!!
SPI(串行外围接口,串行外设接口)是一种高速,全双工,同步通信总线,常用于短距离通讯,主要用于EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理SPI一般使用4根线通信,
-
MOSI –主机输出/从机输入数据线(SPI总线主输出/从输入)。
-
MISO –主机输入/从机输出数据线(SPI总线主输入/从输出)。
-
SCLK –串行时钟线(Serial Clock),主设备输出时钟信号至从设备。
-
CS –从设备选择线(芯片选择)。也叫SS,CSB,CSN,EN等,主设备输出片选信号至从设备SPI以主从方式工作,通常有一个主设备和一个或多个从设备。通信由主设备发起,主设备通过CS选择要通信的从设备,然后通过SCLK给从设备提供时钟信号,数据通过MOSI输出给从设备,同时通过MISO接收从设备发送的数据
在rt-thread中常用的spi相关API:
rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char *name, const char *bus_name, void *user_data)
设备注册API,
设备 | SPI设备句柄 |
名称 | SPI设备名称 |
bus_name | SPI总线名称 |
用户数据 | 用户数据指针 |
例子:rt_hw_spi_device_attach("spi3", "spi30", GPIOD, GPIO_PIN_7);对应函数
rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef *cs_gpiox, uint16_t cs_gpio_pin)
{前面代码省略
rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin);
}
配置spi设备:
rt_err_t rt_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg)
struct rt_spi_configuration
{
rt_uint8_t mode;
rt_uint8_t data_width;
rt_uint16_t reserved;
rt_uint32_t max_hz;
};
发现spi设备,并确认注册:
static int rt_hw_lcd_config(void)
{
spi_dev_lcd = (struct rt_spi_device *)rt_device_find("spi30");
/* config spi */
{
struct rt_spi_configuration cfg;
cfg.data_width = 8;
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
cfg.max_hz = 42 * 1000 * 1000; /* 42M,SPI max 42MHz,lcd 4-wire spi */
rt_spi_configure(spi_dev_lcd, &cfg);
}
return RT_EOK;
}