触摸IC(JTW6C12)的踩坑经验
一、布线原则:
1、触摸走线尽量短,多个触摸走线尽量保证走线长度一致,这样可以保证灵敏度基本一致,如果走线长度差距过大,就有可能超越了软件可调节灵敏度的范围,导致灵敏度不一致,使用效果不佳;
2、触摸走线建议使用地线包裹,走线与地的间距在0.5mm以上;另外,如果触摸线过长,建议走线与地的间距在1mm以上;
3、触摸走线尽量不要与其他线并行走线或交叉,如果客观原因必须并行走线,则相邻触摸走线并行间距要在0.5mm以上,且尽量简短并行走线的距离;
4、触摸走线的周围适当打几个GND过孔,减少寄生电容对触摸走线的影响;
5、触摸焊盘可以是任意形状(原则上最好使用规则形状),大小在8*8-15*15之间;
6、触摸按键底部不要放置元器件与走线。
二、软件调试:
1、JTW6C12上电初始化时间约为25ms,因此在JTW6C12上电后,需要等待25ms以上时间后,再与其通信;
2、规格书中给出的例程,在读取数据时与标准的IIC时序有区别,实测发现使用标准IIC时序可以与jtw6c12正常通信
三、例程:
(注:例程使用的IC为nrf52840,实测正常,具体按键灵敏度需根据实际项目调整)
1、jtw6c12.h文件
#ifndef _JTW6C12_H_
#define _JTW6C12_H_
#include "nrf_gpio.h"
#define TTP_SCK_PIN NRF_GPIO_PIN_MAP(1,9)
#define TTP_SDA_PIN NRF_GPIO_PIN_MAP(1,8)
#define TTP_INT_PIN 8
#define TTP_INT_Read() nrf_gpio_pin_read(TTP_INT_PIN)
#define JTW6C12_ADDR 0x50
#define W_ADDR 0xA0
#define R_ADDR 0xA1
void Jtw6c12Init(void);
bool TTP_ReadKey(uint8_t *key);
#endif
2、jtw6c12.c文件
#include "jtw6c12.h"
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "nrf_drv_twi.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
static uint8_t d_u8Buf[4];
//TWI驱动程序实例ID,ID和外设编号对应,0:TWI0 1:TWI1
#define TWI_INSTANCE_ID 0
//TWI传输完成标志
static volatile bool m_xfer_done = false;
//定义TWI驱动程序实例,名称为m_twi
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
//TWI事件处理函数
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
//判断TWI事件类型
switch (p_event->type){
//传输完成事件
case NRF_DRV_TWI_EVT_DONE:
m_xfer_done = true;//置位传输完成标志
break;
default:
break;
}
}
//TWI初始化
void twi_master_init(void)
{
ret_code_t err_code;
//初始化TWI配置结构体
const nrf_drv_twi_config_t twi_config = {
.scl = TTP_SCK_PIN, //配置TWI SCL引脚
.sda = TTP_SDA_PIN, //配置TWI SDA引脚
.frequency = NRF_DRV_TWI_FREQ_100K, //配置TWI时钟频率
.interrupt_priority = APP_IRQ_PRIORITY_HIGH, //TWI中断优先级设置
.clear_bus_init = false //初始化期间不发送9个SCL时钟
};
//初始化TWI
err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
APP_ERROR_CHECK(err_code);
//使能TWI
nrf_drv_twi_enable(&m_twi);
}
static void SetBuf(uint8_t dat1, uint8_t dat2, uint8_t dat3)
{
d_u8Buf[0] = dat1;
d_u8Buf[1] = dat2;
d_u8Buf[2] = dat3;
}
bool TTP_WriteData(uint8_t *buf, uint8_t length)
{
ret_code_t err_code;
m_xfer_done = false;
//TWI传输TX,写入数据到对应地址,该地址是原始7位地址,不包含读写位
err_code = nrf_drv_twi_tx(&m_twi, JTW6C12_ADDR, buf, length, false);
//等待TWI总线传输完成
while (m_xfer_done == false){}
if (NRF_SUCCESS != err_code){
return false;
}
return true;
}
bool TTP_ReadData(uint8_t *buf, uint8_t length)
{
ret_code_t err_code;
//TWI传输完成标志设置为false
m_xfer_done = false;
//TWI传输RX,写入数据到对应地址,该地址是原始7位地址,不包含读写位
err_code = nrf_drv_twi_rx(&m_twi, JTW6C12_ADDR, buf, length);
//等待TWI总线传输完成
while (m_xfer_done == false){}
if (NRF_SUCCESS != err_code){
return false;
}
return true;
}
//------------------------------------------------------
//读取键值
//第一字节:0x80未配置过参数 0xC0已配置过参数
//第二字节:bit7-bit0: 对应触摸按键TP8-TP1
//第三字节:bit3-bit0: 对应触摸按键TP12-TP9
bool TTP_ReadKey(uint8_t *key)
{
bool ret = false;
if(!TTP_INT_Read()){
TTP_ReadData(d_u8Buf,3);
key[0] = d_u8Buf[1];
key[1] = d_u8Buf[2];
ret = true;
}
return ret;
}
void Jtw6c12GpioInit(void)
{
twi_master_init();
nrf_gpio_cfg_input(TTP_INT_PIN,NRF_GPIO_PIN_NOPULL);
nrf_delay_ms(25);
}
//上电初始化写入 3 类参数,可设置每个按键的灵敏度,唤醒灵敏度,休眠设置
//按键灵敏度命令:0xC0-0xCB ,第 2,3 个参数,16BIT 灵敏度,低字节在前,高字节在后。
//唤醒灵敏度命令:0xE0,第 2,3 个参数,16BIT 灵敏度,低字节在前,高字节在后。
//休眠开启命令: (0x88,0x00,0x00)
//休眠关闭命令: (0x80,0x00,0x00)
//上电不写入参数:默认按键灵敏度为 60(数值越小灵敏度越高),唤醒灵敏度为 10,休眠开启
//注意:按键灵敏度最小只能到30,最大255
void Jtw6c12Init(void)
{
Jtw6c12GpioInit();
SetBuf(0xC0,30,0x00); //写TP1灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC1,70,0x00); //写TP2灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC2,70,0x00); //写TP3灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC3,45,0x00); //写TP4灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC4,70,0x00); //写TP5灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC5,130,0x00); //写TP6灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC6,30,0x00); //写TP7灵敏度阈值
TTP_WriteData(d_u8Buf,3);
SetBuf(0xC7,120,0x00); //写TP8灵敏度阈值
TTP_WriteData(d_u8Buf,3);
// SetBuf(0xC8,255,0x00); //写TP9灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// SetBuf(0xC9,255,0x00); //写TP10灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// SetBuf(0xCA,30,0x00); //写TP11灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// SetBuf(0xCB,30,0x00); //写TP12灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// SetBuf(0xE0,60,0x00); //睡眠唤醒阈值
// TTP_WriteData(d_u8Buf,3);
//
// SetBuf(0x80,00,0x00); //睡眠关闭
// TTP_WriteData(d_u8Buf,3);
//读命令是为了验证写入参数是否OK
//读完后,写入0x5a,0x00,0x00表示结束读取参数
//SetBuf(0x5a,0x00,0x00);
//TTP_WriteData(W_ADDR,d_u8Buf,3);
// SetBuf(0x5a,0xa5,0xC0); //读TP1灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp1 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
//
// SetBuf(0x5a,0xa5,0xC1); //读TP2灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp2 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC2); //读TP3灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp3 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC3); //读TP4灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp4 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC4); //读TP5灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp5 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC5); //读TP6灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp6 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC6); //读TP7灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp7 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC7); //读TP8灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp8 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC8); //读TP9灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp9 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xC9); //读TP10灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp10 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xCA); //读TP11灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp11 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xCB); //读TP12灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Tp12 param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0xE0); //读睡眠唤醒灵敏度阈值
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Sleep Wack up param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0xa5,0x80); //读睡眠是否使能
// TTP_WriteData(d_u8Buf,3);
// TTP_ReadData(d_u8Buf,3);
// NRF_LOG_INFO("Read Sleep Enable param:");
// NRF_LOG_INFO("d_u8Buf[0] = %d",d_u8Buf[0]);
// NRF_LOG_INFO("d_u8Buf[1] = %d",d_u8Buf[1]);
// NRF_LOG_INFO("d_u8Buf[2] = %d",d_u8Buf[2]);
// SetBuf(0x5a,0x00,0x00); //关闭读命令
// TTP_WriteData(d_u8Buf,3);
}
触摸IC(JTW6C12)的踩坑经验相关推荐
- 【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)
运筹优化博士,只做原创博文.更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37 最近写了几个Pyt ...
- Colab使用经验总结(踩坑经验)------小白注意!
文件上传至谷歌的云端硬盘 先压缩成zip,再在网盘用!unzip命令解压 !unzip '/content/drive/MyDrive/colab1/1.zip' -d '/content/driv ...
- gitlab的下载和安装教程我的踩坑经验
#######这里就记录一下内网的安装包形式的安装过程############ 1.下载过程和安装过程 1)进入gitlab官网,platform>Install. --gitlab有极狐版,C ...
- spring boot 集成 redis spring-boot-starter-data-redis 2.1.7.RELEASE jedis: pool: #连接池配置 及踩坑经验
目录 先上一些踩坑报错,各类报错 @org.springframework.beans.factory.annotation.Autowired(required=true) Error creati ...
- 2017前端大厂踩坑经验
不得不说今年的前端无疑超越了两年前java的火爆,但是同样应聘人数增加后,应聘要求也随之大幅度上升,在不是那个切切图,做做ui就能说自己是前端开发工程师了,而如今微信小程序的推出,无疑是让风口浪尖上的 ...
- 使用DialogFragment的一些感受及防踩坑经验(getActivity、getDialog为空,cancelable无效等)
前言 安卓里面创建对话框的方式其实蛮多的.Dialog.AlertDialog.DialogFragment.PopupWindow甚至Activity设置主题为Dialog也能创建对话框.其中,Al ...
- 微信jssdk批量添加卡券接口(踩坑经验)
1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...
- 重磅福利 | 全网唯一,多年踩坑经验,探索测试策略新奇方法之案例剖析(一)...
测试行业浪迹多年,曾经历网络游戏.网页游戏.手游等海外游戏项目,直播.金融.房产.人力资源招聘行业等,积累了丰富的测试经验,摔了无数个跟头,不断尝试验证积累总结出来丰富资源,异常特殊测试策略.深度的测 ...
- 微信小程序开发踩坑经验——小蜗社群
2019独角兽企业重金招聘Python工程师标准>>> 之前遇到并且解决的坑,这边也渐渐忘记了,在这里就不列出来了-- 1.wx.redirectTo和wx.navigateTo ...
最新文章
- 在macOS 10.13.6上安装go 1.13.8实录
- C++多线程:thread类创建线程的多种方式
- leetcode 72. 编辑距离
- 初识Ildasm.exe——IL反编译的实用工具(转自Youngman)
- Java常考面试题(一)
- 终于有人把计算机视觉讲明白了。。。
- 数字图像处理(五)——形态学
- 【推荐视频】中科院赵军:知识图谱关键技术及其在推荐系统中的应用
- 数学建模-4.拟合算法
- python必背入门代码-初学Python必背手册
- 数据库连接池和线程池比较
- Nagios的安装与配置并实现飞信报警
- SpringMVC 中 @RequestBody 接收Json数组对象及对象参数中有数组参数
- 如何将手机哔哩哔哩缓存的m4s格式的视频转换成mp4呢?
- 百练4083我爱北大 解析
- 更新Win10版本后,wifi图标不见了,并且连接不到wifi和宽带,以及点击网络和Internet闪退的情况
- 修建公路1:最小生成树(克鲁斯卡尔算法)
- Linux运维工程师主要做什么工作?
- 【山科OJ】Problem A: 社交网络的好友推荐
- CSP漫画工作室clipstudiopaint最新版本2022功能介绍
热门文章
- Banana Pi开源社区开源硬件瑞芯微RK3568/RK3588全国产化支持计划
- 液晶弹性自由能计算_液晶性能参数的测试方法及原理.ppt
- 如何提高 matlab 计算速度 运算效率
- 关于IDEA maven工程打jar包无法引入手动导入的jar包问题的解决方式
- Linux-安装ifconfig
- MFC——CPropertySheet(属性表单)和CPropertyPage(属性页)——实现分页显示
- 音效工具Boom 3D
- 关于Scanner.nextLine()问题的解决方案
- 小软件大用途!分享4款超级实用的软件,请低调收藏
- php获取搜索记录,php如何记录搜索引擎爬行记录