5. 字库驱动
芯片烧录完成后,需要在 MCU 工程中移植字库驱动,才能通过 SPI 接口读写字库芯片。本章覆盖引脚封装确认、lib/h 文件添加、gt_read_data 与 r_dat_bat 函数实现以及字库初始化。
5.1 添加 lib 文件和 h 文件到工程
进入 \exportFonts 路径,将 gt_gui_driver.lib 文件和 gt_gui_driver.h 文件添加到工程中即可。
exportFonts 目录
由于编译器种类繁杂,添加库文件的方式均不相同,各类型编译器添加库文件的方法请自行搜索或者寻求 MCU 原厂技术支持。
5.2 实现 gt_read_data 和 r_dat_bat 驱动函数
头文件中声明了两个外部驱动函数 gt_read_data 和 r_dat_bat,需要用户在工程中实现。
第一步:SPI 初始化
实现 gt_read_data 之前,要保证 SPI 正常初始化。SPI 初始化例程可以在 MCU 芯片原厂的官网获取。下面的代码是 STM32F407 的 SPI 初始化代码,以供参考。
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // 使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 使能SPI1时钟
// GPIOB 3,4,5初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; // PB3~5复用功能输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;// 100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1); // PB3复用为SPI1
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1); // PB4复用为SPI1
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1); // PB5复用为SPI1
// 这里只针对SPI口初始化
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); // 复位SPI1
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); // 停止复位SPI1
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // 串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // 第二个跳变沿数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // NSS信号由软件(SSI位)管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; // 波特率预分频值
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); // 初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); // 使能SPI外设
SPI1_ReadWriteByte(0xff); // 启动传输
}
第二步:实现 gt_read_data 函数
gt_read_data 函数的实现可以参考导出文件夹中「03_SPI驱动\gt_read_data.c」文件。将代码移植到工程中,并替换代码中的 CS 上拉和下拉以及 SPI 收发的代码,使用用户自己的代码。

第三步:9F 指令测试通信
实现 gt_read_data 函数后,可以通过发 9F 指令测试 gt_read_data 通信是否正常。具体测试代码如下:
uint8_t tmp_buf[8] = {0};
tmp_buf[0] = 0x9F;
gt_read_data(tmp_buf, 1, tmp_buf, 8);
for(uint8_t i = 0; i < 8; i++)
{
printf("tmp_buf:%x\r\n", tmp_buf[i]);
}
检查 tmp_buf 最后接收到的数据能否在下图(图 2-1)的参考数据中找到。以下为部分型号芯片的 9F 指令实际返回数据示例:
9F 测试返回数据示例
如果找不到可以通过拨打 0755-83453881 联系业务或者技术人员。
第四步:实现 r_dat_bat 函数
如果 9F 指令测试正常,下一步则开始实现 r_dat_bat 函数:
unsigned char r_dat_bat(unsigned long address, unsigned long r_data_len, unsigned char *p_rbuf)
{
#define _TX_DATA_LEN (4)
unsigned char tx_buf[_TX_DATA_LEN] = {0};
tx_buf[0] = 0x03; // 读取数据的命令
tx_buf[1] = (unsigned char)((address & 0xFF0000) >> 16);
tx_buf[2] = (unsigned char)((address & 0x00FF00) >> 8);
tx_buf[3] = (unsigned char)((address & 0x0000FF));
return gt_read_data(tx_buf, _TX_DATA_LEN, p_rbuf, r_data_len);
}
5.3 调用 GT_Font_Init 函数
如果 gt_read_data 通信正常并实现了 r_dat_bat 函数,那么可以开始添加 lib 文件以及 h 文件到工程中,并进行头文件的声明,然后调用 GT_Font_Init 进行字库初始化。
编译器中库文件的添加,在keil编译器中lib文件添加方法同.c文件一致,其他的编译器添加库文件的方法各不相同,如果是其他的编译器,则需要向MCU原厂技术支持工程师询问MCU使用编译器库文件的添加方法。下面以keil为里截图说明。
注意:必须在 SPI 初始化后调用
GT_Font_Init函数。
GT_Font_Init 调用
GT_Font_Init 初始化
如果 GT_Font_Init 返回值大于 0 并且不等于 FF,表示字库初始化成功,可以正常调用字库的 API 接口函数;如果返回值不在上述范围内,说明主控与字库芯片的通信仍存在问题,请按以下步骤排查:
- 用逻辑分析仪分析数据,没有逻辑分析仪则用示波器检查信号是否正常;
- 检查 SPI 的引脚初始化是否都上拉了;
- 检查 SPI 的时钟频率是否过高,建议 SPI 时钟频率设置 45MHz 或以下;
- 检查芯片焊接是否正常,芯片 MISO 引脚和 MOSI 引脚是否连接错误等。
MISO 引脚排查
如果上述操作都执行了,字库初始化还是返回小于或等于 0 的值,请到官网联系高通字库技术人员,联系方式:0755-83453881。


