此文章介紹SWM32S基于5寸800*480分辨率液晶屏+GT9157觸摸芯片的驅動實現過程。
MCU:SWM32SRET6
觸摸芯片:GT9157
MCU
SWM32S 內嵌 ARM Cortex-M4 控制器,片上包含精度為 1%以內的 20MHz/40MHz 時鐘,可通過 PLL 倍頻到 120MHz 時鐘,提供多種內置 FLASH/SRAM 大小可供選擇,支持 ISP(在系統編程)操作及 IAP(在應用編程)。
外設串行總線包括 1 個 CAN 接口,多個 UART 接口、 SPI 通信接口(支持主/從選擇)及 I2C 接口(支持主/從選擇)。此外還包括 1 個 32 位看門狗定時器, 6 組 32 位通用定時器, 1 組 32 位專用脈沖寬度測量定時器, 12 通道 16 位的 PWM 發生器, 2 個 8 通道 12 位、 1MSPS 的逐次逼近型ADC 模塊, 1 個 SDIO 接口模塊, TFT-LCD 液晶驅動模塊以及 RTC 實時時鐘、 SRAMC、 SDRAMC、NORFLC 接口控制模塊,同時提供欠壓檢測及低電壓復位功能。
觸摸芯片
GT9157擁有26個驅動通道和14個感應通道,以滿足更高的touch 精度要求。同時支持最先進的短距離傳輸功能HotKnot。GT9157可同時識別5個觸摸點位的實時準確位置,移動軌跡及觸摸面積。并可根據主控需要,讀取相應點數的觸摸信息,其內部結構如上圖所示。
GT9157觸控芯片有兩個備選的I2C通訊地址,這是由芯片的上電時序決定,如圖所示。上 電時序有Reset 引腳和INT引腳生成,若Reset引腳從低電電平轉變到高電平期間,INT 引腳為高電平的時候,觸控芯片使用的I2C設備地址為0x28/0x29(8位寫、讀地址),7位地址為0x14;若Reset引腳從低電電平轉變到高電平期間,INT 引腳一直為低電平,則觸控芯片使用的I2C設備地址為0xBA/0xBB(8位寫、讀地址),7位地址為0x5D。
代碼
紅色框內文件相對重要并解讀
( 1) bsp_I2C_GT9XX.c 文件的解讀
#include "bsp_I2C_GT9XX.h"
#include "string.h"
#include "bsp_SysTick.h"
#include
void I2C_Mst_Init(void)
{
I2C_InitStructure I2C_initStruct;
PORT_Init(PORTA, PIN4, FUNMUX0_I2C0_SCL, 1); // GPIOA.4配置為I2C0 SCL引腳
PORT_Init(PORTA, PIN5, FUNMUX1_I2C0_SDA, 1); // GPIOA.5配置為I2C0 SDA引腳
I2C_initStruct.Master = 1;
I2C_initStruct.Addr7b = 1;
I2C_initStruct.MstClk = 400000;
I2C_initStruct.MstIEn = 0;
I2C_Init(I2C0, &I2C_initStruct);
I2C_Open(I2C0);
}
void bsp_GT9XX_InitRst(void)
{
// 第一階段設置端口,并拉低兩個端口
GPIO_Init(GPIO_PORT_GT_RST, GPIO_PIN_GT_RST, 1, 0, 0); // 復位腳 輸出
GPIO_Init(GPIO_PORT_GT_INT, GPIO_PIN_GT_INT, 1, 0, 0); // 中斷腳
GPIO_ClrBit(GPIOC, PIN3);
GPIO_ClrBit(GPIOC, PIN2); // 拉低兩個端口的電平,準備復位
rt_thread_delay(10);
// 第二階段復位芯片
GPIO_SetBit(GPIOC, PIN3); // 拉高開始復位芯片
rt_thread_delay(10);
// 第三階段設置中斷引腳為 中斷功能
GPIO_Init(GPIOC, PIN2, 0, 0, 0);
EXTI_Init(GPIOC, PIN2, EXTI_RISE_EDGE); // 上升沿觸發中斷
I2C_Mst_Init(); // 硬件IIC端口初始化
rt_thread_delay(10);
}
void GT9XX_IRQEnable(void)
{
NVIC_EnableIRQ(GPIOC2_IRQn); // 使能GPIOC.2端口中斷
EXTI_Open(GPIOC, PIN2); // 打開外部中斷
}
void GT9XX_IRQDisable(void)
{
NVIC_DisableIRQ(GPIOC2_IRQn); // 禁止GPIOC.2端口中斷
EXTI_Close(GPIOC, PIN2); // 關閉外部中斷
GPIO_Init(GPIOC, PIN2, 1, 0, 1); // 回到普通輸出端口
GPIO_ClrBit(GPIOC, PIN2);
}
/**********************************************************************************************************************
* 函數名稱: bsp_WrNumByte()
* 功能說明: IIC寫Num個字節
* 輸 入: reg 寄存器地址,*p數據,WrByteNum寫入的數據個數
* 輸 出: 0,正常 其他,失敗
* 注意事項:
**********************************************************************************************************************/
uint8_t bsp_GT9XX_WrReg(uint8_t IdAddr,uint8_t *p,uint8_t WrByteNum)
{
I2C0->MSTDAT = IdAddr | 0; // 發送器件地址+寫命令
I2C0->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |??
(1 << I2C_MSTCMD_WR_Pos);? // 發送起始位和從機地址
while(I2C0->MSTCMD & I2C_MSTCMD
以上程序是我們為移植“ bsp_GT9XX.c”文件做的基本驅動,接下來我們詳細分析一下,
這部分源碼具體實現了什么功能。I2C_Mst_Init()函數中,我們首先聲明了一個結構體,接著將 GPIOA.4 和 GPIOA.5進行了特殊功能管腳的分配,設置為 I2C 接口。接著是給結構體賦值, 他們的意義分別是設置為主機模式;地址為 7 位接口;I2C 通信時鐘頻率設為 400HHz;不使能中斷模式,接著是調用庫函數進行給寄存器賦值;最后打開 I2C 接口。接下來 bsp_GT9XX_InitRst()函數為初始化,主要是設置端口,并將 GT9157 的設備 I2C 地址設置為 0xBA,這個設置過程參加上面的時序;接著將 GPIOC.2 設置為中斷,上升沿觸發。函數 GT9XX_IRQEnable()和 GT9XX_IRQDisable(),顧名思義,就是使能中斷和失能中斷,這個好理解最后就是兩個讀寫 GT9157 寄存器的函數,這兩個函數,需要讀者先理解 I2C 通信的基本協議,之后安裝基本協議,一句、一句的理解,這里需要注意的是
I2C0->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) ?|
(1 << I2C_MSTCMD_ACK_Pos) |
(1 << I2C_MSTCMD_STO_Pos);
這三行程序,當我們在跑該程序的時候, 一般是先寫寄存器,再讀數,而此時如果沒有這三行程序,會把下一次的讀數據和寫寄存器混淆,導致 GT9157 芯片不認識此協議。當我們加了之后,就有結束,有開始,繼而芯片能夠識別此協議。
現象
復位 初始化后串口打印,可以看到x軸800 ,y軸480
進行一個點的觸摸 ID:0 定位是(257,237) 寬度62
進行兩個點的觸摸 可以看到ID0 ID1
進行五個點的觸摸 可以看到ID0 ID1 ID2 ID3 ID4
附錄:
主程序代碼:
#include "bsp_uart.h"
#include "rtthread.h"
#include "ugui.h"
#include "bsp_gt9xx.h"
extern void GTP_TouchProcess(void);
UG_GUI gui;
uint32_t LCD_Buffer[800*480 * 2 / 4] __attribute__((at(SDRAMM_BASE))) = {0};
void _HW_DrawPoint(UG_S16 x, UG_S16 y, UG_COLOR c)
{
LCD_Buffer[y*400 + x/2] &= ~(0xFFFF << ((x%2) == 0 ? 0 : 16));
LCD_Buffer[y*400 + x/2] |= (c << ((x%2) == 0 ? 0 : 16));
}
ALIGN(RT_ALIGN_SIZE) // 以字對齊(4字節)
static rt_uint8_t rt_Test_thread_stack[1024]; // 線程棧
// 線程Test
static void Test_thread_entry(void* parameter)
{
printf(" RGB工程初始化OK ...... ");
LCD->SRCADDR = (uint32_t)LCD_Buffer;
LCD_Start(LCD);
UG_Init(&gui,(void(*)(UG_S16,UG_S16,UG_COLOR))_HW_DrawPoint,800,480);
GTP_Init_Panel();
while(1)
{
}
}
int main(void)
{
static struct rt_thread Test_thread; // 線程控制塊
printf("SWM320 ");
// 創建靜態線程
rt_thread_init(&Test_thread, // 線程控制塊
"Test", // 線程名字,在shell里面可以看到
Test_thread_entry, // 線程入口函數
RT_NULL, // 線程入口函數參數
&rt_Test_thread_stack[0], // 線程棧起始地址
sizeof(rt_Test_thread_stack), // 線程棧大小
5, // 線程的優先級
20); // 線程時間片
rt_thread_startup(&Test_thread); // 啟動線程
}
void LCD_Handler(void)
{
LCD_INTClr(LCD);
LCD_Start(LCD);
}
void GPIOC2_Handler(void)
{
EXTI_Clear(GPIOC, PIN2); // 清楚中斷標志位
GTP_TouchProcess();
}
審核編輯 :李倩
-
控制器
+關注
關注
112文章
16332瀏覽量
177813 -
adc
+關注
關注
98文章
6496瀏覽量
544470 -
通信接口
+關注
關注
3文章
237瀏覽量
30980
原文標題:SWM32S基于GT9157的觸摸芯片驅動
文章出處:【微信號:gh_ed4f95bde4df,微信公眾號:華芯微特32位MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論