6.1. SPI - TFT LCD 显示¶
本 demo 演示通过 SPI 驱动带 il9431 芯片的TFT 屏显示。
6.1.1. 硬件连接¶
本 demo 基于 BL706_AVB 开发板,连接方式如下
GPIO function GPIO pin
----------------------------------
LCD_CS <--> GPIO10
LCD_DC <--> GPIO22
SPI_SCK <--> GPIO19
SPI_MISO <--> GPIO20
SPI_MOSI <--> GPIO21
6.1.2. 软件实现¶
软件代码见
examples/spi/spi_lcd
1 2 | #define BSP_SPI_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK
#define BSP_SPI_CLOCK_DIV 0
|
配置
SPI
设备时钟源,见bsp/board/bl706_avb/clock_config.h
1 2 3 | #define CONFIG_GPIO19_FUNC GPIO_FUN_SPI
#define CONFIG_GPIO20_FUNC GPIO_FUN_SPI
#define CONFIG_GPIO21_FUNC GPIO_FUN_SPI
|
配置
SPI
设备复用引脚,见bsp/board/bl706_avb/pinmux_config.h
,,如有改动,请自行修改
注解
为适配 bl702_avb 硬件, SPI 的 MOSI 和 MISO 默认进行了调换,如果想要恢复默认,修改 drivers/bl702_driver/hal_drv/default_config/spi_config.h
中 SPI_SWAP_ENABLE
为 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #define BSP_USING_SPI0
#if defined(BSP_USING_SPI0)
#ifndef SPI0_CONFIG
#define SPI0_CONFIG \
{ \
.id = 0, \
.clk = 36000000,\
.mode = SPI_MASTER_MODE, \
.direction = SPI_MSB_BYTE0_DIRECTION_FIRST, \
.clk_polaraity = SPI_POLARITY_LOW, \
.clk_phase = SPI_PHASE_1EDGE, \
.datasize = SPI_DATASIZE_8BIT, \
.fifo_threshold = 4, \
}
#endif
#endif
|
使能
BSP_USING_SPI0
并配置SPI
设备配置,见bsp/board/bl706_avb/peripheral_config.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | gpio_set_mode(LCD_CS_PIN,GPIO_OUTPUT_MODE);
gpio_set_mode(LCD_DC_PIN,GPIO_OUTPUT_MODE);
gpio_write(LCD_CS_PIN,1); //CS1
gpio_write(LCD_DC_PIN,1); //DC
spi0 = device_find("spi0");
if(spi0)
{
device_close(spi0);
}
else{
spi_register(SPI0_INDEX,"spi0");
spi0 = device_find("spi0");
}
if(spi0)
{
device_open(spi0,DEVICE_OFLAG_STREAM_TX|DEVICE_OFLAG_STREAM_RX);
}
|
配置
LCD_CS
和LCD_DC
引脚为输出模式并拉高调用
spi_register
函数注册SPI
设备,当前注册SPI0
然后通过
find
函数找到设备对应的句柄,保存于spi0
句柄中最后使用
device_open
以轮询发送模式来打开spi0
设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | void LCD_WR_Byte(uint8_t data)
{
CS1_LOW;
DC_HIGH;
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_8BIT);
CS1_HIGH;
}
void LCD_WR_HalfWord(uint16_t data)
{
CS1_LOW;
DC_HIGH;
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_16BIT);
CS1_HIGH;
}
void LCD_WR_Word(uint32_t data)
{
CS1_LOW;
DC_HIGH;
spi_transmit(spi0,&data,1,SPI_TRANSFER_TYPE_32BIT);
CS1_HIGH;
}
|
为 LCD 显示驱动提供接口
6.1.3. 编译和烧录¶
CDK 编译
打开项目中提供的工程文件:spi_lcd.cdkproj
参照 Windows 下使用 CDK (类 MDK Keil)开发指南 的步骤编译下载即可
命令行编译
1 2 | $ cd <sdk_path>/bl_mcu_sdk
$ make BOARD=bl706_avb APP=spi_lcd
|
烧录