STM32硬件接口I2C应用(基于FT6336)

目录

概述

1 硬件介绍

1.1 ST7796-LCD

1.2 MCU IO与LCD PIN对应关系

1.3 MCU IO与Touch PIN对应关系

2 FT6336的寄存器

2.1 FT6336寄存器列表

2.2 寄存器功能介绍 

3 STM32Cube控制配置I2C

3.1  软硬件版本信息

3.2 I2C参数配置

3.3 使用STM32Cube产生工程

4 HAL库函数介绍

4.1 初始化函数

4.2 写数据函数

 4.3 读数据函数

5 FT6336驱动程序

5.1 读写寄存器接口

5.2 初始化函数

5.3 源代码

6 触摸屏功能实现

6.1 触摸屏应用程序

6.2 源代码

7 测试

7.1 代码实现

7.2 测试


概述

本文主要介绍FT6336触摸屏芯片的相关内容,主要包括其寄存器的信息,还介绍了LCD模组上使用的芯片的引脚定义,以及和STM32 IO的对应关系。重点介绍使用STM32硬件I2C接口驱动FT6336的实现方法。笔者使用基于STM32F407的板卡,使用STM32Cube创建工程,并完成整个项目的FT6336驱动程序和触摸功能程序,并验证其功能。

1 硬件介绍

1.1 ST7796-LCD

LCD的PIN引脚功能介绍

序号模块引脚引脚说明
1VCC屏电源正
2GND屏电源地
3LCD_CS液晶屏片选控制信号,低电平有效
4LCD_RST液晶屏复位控制信号,低电平复位
5LCD_RS液晶屏命令/数据选择控制信号

高电平:数据,低电平:命令

6SDI(MOSI)SPI总线写数据信号(SD卡和液晶屏共用)
7SCKSPI总线时钟信号(SD卡和液晶屏共用)
8LED液晶屏背光控制信号(如需要控制,请接引脚,如不需要控制,可以不接)
9SDO(MISO)SPI总线读数据信号(SD卡和液晶屏共用)
10CTP_SCL电容触摸屏IIC总线时钟信号(无触摸屏的模块不需连接)
11CTP_RST电容触摸屏复位控制信号,低电平复位(无触摸屏的模块不需连接)
12CTP_SDA电容触摸屏IIC总线数据信号(无触摸屏的模块不需连接)
13CTP_INT电容触摸屏IIC总线触摸中断信号,产生触摸时,输入低电平到主控(无触摸屏的模块不需连接)
14SD_CSSD卡片选控制信号,低电平有效(不使用SD卡功能,可不接)

实体LCD Port对应关系如下图所示

1.2 MCU IO与LCD PIN对应关系

STM32 PIN引脚LCD PIN引脚
PB5-MOSIMOSI
PB4-MISOMISO
PB3-SCKSCK
PB6CS
PB9RST
PB8RS

1.3 MCU IO与Touch PIN对应关系

STM32 PIN引脚touch PIN引脚
PH4I2C-SCK
PH5I2C-SDA
PH10INIT
PH9RST

2 FT6336的寄存器

2.1 FT6336寄存器列表

2.2 寄存器功能介绍 

1)设备模式配置

 2)姿势ID寄存器

 3)TD状态寄存器

4) Pn_XH寄存器

 5) Pn_XL寄存器

 6) Pn_YH寄存器

 7) Pn_YL寄存器

 8) Pn_WEIGHT寄存器 

  9) Pn_MISC寄存器 

3 STM32Cube控制配置I2C

3.1  软硬件版本信息

STM32CubeMX 版本: 6.11

HAL库版本: STM32Cube_FW_F4_V1.27.1

3.2 I2C参数配置

STM32F407 的标准I2C接口最大支持100K工作频率,笔者选择最大工作频100k,以配置I2C的参数。

I2C使用的GPIO接口如下:

使用MCU类型和HAL库的版本

3.3 使用STM32Cube产生工程

 在配置完成项目后,点击GENERATE生成项目,打开项目后项目目录如下,和I2C相关的代码如下:

代码第40行:选择I2C2作为硬件接口

代码第41行:I2C通信速率为100K

代码第44行:定义地址位7bit

