前言
恩智浦“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文章
5996浏览量
119717 -
触摸屏
+关注
关注
42文章
2404浏览量
118944 -
移植
+关注
关注
1文章
402浏览量
28788 -
GPIO
+关注
关注
16文章
1289浏览量
54415
原文标题:用户测评(九):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系列微控制器
恩智浦新品MCX N系列线下培训来啦!LVGL、AI等超多精彩Demo演示,快来报名吧!

基于Label CIFAR10 image on FRDM-MCXN947例程实现鞋和帽子的识别

评论