0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SWM32S基于GT9157的觸摸芯片驅(qū)動(dòng)

0xQC_gh_ed4f95b ? 來源:華芯微特32位MCU ? 2023-04-10 09:36 ? 次閱讀

此文章介紹SWM32S基于5寸800*480分辨率液晶屏+GT9157觸摸芯片的驅(qū)動(dòng)實(shí)現(xiàn)過程。

硬件

MCU:SWM32SRET6

TFT-LCD:5.0寸 800*480電容

觸摸芯片:GT9157

MCU

SWM32S 內(nèi)嵌 ARM Cortex-M4 控制器,片上包含精度為 1%以內(nèi)的 20MHz/40MHz 時(shí)鐘,可通過 PLL 倍頻到 120MHz 時(shí)鐘,提供多種內(nèi)置 FLASH/SRAM 大小可供選擇,支持 ISP(在系統(tǒng)編程)操作及 IAP(在應(yīng)用編程)。


外設(shè)串行總線包括 1 個(gè) CAN 接口,多個(gè) UART 接口、 SPI 通信接口(支持主/從選擇)及 I2C 接口(支持主/從選擇)。此外還包括 1 個(gè) 32 位看門狗定時(shí)器, 6 組 32 位通用定時(shí)器, 1 組 32 位專用脈沖寬度測量定時(shí)器, 12 通道 16 位的 PWM 發(fā)生器, 2 個(gè) 8 通道 12 位、 1MSPS 的逐次逼近型ADC 模塊, 1 個(gè) SDIO 接口模塊, TFT-LCD 液晶驅(qū)動(dòng)模塊以及 RTC 實(shí)時(shí)時(shí)鐘、 SRAMC、 SDRAMC、NORFLC 接口控制模塊,同時(shí)提供欠壓檢測及低電壓復(fù)位功能。

觸摸芯片

9acae928-d73a-11ed-bfe3-dac502259ad0.png

GT9157擁有26個(gè)驅(qū)動(dòng)通道和14個(gè)感應(yīng)通道,以滿足更高的touch 精度要求。同時(shí)支持最先進(jìn)的短距離傳輸功能HotKnot。GT9157可同時(shí)識(shí)別5個(gè)觸摸點(diǎn)位的實(shí)時(shí)準(zhǔn)確位置,移動(dòng)軌跡及觸摸面積。并可根據(jù)主控需要,讀取相應(yīng)點(diǎn)數(shù)的觸摸信息,其內(nèi)部結(jié)構(gòu)如上圖所示。

9ae8df78-d73a-11ed-bfe3-dac502259ad0.png

GT9157觸控芯片有兩個(gè)備選的I2C通訊地址,這是由芯片的上電時(shí)序決定,如圖所示。上 電時(shí)序有Reset 引腳和INT引腳生成,若Reset引腳從低電電平轉(zhuǎn)變到高電平期間,INT 引腳為高電平的時(shí)候,觸控芯片使用的I2C設(shè)備地址為0x28/0x29(8位寫、讀地址),7位地址為0x14;若Reset引腳從低電電平轉(zhuǎn)變到高電平期間,INT 引腳一直為低電平,則觸控芯片使用的I2C設(shè)備地址為0xBA/0xBB(8位寫、讀地址),7位地址為0x5D。

代碼

9b0a7160-d73a-11ed-bfe3-dac502259ad0.png

紅色框內(nèi)文件相對重要并解讀

( 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)

{

// 第一階段設(shè)置端口,并拉低兩個(gè)端口

GPIO_Init(GPIO_PORT_GT_RST, GPIO_PIN_GT_RST, 1, 0, 0); // 復(fù)位腳 輸出

GPIO_Init(GPIO_PORT_GT_INT, GPIO_PIN_GT_INT, 1, 0, 0); // 中斷腳

GPIO_ClrBit(GPIOC, PIN3);

GPIO_ClrBit(GPIOC, PIN2); // 拉低兩個(gè)端口的電平,準(zhǔn)備復(fù)位

rt_thread_delay(10);

// 第二階段復(fù)位芯片

GPIO_SetBit(GPIOC, PIN3); // 拉高開始復(fù)位芯片

rt_thread_delay(10);

// 第三階段設(shè)置中斷引腳為 中斷功能

GPIO_Init(GPIOC, PIN2, 0, 0, 0);

EXTI_Init(GPIOC, PIN2, EXTI_RISE_EDGE); // 上升沿觸發(fā)中斷

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); // 關(guān)閉外部中斷

