前面通过例程体验了SPI外设的工作方式。这次我使用SPI外设完成驱动ST7789为控制核心的TFT显示屏的处理。物理接线如下:

其中SCK、CS、MOSI军使用G32A1465的SPI外设,但要注意,需要修改例程中CS的处理极性,因为TFT显示屏的CS是在低电平的时候才允许数据通讯,
LPSPI_MasterConfigPcs(LPSPI_1, LPSPI_PER_PCS0, LPSPI_SIGNAL_ACTIVE_HIGH);
改为
LPSPI_MasterConfigPcs(LPSPI_1, LPSPI_PER_PCS0, LPSPI_SIGNAL_ACTIVE_LOW);
这样修改后,SPI外设数据通讯的时候,使CS端低电平有效,如下图测试的那样(原来的例程中,是高电平有效的)。

在测试程序中,加入的是简单逻辑,以固定一秒的周期显示累加的数据。同样使用开发板本身提供的库函数,另外ST7789的驱动,以文件的形式加入到工程中。主程序很简单,
int main(void) {
uint16_t i=0;
bool compareStatus = true;
uint32_t bytesRemained;
STATUS_T status;
/* Initialize clock */
CLOCK_SYS_Init(&g_clockConfig);
/* Led init */
LED_Init();
/* uart init */
COM_Init();
/* spi pins init */
PINS_Init(NUM_OF_CONFIGURED_PINS0, g_spiPinsConfig);
// 以主SPI模式初始化SPI设备
/* initialize SPI to master mode based on the configuration set */
LPSPI_MasterInit(LPSPI_1, &g_spiState, &g_spiMasterCfg);
// 配置传输之间的延迟
LPSPI_MasterConfigDelay(LPSPI_1, 1, 1, 1);
// 设置PCS、极性
//LPSPI_MasterConfigPcs(LPSPI_1, LPSPI_PER_PCS0, LPSPI_SIGNAL_ACTIVE_HIGH);
LPSPI_MasterConfigPcs(LPSPI_1, LPSPI_PER_PCS0, LPSPI_SIGNAL_ACTIVE_LOW);
// 初始化TFT显示屏
TFT_Init();
TFT_Clear(BLACK);
while (1) {
i++;
printf("i = %d\r\n", i);
TFT_ShowNum(40, 0, i, 4, 16);
OSIF_TimeDelay(100);
}
}
运行效果如下:
在运行中,执行初始化的处理过程比较慢,原因是SPI的通信速度低,为此可以通过修改配置改变,见user_lpspi_config.c中g_spiMasterCfg的初始化设置:
LPSPI_MASTER_CFG_T g_spiMasterCfg = {
.bitNumber = 8U,
.baudBitsPer = 500000UL,
.lpspiModSrcClk = 8000000UL,
.selectPcs = LPSPI_PER_PCS0,
.selectPcsPolar = LPSPI_SIGNAL_ACTIVE_HIGH,
.selectClkPhase = LPSPI_CLOCK_PHASE_CFG_1ST,
.clkPolar = LPSPI_CLK_SIGNAL_HIGH,
.callback = NULL,
.callbackParam = NULL,
.pcsKeeps = false,
.sendLsbFirst = false,
.transferType = LPSPI_TRANSFER_INTERRUPTS,
.rxDMAChan = 0U,
.txDMAChan = 0U
};
baudBitsPer就是设置通讯速度的参数。
selectPcsPolar是设置通讯过程中控制向其它设备传递数据时,CS在高电平时有效还是低电平时有效。这个也可以通过LPSPI_MasterConfigPcs函数修改。
selectClkPhase是设置在SCLK的第一个还是第二个脉冲沿时采集MOSI数据。
clkPolar是设置SCLK平时保持低电平还是高电平,也就是SCLK正脉冲有效还是负脉冲有效。
使用了SPI模式传输数据后,就不需要操心SCLK、MOSI、CS几个引脚的电平控制了,代码上处理起来也很简洁。但由于TFT显示屏还需要RESET、DC控制,虽有还是要配置两个GPIO口专门用于RESET、DC控制。在本次测试中,我偷懒直接使用板载蓝色和绿色LED用到的GPIO口了。
测试中需要注意的一点是,不同厂家的TFT显示屏在处理中,BLK引脚是否连接3.3V,可能会影响显示效果。我这次用到的1.9寸的TFT显示屏,如果BLK引脚不接到3.3V上,显示屏是不会有任何显示的。测试现象是虽然在逻辑分析以上检测到初始化指令和显示指令的传输没有任何问题,但显示屏上没有任何显示。后来想了想估计是BLK没接电源导致的。我手中还有一款1.8寸的同样是ST7789驱动TFT显示屏,BLK悬空也不影响显示。
全部评论