前言
恩智浦“FRDM-MCXN947”評測活動由安富利和與非網(wǎng)協(xié)同舉辦。本篇內(nèi)容由與非網(wǎng)用戶發(fā)布,已獲轉載許可。原文可在與非網(wǎng)(eefocus)工程師社區(qū)查看。
觸摸屏介紹
觸摸屏介紹參見:【用戶測評(六):NXP FRDM-MCXN947 FLEXIO_SPI驅動TFT LCD】
它的主要幾個參數(shù)如下:

01與MCXN947連接關系
觸摸屏信號包含通信信號和復位信號。這里4個管腳全部配置為GPIO,用GPIO模擬IIC。

移植觸摸接口
這里選擇GPIO模擬IIC的通信方式,簡單,易于移植。
參考:【用戶測評(六):NXP FRDM-MCXN947 FLEXIO_SPI驅動TFT LCD】
01管腳配置
使用MCUXpresso Config Tools大大方便管腳配置工作。


保存配置生成代碼,最終生成兩個函數(shù)TFT_Touch_Init(),TFT_Touch_Deinit()其中TFT_Touch_Init()函數(shù)定義如下,會被BOARD_InitBootPins()調(diào)用,無需我們手動調(diào)用。
voidTFT_Touch_Init(void) { /* Enables the clock for GPIO0: Enables clock */ CLOCK_EnableClock(kCLOCK_Gpio0); /* Enables the clock for GPIO4: Enables clock */ CLOCK_EnableClock(kCLOCK_Gpio4); /* Enables the clock for PORT0 controller: Enables clock */ CLOCK_EnableClock(kCLOCK_Port0); /* Enables the clock for PORT4: Enables clock */ CLOCK_EnableClock(kCLOCK_Port4); gpio_pin_config_tCTP_SCL_config= { .pinDirection = kGPIO_DigitalOutput, .outputLogic =0U }; /* Initialize GPIO functionality on pin PIO0_14 (pin E11) */ GPIO_PinInit(TFT_TOUCH_INIT_CTP_SCL_GPIO, TFT_TOUCH_INIT_CTP_SCL_PIN, &CTP_SCL_config); gpio_pin_config_tCTP_SDA_config= { .pinDirection = kGPIO_DigitalOutput, .outputLogic =0U }; /* Initialize GPIO functionality on pin PIO0_15 (pin G13) */ GPIO_PinInit(TFT_TOUCH_INIT_CTP_SDA_GPIO, TFT_TOUCH_INIT_CTP_SDA_PIN, &CTP_SDA_config); gpio_pin_config_tCTP_RST_config= { .pinDirection = kGPIO_DigitalOutput, .outputLogic =0U }; /* Initialize GPIO functionality on pin PIO0_22 (pin B8) */ GPIO_PinInit(TFT_TOUCH_INIT_CTP_RST_GPIO, TFT_TOUCH_INIT_CTP_RST_PIN, &CTP_RST_config); gpio_pin_config_tCTP_INT_config= { .pinDirection = kGPIO_DigitalInput, .outputLogic =0U }; /* Initialize GPIO functionality on pin PIO4_16 (pin R8) */ GPIO_PinInit(TFT_TOUCH_INIT_CTP_INT_GPIO, TFT_TOUCH_INIT_CTP_INT_PIN, &CTP_INT_config); /* PORT0_14 (pin E11) is configured as PIO0_14 */ PORT_SetPinMux(TFT_TOUCH_INIT_CTP_SCL_PORT, TFT_TOUCH_INIT_CTP_SCL_PIN, kPORT_MuxAlt0); PORT0->PCR[14] = ((PORT0->PCR[14] & /* Mask bits to zero which are setting */ (~(PORT_PCR_IBE_MASK))) /* Input Buffer Enable: Enables. */ |PORT_PCR_IBE(PCR_IBE_ibe1)); /* PORT0_15 (pin G13) is configured as PIO0_15 */ PORT_SetPinMux(TFT_TOUCH_INIT_CTP_SDA_PORT, TFT_TOUCH_INIT_CTP_SDA_PIN, kPORT_MuxAlt0); PORT0->PCR[15] = ((PORT0->PCR[15] & /* Mask bits to zero which are setting */ (~(PORT_PCR_IBE_MASK))) /* Input Buffer Enable: Enables. */ |PORT_PCR_IBE(PCR_IBE_ibe1)); /* PORT0_22 (pin B8) is configured as PIO0_22 */ PORT_SetPinMux(TFT_TOUCH_INIT_CTP_RST_PORT, TFT_TOUCH_INIT_CTP_RST_PIN, kPORT_MuxAlt0); PORT0->PCR[22] = ((PORT0->PCR[22] & /* Mask bits to zero which are setting */ (~(PORT_PCR_IBE_MASK))) /* Input Buffer Enable: Enables. */ |PORT_PCR_IBE(PCR_IBE_ibe1)); /* PORT4_16 (pin R8) is configured as PIO4_16 */ PORT_SetPinMux(TFT_TOUCH_INIT_CTP_INT_PORT, TFT_TOUCH_INIT_CTP_INT_PIN, kPORT_MuxAlt0); PORT4->PCR[16] = ((PORT4->PCR[16] & /* Mask bits to zero which are setting */ (~(PORT_PCR_IBE_MASK))) /* Input Buffer Enable: Enables. */ |PORT_PCR_IBE(PCR_IBE_ibe1)); }
02觸摸接口文件說明
此屏幕廠商給的觸摸屏相關的文件如下:
touch.h是觸摸屏對外的接口文件,聲明TP_Init()函數(shù)和一個全局變量extern _m_tp_dev tp_dev表示觸摸狀態(tài)信息;
touch.c是觸摸屏接口實現(xiàn)文件,實現(xiàn)TP_init()函數(shù)并初始化全局變量tp_dev;
ctpiic.h是IIC接口的聲明,這里以GPIO模擬IIC,所以需要提供IIC各種基礎信號的聲明,如發(fā)出起始信號、停止信號、發(fā)送一個字節(jié)、讀取一個字節(jié)、發(fā)送ACK、接收ACK等基礎信號的聲明;
ctpiic.c是IIC接口的實現(xiàn),以GPIO模擬IIC的實現(xiàn);
ft6336.h是這顆FT6336觸摸IC的驅動文件,包含寄存器定義和寄存器讀寫函數(shù)、獲取觸摸狀態(tài)信息的函數(shù)的聲明;
ft6336.c是這顆FT6336觸摸IC驅動的實現(xiàn)文件,包含寄存器讀寫函數(shù)的實現(xiàn)、掃描觸摸屏獲取狀態(tài)的函數(shù)的實現(xiàn);
03觸摸接口移植適配
主要適配工作是GPIO模擬IIC功能的實現(xiàn),即修改ctpiic.c和ctpiic.h文件。
在頭文件中需要提供幾個宏定義,如下所示,因為是GPIO模擬IIC,所以需要實現(xiàn)如下的API:
CTP_IIC_Init()初始化IIC兩個管腳,初始配置為輸出模式,高電平;
CTP_IIC_Start()IIC作為Master發(fā)起起始信號;
CTP_IIC_Stop()IIC作為Master發(fā)起結束信號;
CTP_IIC_Send_Byte()IIC以GPIO模擬的方式,移位以MSB的方式發(fā)送一個字節(jié);
CTP_IIC_Read_Byte()IIC切換SDA為輸入方向,讀取一個字節(jié);
CTP_IIC_Wait_Ack()IIC作為Master等待ACK信號;
CTP_IIC_Ack()IIC發(fā)送一個ACK信號;
CTP_IIC_Nack()IIC發(fā)送一個NAK信號;
雖說有這么多的接口需要實現(xiàn),但實際上我只需要實現(xiàn)CTP_IIC_Init()初始化SCL/SDA對應的兩個管腳,然后實現(xiàn)下面的幾個宏定義即可,如下代碼所示:
CTP_SDA_IN()切換SDA管腳為輸入方向,每種MCU的驅動調(diào)用不同,這里調(diào)用NXP的API也同時以寄存器的訪問方式相結合,實現(xiàn)SDA管腳切換為輸入方式;
CTP_SDA_OUT()切換為SDA管腳為輸出方向,原理同上;
CTP_IIC_SCL(n)實現(xiàn)SCL管腳輸出高低電平;
CTP_IIC_SDA(n)實現(xiàn)SDA管腳輸出高低電平;
CTP_READ_SDA實現(xiàn)讀取SDA管腳輸入電平,這幾個宏定義直接調(diào)用NXP的庫函數(shù)即可;
#ifndef__CTPIIC_H #define__CTPIIC_H #include#include"pin_mux.h" #include"fsl_gpio.h" //IIC IO方向設置 #defineCTP_SDA_IN() do { GPIO_PortInputEnable(TFT_TOUCH_INIT_CTP_SDA_GPIO, TFT_TOUCH_INIT_CTP_SDA_GPIO_PIN_MASK); TFT_TOUCH_INIT_CTP_SDA_GPIO->PDDR&=GPIO_FIT_REG(~(1UL < PDDR|=GPIO_FIT_REG(1UL <
后面的幾個API都依賴于上面的宏定義,我們無需過多關心。下面給出其中一個函數(shù)的實現(xiàn),可以看出都依賴于上面的宏定義。
voidCTP_IIC_Send_Byte(uint8_t txd) { uint8_t t; CTP_SDA_OUT(); CTP_IIC_SCL(0);//拉低時鐘開始數(shù)據(jù)傳輸 for(t =0;t <8;t++) ? { CTP_IIC_SDA((txd &0x80) >>7); txd <<=1; CTP_IIC_SCL(1); CTP_Delay(); CTP_IIC_SCL(0); CTP_Delay(); ? } }
運行效果
先運行廠商提供的觸摸屏測試程序,發(fā)現(xiàn)很卡,屏幕刷新很卡,觸摸屏也不靈敏。這個是由原因的,模組廠商的刷屏函數(shù)是一個一個打點,沒有發(fā)揮 FLEXIO_SPI_EDMA的優(yōu)勢,所以刷屏很卡,繼而影響觸摸效果。
關于安富利
安富利是全球領先的技術分銷商和解決方案提供商,在過去一個多世紀里一直秉持初心,致力于滿足客戶不斷變化的需求。通過遍布全球的專業(yè)化和區(qū)域化業(yè)務覆蓋,安富利可在產(chǎn)品生命周期的每個階段為客戶和供應商提供支持。安富利能夠幫助各種類型的公司適應不斷變化的市場環(huán)境,在產(chǎn)品開發(fā)過程中加快設計和供應速度。安富利在整個技術價值鏈中處于中心位置,這種獨特的地位和視角讓其成為了值得信賴的合作伙伴,能夠幫助客戶解決復雜的設計和供應鏈難題,從而更快地實現(xiàn)營收。
-
恩智浦
+關注
關注
14文章
6122瀏覽量
153707 -
觸摸屏
+關注
關注
42文章
2501瀏覽量
122474 -
移植
+關注
關注
1文章
417瀏覽量
29526 -
GPIO
+關注
關注
16文章
1333瀏覽量
56432
原文標題:用戶測評(九):NXP FRDM-MCXN947 移植觸摸屏
文章出處:【微信號:AvnetAsia,微信公眾號:安富利】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
恩智浦MCX N23的官方評估板FRDM-MCXN236詳解
在恩智浦FRDM-MCXN947開發(fā)板部署DeepSeek大語言模型
使用恩智浦FRDM-MCXN947開發(fā)板LVGL移植觸摸屏
FRDM-MCXN947的純Linux命令行環(huán)境搭建
關于將Flash寫入FRDM-MCXN947的問題求解
FRDM-MCXN947在初始化lpI2C時, I2C無法正常工作怎么解決?
MCXN947 EVK 無法初始化 PHY是怎么回事?如何處理?
富昌電子推薦兩款恩智浦的MCX A和MCX N系列微控制器
《恩智浦FRDM-MCXN947開發(fā)實踐指南》上線啦
使用VSCode調(diào)試FRDM MCXN947開發(fā)板
基于Label CIFAR10 image on FRDM-MCXN947例程實現(xiàn)鞋和帽子的識別
使用NXP MCX-N板卡搭建環(huán)境及點燈
《恩智浦FRDM-MCXA156開發(fā)實踐指南》上線啦
使用恩智浦FRDM-MCXN947開發(fā)板移植觸摸屏
評論