GPIO_Init(GPIOC, PIN2, 1, 0, 1); // 回到普通輸出端口

GPIO_ClrBit(GPIOC, PIN2);

}

/**********************************************************************************************************************

* 函數(shù)名稱: bsp_WrNumByte()

* 功能說明: IIC寫Num個(gè)字節(jié)

* 輸 入: reg 寄存器地址,*p數(shù)據(jù),WrByteNum寫入的數(shù)據(jù)個(gè)數(shù)

* 輸 出: 0,正常 其他,失敗

* 注意事項(xiàng):

**********************************************************************************************************************/

uint8_t bsp_GT9XX_WrReg(uint8_t IdAddr,uint8_t *p,uint8_t WrByteNum)

{

I2C0->MSTDAT = IdAddr | 0; // 發(fā)送器件地址+寫命令

I2C0->MSTCMD = (1 << I2C_MSTCMD_STA_Pos) |??

(1 << I2C_MSTCMD_WR_Pos);? // 發(fā)送起始位和從機(jī)地址

while(I2C0->MSTCMD & I2C_MSTCMD

以上程序是我們?yōu)橐浦病?bsp_GT9XX.c”文件做的基本驅(qū)動(dòng),接下來我們詳細(xì)分析一下,


這部分源碼具體實(shí)現(xiàn)了什么功能。I2C_Mst_Init()函數(shù)中,我們首先聲明了一個(gè)結(jié)構(gòu)體,接著將 GPIOA.4 和 GPIOA.5進(jìn)行了特殊功能管腳的分配,設(shè)置為 I2C 接口。接著是給結(jié)構(gòu)體賦值, 他們的意義分別是設(shè)置為主機(jī)模式;地址為 7 位接口;I2C 通信時(shí)鐘頻率設(shè)為 400HHz;不使能中斷模式,接著是調(diào)用庫函數(shù)進(jìn)行給寄存器賦值;最后打開 I2C 接口。接下來 bsp_GT9XX_InitRst()函數(shù)為初始化,主要是設(shè)置端口,并將 GT9157 的設(shè)備 I2C 地址設(shè)置為 0xBA,這個(gè)設(shè)置過程參加上面的時(shí)序;接著將 GPIOC.2 設(shè)置為中斷,上升沿觸發(fā)。函數(shù) GT9XX_IRQEnable()和 GT9XX_IRQDisable(),顧名思義,就是使能中斷和失能中斷,這個(gè)好理解最后就是兩個(gè)讀寫 GT9157 寄存器的函數(shù),這兩個(gè)函數(shù),需要讀者先理解 I2C 通信的基本協(xié)議,之后安裝基本協(xié)議,一句、一句的理解,這里需要注意的是

I2C0->MSTCMD = (1 << I2C_MSTCMD_RD_Pos) ?|

(1 << I2C_MSTCMD_ACK_Pos) |

(1 << I2C_MSTCMD_STO_Pos);

這三行程序,當(dāng)我們在跑該程序的時(shí)候, 一般是先寫寄存器,再讀數(shù),而此時(shí)如果沒有這三行程序,會(huì)把下一次的讀數(shù)據(jù)和寫寄存器混淆,導(dǎo)致 GT9157 芯片不認(rèn)識(shí)此協(xié)議。當(dāng)我們加了之后,就有結(jié)束,有開始,繼而芯片能夠識(shí)別此協(xié)議。

現(xiàn)象

復(fù)位 初始化后串口打印,可以看到x軸800 ,y軸480

9b3309cc-d73a-11ed-bfe3-dac502259ad0.png

進(jìn)行一個(gè)點(diǎn)的觸摸 ID:0 定位是(257,237) 寬度62

9b4c9f68-d73a-11ed-bfe3-dac502259ad0.png

進(jìn)行兩個(gè)點(diǎn)的觸摸 可以看到ID0 ID1

9b4c9f68-d73a-11ed-bfe3-dac502259ad0.png

進(jìn)行五個(gè)點(diǎn)的觸摸 可以看到ID0 ID1 ID2 ID3 ID4

9b835e90-d73a-11ed-bfe3-dac502259ad0.png

附錄

程序代碼

#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字節(jié))

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 ");

// 創(chuàng)建靜態(tài)線程

rt_thread_init(&Test_thread, // 線程控制塊

"Test", // 線程名字,在shell里面可以看到

Test_thread_entry, // 線程入口函數(shù)

RT_NULL, // 線程入口函數(shù)參數(shù)

&rt_Test_thread_stack[0], // 線程棧起始地址

sizeof(rt_Test_thread_stack), // 線程棧大小

5, // 線程的優(yōu)先級(jí)

20); // 線程時(shí)間片

rt_thread_startup(&Test_thread); // 啟動(dòng)線程

}

