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

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

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


保存配置生成代碼,最終生成兩個函數TFT_Touch_Init(),TFT_Touch_Deinit()其中TFT_Touch_Init()函數定義如下,會被BOARD_InitBootPins()調用,無需我們手動調用。
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()函數和一個全局變量extern _m_tp_dev tp_dev表示觸摸狀態信息;
touch.c是觸摸屏接口實現文件,實現TP_init()函數并初始化全局變量tp_dev;
ctpiic.h是IIC接口的聲明,這里以GPIO模擬IIC,所以需要提供IIC各種基礎信號的聲明,如發出起始信號、停止信號、發送一個字節、讀取一個字節、發送ACK、接收ACK等基礎信號的聲明;
ctpiic.c是IIC接口的實現,以GPIO模擬IIC的實現;
ft6336.h是這顆FT6336觸摸IC的驅動文件,包含寄存器定義和寄存器讀寫函數、獲取觸摸狀態信息的函數的聲明;
ft6336.c是這顆FT6336觸摸IC驅動的實現文件,包含寄存器讀寫函數的實現、掃描觸摸屏獲取狀態的函數的實現;
03觸摸接口移植適配
主要適配工作是GPIO模擬IIC功能的實現,即修改ctpiic.c和ctpiic.h文件。
在頭文件中需要提供幾個宏定義,如下所示,因為是GPIO模擬IIC,所以需要實現如下的API:
CTP_IIC_Init()初始化IIC兩個管腳,初始配置為輸出模式,高電平;
CTP_IIC_Start()IIC作為Master發起起始信號;
CTP_IIC_Stop()IIC作為Master發起結束信號;
CTP_IIC_Send_Byte()IIC以GPIO模擬的方式,移位以MSB的方式發送一個字節;
CTP_IIC_Read_Byte()IIC切換SDA為輸入方向,讀取一個字節;
CTP_IIC_Wait_Ack()IIC作為Master等待ACK信號;
CTP_IIC_Ack()IIC發送一個ACK信號;
CTP_IIC_Nack()IIC發送一個NAK信號;
雖說有這么多的接口需要實現,但實際上我只需要實現CTP_IIC_Init()初始化SCL/SDA對應的兩個管腳,然后實現下面的幾個宏定義即可,如下代碼所示:
CTP_SDA_IN()切換SDA管腳為輸入方向,每種MCU的驅動調用不同,這里調用NXP的API也同時以寄存器的訪問方式相結合,實現SDA管腳切換為輸入方式;
CTP_SDA_OUT()切換為SDA管腳為輸出方向,原理同上;
CTP_IIC_SCL(n)實現SCL管腳輸出高低電平;
CTP_IIC_SDA(n)實現SDA管腳輸出高低電平;
CTP_READ_SDA實現讀取SDA管腳輸入電平,這幾個宏定義直接調用NXP的庫函數即可;
#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都依賴于上面的宏定義,我們無需過多關心。下面給出其中一個函數的實現,可以看出都依賴于上面的宏定義。
voidCTP_IIC_Send_Byte(uint8_t txd) { uint8_t t; CTP_SDA_OUT(); CTP_IIC_SCL(0);//拉低時鐘開始數據傳輸 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(); ? } }
運行效果
先運行廠商提供的觸摸屏測試程序,發現很卡,屏幕刷新很卡,觸摸屏也不靈敏。這個是由原因的,模組廠商的刷屏函數是一個一個打點,沒有發揮 FLEXIO_SPI_EDMA的優勢,所以刷屏很卡,繼而影響觸摸效果。
關于安富利
安富利是全球領先的技術分銷商和解決方案提供商,在過去一個多世紀里一直秉持初心,致力于滿足客戶不斷變化的需求。通過遍布全球的專業化和區域化業務覆蓋,安富利可在產品生命周期的每個階段為客戶和供應商提供支持。安富利能夠幫助各種類型的公司適應不斷變化的市場環境,在產品開發過程中加快設計和供應速度。安富利在整個技術價值鏈中處于中心位置,這種獨特的地位和視角讓其成為了值得信賴的合作伙伴,能夠幫助客戶解決復雜的設計和供應鏈難題,從而更快地實現營收。
-
恩智浦
+關注
關注
14文章
6095瀏覽量
147210 -
觸摸屏
+關注
關注
42文章
2460瀏覽量
121965 -
移植
+關注
關注
1文章
414瀏覽量
29393 -
GPIO
+關注
關注
16文章
1328瀏覽量
56222
原文標題:用戶測評(九):NXP FRDM-MCXN947 移植觸摸屏
文章出處:【微信號:AvnetAsia,微信公眾號:安富利】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
恩智浦MCX N23的官方評估板FRDM-MCXN236詳解
在恩智浦FRDM-MCXN947開發板部署DeepSeek大語言模型
使用恩智浦FRDM-MCXN947開發板LVGL移植觸摸屏
FRDM-MCXN947的純Linux命令行環境搭建
關于將Flash寫入FRDM-MCXN947的問題求解
FRDM-MCXN947在初始化lpI2C時, I2C無法正常工作怎么解決?
富昌電子推薦兩款恩智浦的MCX A和MCX N系列微控制器
基于Label CIFAR10 image on FRDM-MCXN947例程實現鞋和帽子的識別
使用恩智浦FRDM-MCXN947開發板移植觸摸屏
評論