4 HAL库函数介绍

STM32 HAL库函数数量很多,本文仅介绍笔者使用的一些函数接口。其他函数在使用的时候在具体研究,而不许把每个函数搞清楚才去应用。

4.1 初始化函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);

参数介绍

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

 一个使用案例: 如果已经初始化完成hi2c结构,初始化时,直接调用该结构体即可。

4.2 写数据函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Mem_Write(   I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

MemAddress:内存地址

MemAddSize:内存地址大小

pData:            写数据指针

Size:               写数据大小

Timeout:         写数据超时时间

 4.3 读数据函数

函数原型:

HAL_StatusTypeDef HAL_I2C_Mem_Read( I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

参数介绍:

hi2c:  指向I2C_HandleTypeDef结构体的指针,该结构体包含指定I2C的配置信息。

DevAddress: 目标设备地址:设备的7位地址值在调用接口之前,必须将数据表向左移动

MemAddress:内存地址

MemAddSize:内存地址大小

pData:            读数据指针

Size:               读数据大小

Timeout:         读数据超时时间

5 FT6336驱动程序

5.1 读写寄存器接口

代码57行: 调用HAL库中的写数据函数,向FT6336寄存器写数据

代码69行:调用HAL库中的读数据函数,从FT6336寄存器读取数据

5.2 初始化函数

代码82行: 初始化Touch相关的IO

代码83行: RESET FT6336

代码85行:读取FT6336的ID参数

5.3 源代码

创建ft6336.c文件,编写如下代码:

/* USER CODE BEGIN Header */
/**
******************************************************************************
* File Name            : ft6336.c
* Description          : I2C drive based on STM32F4
* STM32 HAL library ver: STM32Cube_FW_F4_V1.27.1
* 
******************************************************************************
* @attention
*
* Copyright (c) 2024~2029 mingfei.tang
* All rights reserved.
*
*************************************************************************
*/
/* USER CODE END Header */
#include "ft6336.h"static void touch_delay_us(uint32_t us)
{uint32_t i=0;while(us--){for(i=0;i<1000;i++);}
}static void ft6336_TouchIO_Init( void )
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */RCC_TOUCH_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIO_PORT_TOUCH, FT_RST_PIN,GPIO_PIN_RESET);/*Configure GPIO pin : RST */GPIO_InitStruct.Pin = FT_RST_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIO_PORT_TOUCH, &GPIO_InitStruct);
}static void  ft6336_rest( void )
{FT_RST_L;touch_delay_us( 10 );FT_RST_H;touch_delay_us( 50000 );
}uint8_t ft6336_WeReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Mem_Write( &hi2c2, FT6336_ADDR, regAdd, I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);if( status == HAL_OK)return FT6336_OK;elsereturn FT6336_ERROR; 
}uint8_t ft6336_RdReg( uint16_t regAdd, uint8_t *pData, uint16_t Size )
{HAL_StatusTypeDef status;status = HAL_I2C_Mem_Read( &hi2c2, FT6336_ADDR, regAdd, I2C_MEMADD_SIZE_8BIT, pData, Size, 1000);if( status == HAL_OK)return FT6336_OK;elsereturn FT6336_ERROR; 
}int ft6336_Init( void )
{uint8_t id;ft6336_TouchIO_Init();ft6336_rest();// read chip id ft6336_RdReg(FT_ID_G_FOCALTECH_ID,&id, 1);if(id != PANNEL_ID){return FT_FALSE;}return FT_TRUE;
}/* End of this file */

 创建ft6336.h文件,编写如下代码:

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : ft6336.h* Description        : I2C drive based on STM32F4* ******************************************************************************* @attention** Copyright (c) 2024~2029 mingfei.tang* All rights reserved.***************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __FT6336_H
#define __FT6336_H#ifdef __cplusplusextern "C" {
#endif#include "stdio.h"
#include "main.h"#define RCC_TOUCH_CLK_ENABLE()       __HAL_RCC_GPIOH_CLK_ENABLE()#define GPIO_PORT_TOUCH              GPIOH#define FT_RST_PIN                   GPIO_PIN_9      //FT6636复位引脚
#define FT_INT_PIN                   GPIO_PIN_10     //FT6636中断引脚#define FT_RST_L                     HAL_GPIO_WritePin(GPIO_PORT_TOUCH, FT_RST_PIN, GPIO_PIN_RESET)
#define FT_RST_H                     HAL_GPIO_WritePin(GPIO_PORT_TOUCH, FT_RST_PIN, GPIO_PIN_SET)#define FT6336_OK                 1
#define FT6336_ERROR              0#define FT_TRUE                   1
#define FT_FALSE                  0#define FT6336_ADDR              0X71//FT5426 部分寄存器定义 
#define FT_DEVIDE_MODE           0x00         //FT6336模式控制寄存器
#define FT_REG_NUM_FINGER        0x02         //触摸状态寄存器#define FT_TP1_REG               0X03         //第一个触摸点数据地址
#define FT_TP2_REG               0X09         //第二个触摸点数据地址#define FT_ID_G_CIPHER_MID       0x9F         //芯片代号(中字节) 默认值0x26
#define FT_ID_G_CIPHER_LOW       0xA0         //芯片代号(低字节) 0x01: Ft6336G  0x02: Ft6336U 
#define FT_ID_G_LIB_VERSION      0xA1         //版本
#define FT_ID_G_CIPHER_HIGH      0xA3         //芯片代号(高字节) 默认0x64 
#define FT_ID_G_MODE             0xA4         //FT6636中断模式控制寄存器
#define FT_ID_G_FOCALTECH_ID     0xA8         //VENDOR ID 默认值为0x11
#define FT_ID_G_THGROUP          0x80         //触摸有效值设置寄存器
#define FT_ID_G_PERIODACTIVE     0x88         //激活状态周期设置寄存器// MATCH VALUE LIST 
#define PANNEL_ID                0x11int ft6336_Init( void );
uint8_t ft6336_RdReg( uint16_t regAdd, uint8_t *pData, uint16_t Size );
uint8_t ft6336_WeReg( uint16_t regAdd, uint8_t *pData, uint16_t Size );#ifdef __cplusplus
}
#endif#endif /*__FT6336_H */