void LCD_Handler(void)

{

LCD_INTClr(LCD);

LCD_Start(LCD);

}

void GPIOC2_Handler(void)

{

EXTI_Clear(GPIOC, PIN2); // 清楚中斷標(biāo)志位

GTP_TouchProcess();

}

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16389

    瀏覽量

    178422
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6509

    瀏覽量

    544939
  • 通信接口
    +關(guān)注

    關(guān)注

    3

    文章

    239

    瀏覽量

    31005

原文標(biāo)題:SWM32S基于GT9157的觸摸芯片驅(qū)動(dòng)

文章出處:【微信號(hào):gh_ed4f95bde4df,微信公眾號(hào):華芯微特32位MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RK3588-電容觸控芯片GT9XX觸摸調(diào)試筆記

    基于RK3588平臺(tái), 電容觸控芯片GT9XX觸摸調(diào)試總結(jié)。 觸摸芯片:電容觸控芯片
    的頭像 發(fā)表于 06-13 10:47 ?2888次閱讀
    RK3588-電容觸控<b class='flag-5'>芯片</b><b class='flag-5'>GT</b>9XX<b class='flag-5'>觸摸</b>調(diào)試筆記

    【i.MX6ULL】驅(qū)動(dòng)開發(fā)12——電容觸摸驅(qū)動(dòng)實(shí)踐(上)

    本篇主要介紹了多點(diǎn)觸摸芯片GT911的驅(qū)動(dòng)編寫與使用,并通過將觸摸點(diǎn)實(shí)時(shí)打印的方式,測試觸摸功能
    的頭像 發(fā)表于 05-30 09:38 ?5302次閱讀
    【i.MX6ULL】<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)12——電容<b class='flag-5'>觸摸</b><b class='flag-5'>驅(qū)動(dòng)</b>實(shí)踐(上)

    SWM32S單片機(jī)的SDRAM和LCD控制器的用法

    SWM32S單片機(jī)內(nèi)部集成了8MB的SDRAM以及LCD控制器,非常適合用于屏幕驅(qū)動(dòng)。其中LCD控制器支持RGB565格式的接口,最大支持1024*768分辨率。今天來介紹一下這兩個(gè)外設(shè)的用法。
    發(fā)表于 09-26 11:22 ?2210次閱讀

    深圳回收觸摸IC,收購觸摸IC

    868 GT911 GT9110 GT912 GT913 GT9137 GT9147
    發(fā)表于 01-14 18:07

    專業(yè)回收觸摸ic 收購觸摸ic

    9110 GT912 GT913 GT9137 GT9147 GT915 GT9157
    發(fā)表于 05-14 16:30

    深圳回收觸摸IC 高價(jià)收購觸摸IC

    913 GT9137 GT9147 GT915 GT9157 GT9158 GT9271
    發(fā)表于 09-01 10:39

    如何對SWM32SRET6芯片進(jìn)行測試呢

    SWM32SRET6芯片有哪些特點(diǎn)呢?如何對SWM32SRET6芯片進(jìn)行測試呢?
    發(fā)表于 12-21 06:27

    分享芯片--SWM254S(霍爾開關(guān)IC)

    1. 概述 SWM254S是一顆微功耗、高靈敏度S極單極性的霍爾開關(guān)傳感裝置。SWM254S使用薄體縮小型貼片DTSP4(2.8*1.5*0.7mm)封裝,工作溫度范圍為-20~85°C
    發(fā)表于 05-27 15:36

    SWM201系列MCU數(shù)據(jù)手冊

    運(yùn)算放大器模塊,4 路比較器模塊,并提供欠壓檢測及低電壓復(fù)位功能。SWM20DC6U7 內(nèi)部集成 6N 型 90V 三相半橋高邊和低邊驅(qū)動(dòng)器。SWM20PG6S6 內(nèi)部集成 P-N 型最高 40V 三相半橋高邊和低邊
    發(fā)表于 09-14 08:56

    gt9xx觸摸屏(電容屏)驅(qū)動(dòng)代碼

    gt9xx 觸摸屏(電容屏)驅(qū)動(dòng)代碼,飛思卡爾平臺(tái)。
    發(fā)表于 05-16 11:05 ?27次下載

    LTDC—LCD觸摸畫板

    -ST固件庫版本:1.5.1 【 !】功能簡介: 驅(qū)動(dòng)5點(diǎn)觸控電容屏,實(shí)現(xiàn)簡單的觸摸畫板功能。 學(xué)習(xí)目的:學(xué)習(xí)如何驅(qū)動(dòng)觸摸屏(GT9157
    發(fā)表于 12-13 15:43 ?14次下載

    電容式觸摸屏控制芯片GT811數(shù)據(jù)手冊

    5 點(diǎn)電容式觸摸屏控制芯片 GT811,采用投射式電容檢測原理,由 16 個(gè)驅(qū)動(dòng)通道與 10 個(gè)感應(yīng)通道組成觸摸檢測網(wǎng)絡(luò),通過內(nèi)置模擬放大電
    發(fā)表于 09-29 10:13 ?14次下載

    MAX9157EHJ+ 接口 - 驅(qū)動(dòng)器,接收器,收發(fā)器

    電子發(fā)燒友網(wǎng)為你提供Maxim(Maxim)MAX9157EHJ+相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有MAX9157EHJ+的引腳圖、接線圖、封裝手冊、中文資料、英文資料,MAX9157EHJ+真值表,MAX
    發(fā)表于 01-13 18:29
    MAX<b class='flag-5'>9157</b>EHJ+ 接口 - <b class='flag-5'>驅(qū)動(dòng)</b>器,接收器,收發(fā)器

    MAX9157EGJ+T 接口 - 驅(qū)動(dòng)器,接收器,收發(fā)器

    電子發(fā)燒友網(wǎng)為你提供Maxim(Maxim)MAX9157EGJ+T相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊,更有MAX9157EGJ+T的引腳圖、接線圖、封裝手冊、中文資料、英文資料,MAX9157EGJ+T真值表,MAX
    發(fā)表于 01-28 18:03
    MAX<b class='flag-5'>9157</b>EGJ+T 接口 - <b class='flag-5'>驅(qū)動(dòng)</b>器,接收器,收發(fā)器

    基于32位高速M(fèi)CU芯片SWM201GS7的單電阻空氣凈化器電機(jī)驅(qū)動(dòng)DEMO方案

    基于32位高速M(fèi)CU芯片SWM201GS7的單電阻空氣凈化器電機(jī)驅(qū)動(dòng)DEMO方案
    的頭像 發(fā)表于 11-07 17:15 ?910次閱讀
    基于32位高速M(fèi)CU<b class='flag-5'>芯片</b><b class='flag-5'>SWM</b>201GS7的單電阻空氣凈化器電機(jī)<b class='flag-5'>驅(qū)動(dòng)</b>DEMO方案