6 触摸屏功能实现

6.1 触摸屏应用程序

代码第45行:读取当前触摸点的个数

代码第59行:读取触摸点的值

6.2 源代码

 创建usr_touch.c文件,编写如下代码:

/*********************************************************************************                              (c) Copyright 2024, tangmingfei2013@126.com*                                      All Rights Reserved* @file    usr_touch.c* @author  mingfei tang* @version V1.0.0* @date    2018/03/25* @description:This source code and any compilation or derivative thereof is the proprietaryinformation of mingfei.tang and is confidential in nature.Under no circumstances is this software to be combined with anyOpen Source Software in any way or placed under an Open Source Licenseof any type without the express written permission of mingfei.tang******************************************************************************
**/
/* Includes ------------------------------------------------------------------*/
#include "usr_touch.h"
#include "lcd_drv.h"extern _lcd_dev lcddev;
const uint16_t touch_press_reg[2]={FT_TP1_REG,FT_TP2_REG};
static int touch_isOK;void usr_touchInit( void )
{touch_isOK = ft6336_Init();
}uint8_t usr_ScanTouchProcess( stru_pos *pPos)
{uint8_t buf[4];uint8_t i = 0;uint8_t set = FT_FALSE;;uint8_t pointNub = 0;static uint8_t cnt = 0;if( touch_isOK == FT_FALSE )return set;cnt++;if((cnt%10)==0 || cnt<10){// read number of touch points ft6336_RdReg(FT_REG_NUM_FINGER,&pointNub,1);pointNub= pointNub&0x0f;if( pointNub && (pointNub < 3) ){cnt=0;// read the point value pPos->status_bit.tpDown = 1;pPos->status_bit.tpPress = 1;pPos->status_bit.ptNum = pointNub;for( i=0; i < CTP_MAX_TOUCH; i++){ft6336_RdReg( touch_press_reg[i], buf, 4 );if( pPos->status_bit.ptNum ){switch(lcddev.dir){case 0:pPos->xpox[i]=((uint16_t)(buf[0]&0X0F)<<8)+buf[1];pPos->ypox[i]=((uint16_t)(buf[2]&0X0F)<<8)+buf[3];break;case 1:pPos->ypox[i]=lcddev.height-(((uint16_t)(buf[0]&0X0F)<<8)+buf[1]);pPos->xpox[i]=((uint16_t)(buf[2]&0X0F)<<8)+buf[3];break;case 2:pPos->xpox[i]=lcddev.width-(((uint16_t)(buf[0]&0X0F)<<8)+buf[1]);pPos->ypox[i]=lcddev.height-(((uint16_t)(buf[2]&0X0F)<<8)+buf[3]);break;case 3:pPos->ypox[i] = ((uint16_t)(buf[0]&0X0F)<<8)+buf[1];pPos->xpox[i] = lcddev.width-(((uint16_t)(buf[2]&0X0F)<<8)+buf[3]);break;} printf("x[%d]:%d,y[%d]:%d\r\n",i,pPos->xpox[i],i,pPos->ypox[i]);}} set = FT_TRUE;if( pPos->xpox[0]==0 && pPos->ypox[0]==0){pPos->status = 0;}}}if( pPos->status_bit.ptNum == 0){ if( pPos->status_bit.tpDown ){   pPos->status_bit.tpDown = 0;}else{ pPos->xpox[0] = 0xffff;pPos->ypox[0] = 0xffff;pPos->status = 0;}}if( cnt>240 )cnt=10;return set;
}/* End of this file */ 

 创建usr_touch.h文件,编写如下代码:

#ifndef __USR_TOUCH_H
#define __USR_TOUCH_H#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "ft6336.h"#define CTP_MAX_TOUCH               2typedef struct
{uint8_t ptNum                    : 4;uint8_t tpDown                   : 1;uint8_t tpPress                  : 1;uint8_t res                      : 2;
} Status_bit;typedef struct
{uint16_t xpox[CTP_MAX_TOUCH];uint16_t ypox[CTP_MAX_TOUCH];union{uint8_t status;Status_bit status_bit;};
}stru_pos;void usr_touchInit( void );
uint8_t usr_ScanTouchProcess( stru_pos *pPos);#endif  /*  __USR_TOUCH_H */

7 测试

7.1 代码实现

代码110行: 初初始化touch接口

代码117行: monitor触摸点

7.2 测试

编译代码下载到板卡中

点击屏幕,运行触摸点信息如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/356214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#修改 EXE 文件图标和 winForm 窗口图标

修改 EXE 文件图标 1.准备好图片&#xff0c;转换为 Icon 图片&#xff1b; 2.右键工程&#xff0c;选择属性&#xff1b; 3.选择 Icon 图标即可&#xff1b; 4.重新生成可执行文件&#xff0c;查看。 修改 winForm 窗口图标 1.选中 winForm &#xff0c;查看属性&#x…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的&#xff0c;不过在暂停游戏的时候&#xff0c;需要对角色进行预览和设置&#xff0c;为了实现这个功能&#xff0c;是通过鼠标控制相机的操作&#xff0c;为了使相机的操作丝滑&#xff0c;获取鼠标操作系数乘以Time.delta…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞&#xff0c;需要对这种流行现象进行数据分析。数据分析首先需要有数据&#xff0c;本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法&#xff0c;大型的网络爬虫多基于成熟的爬虫框架&#…

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时&#xff0c;例如从 Eureka 迁移到 Nacos&#xff0c;可以在过渡期内同时使用两个注册中心&#xff0c;确保服务平稳迁移&#xff0c;逐步过渡&#xff0c;避免一次性切换带来的风险。 兼容性考虑: 不同的…

这款跨界的软件也是非常强大!更快, 更轻, 更丝滑!

在网络世界中&#xff0c;一个好的浏览器就像一艘快速的帆船&#xff0c;帮助我们更快地到达目的地。迅雷浏览器正是这样一艘帆船&#xff0c;它不仅能够快速地带领我们浏览信息&#xff0c;还能提供安全的下载体验&#xff0c;让我们的网络生活更加丰富多彩。 迅雷浏览器&…

Python | Leetcode Python题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; class Solution:def trailingZeroes(self, n: int) -> int:ans 0while n:n // 5ans nreturn ans

AI播客下载:Machine Learning Street Talk(AI机器学习)

该频道由 Tim Scarfe 博士、Yannic Kilcher 博士和 Keith Duggar 博士管理。 他们做了出色的工作&#xff0c;对每个节目进行了彻底的研究&#xff0c;并与机器学习行业中一些受过最高教育、最全面的嘉宾进行了双向对话。 每一集都会教授一些新内容&#xff0c;并且提供未经过滤…

VMware Workstation安装Windows Server2019系统详细操作步骤

虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 实现操作 创建虚拟机 创建新的虚拟机 自定义->下一步 默认即可&#xff0c;下一步 稍后安装操作系统->下一步 按照图下所示选择好系统->下一步 设置好虚拟机名称和位置->下一步 默认即可&#xff0…

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要&#xff1a; 随着信息化技术的飞速发展&#xff0c;智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序&#xff0c;该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…

Qt源码阅读笔记:初步了解QtCore模块目录结构

Qt框架是一个跨平台的C应用程序框架&#xff0c;广泛用于开发图形用户界面程序以及用于无界面后台操作的工具和服务器。它由多个模块组成&#xff0c;其中QtCore模块提供了核心的非GUI功能。 QtCore 提供了元对象系统&#xff0c;扩展了c 在元对象系统的基础上&#xff0c;qt又…

Redis—Hash数据类型及其常用命令详解

文章目录 Redis概述Hash类型Hash类型常用命令1 HSET&#xff1a;添加或者修改hash类型key的field的值2 HGET &#xff1a;获取一个hash类型key的field的值3 HMSET&#xff1a;批量添加多个hash类型key的field的值4 HMGET&#xff1a;批量获取多个hash类型key的field的值5 HGETA…

Windows11 24H2网络功能全新升级:全面支持Wi-Fi 7!

Windows11 24H2版本不仅推出了很多新功能&#xff0c;也全面升级了网络功能&#xff0c;全面支持Wi-Fi 7&#xff0c;带给用户最快的网速体验&#xff0c;还支持用户通过二维码分享Wi-Fi密码&#xff0c;操作更加便捷&#xff0c;也更新了SMB、LAPS和NDR协议。接下来跟随小编去…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术&#xff08;Gen AI&#xff09;&#xff0c;零售商可以创造…

BGP路由反射器实验

实验内容&#xff1a; 通过本实验验证bgp路由反射器的规则 1. 从client收到的路由更新&#xff0c;反射到non-client和client&#xff0c;同时发送给EBGP邻居 2. 从non-client收到的路由更新&#xff0c;只反射到client&#xff0c;同时发送给EBGP邻居 3. 从EBGP邻居收到的路…

通信系统概述

1.定义 通信系统&#xff08;也称为通信网络&#xff09;是利用各种通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来&#xff0c;依靠网络软件及通信协议实现资源共享和信息传递的系统。 2.概述 随着通信技术和网络技术的不断发展&#xff…

ai绘画软件排行有哪些?介绍四款绘画软件

ai绘画软件排行有哪些&#xff1f;随着人工智能技术的飞速发展&#xff0c;AI绘画软件已经成为艺术创作领域的一股新势力。它们不仅极大地提高了绘画的效率&#xff0c;还为艺术家们带来了前所未有的创作灵感。在众多AI绘画软件中&#xff0c;聪明灵犀凭借其强大的功能和广泛的…

数据采集与预处理复习资料

目录 第一章 简答 1.简述Hadoop各个组件及其功能 2.Hadoop在大数据技术体系中的地位和作用&#xff08;来自文心一言&#xff09; 3.Hadoop 启动命令&#xff0c;停止命令 4.pig 加载HDFS 数据 5.数据采集的方法&#xff08;来自ppt&#xff09; 6.数据分析过程&#xf…

计算机网络 MAC地址表管理

一、理论知识 1.MAC地址表&#xff1a;交换机使用MAC地址表来记录各MAC地址对应的端口&#xff0c;用于帧转发的目的。 2.老化机制&#xff1a;交换机会为每一条MAC地址表项设置老化时间&#xff0c;老化时间到期后未收到该MAC地址报文的表项将被删除&#xff0c;释放资源。 …