一、布线原则:

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)的踩坑经验相关推荐

  1. 【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)

    运筹优化博士,只做原创博文.更多关于运筹学,优化理论,数据科学领域的内容,欢迎关注我的知乎账号:https://www.zhihu.com/people/wen-yu-zhi-37 最近写了几个Pyt ...

  2. Colab使用经验总结(踩坑经验)------小白注意!

    文件上传至谷歌的云端硬盘 先压缩成zip,再在网盘用!unzip命令解压  !unzip '/content/drive/MyDrive/colab1/1.zip' -d '/content/driv ...

  3. gitlab的下载和安装教程我的踩坑经验

    #######这里就记录一下内网的安装包形式的安装过程############ 1.下载过程和安装过程 1)进入gitlab官网,platform>Install. --gitlab有极狐版,C ...

  4. spring boot 集成 redis spring-boot-starter-data-redis 2.1.7.RELEASE jedis: pool: #连接池配置 及踩坑经验

    目录 先上一些踩坑报错,各类报错 @org.springframework.beans.factory.annotation.Autowired(required=true) Error creati ...

  5. 2017前端大厂踩坑经验

    不得不说今年的前端无疑超越了两年前java的火爆,但是同样应聘人数增加后,应聘要求也随之大幅度上升,在不是那个切切图,做做ui就能说自己是前端开发工程师了,而如今微信小程序的推出,无疑是让风口浪尖上的 ...

  6. 使用DialogFragment的一些感受及防踩坑经验(getActivity、getDialog为空,cancelable无效等)

    前言 安卓里面创建对话框的方式其实蛮多的.Dialog.AlertDialog.DialogFragment.PopupWindow甚至Activity设置主题为Dialog也能创建对话框.其中,Al ...

  7. 微信jssdk批量添加卡券接口(踩坑经验)

    1)首先是官方接口文档: 1.批量添加卡券接口:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.0861973 ...

  8. 重磅福利 | 全网唯一,多年踩坑经验,探索测试策略新奇方法之案例剖析(一)...

    测试行业浪迹多年,曾经历网络游戏.网页游戏.手游等海外游戏项目,直播.金融.房产.人力资源招聘行业等,积累了丰富的测试经验,摔了无数个跟头,不断尝试验证积累总结出来丰富资源,异常特殊测试策略.深度的测 ...

  9. 微信小程序开发踩坑经验——小蜗社群

    2019独角兽企业重金招聘Python工程师标准>>> 之前遇到并且解决的坑,这边也渐渐忘记了,在这里就不列出来了-- 1.wx.redirectTo和wx.navigateTo   ...

最新文章

  1. 在macOS 10.13.6上安装go 1.13.8实录
  2. C++多线程:thread类创建线程的多种方式
  3. leetcode 72. 编辑距离
  4. 初识Ildasm.exe——IL反编译的实用工具(转自Youngman)
  5. Java常考面试题(一)
  6. 终于有人把计算机视觉讲明白了。。。
  7. 数字图像处理(五)——形态学
  8. 【推荐视频】中科院赵军:知识图谱关键技术及其在推荐系统中的应用
  9. 数学建模-4.拟合算法
  10. python必背入门代码-初学Python必背手册
  11. 数据库连接池和线程池比较
  12. Nagios的安装与配置并实现飞信报警
  13. SpringMVC 中 @RequestBody 接收Json数组对象及对象参数中有数组参数
  14. 如何将手机哔哩哔哩缓存的m4s格式的视频转换成mp4呢?
  15. 百练4083我爱北大 解析
  16. 更新Win10版本后,wifi图标不见了,并且连接不到wifi和宽带,以及点击网络和Internet闪退的情况
  17. 修建公路1:最小生成树(克鲁斯卡尔算法)
  18. Linux运维工程师主要做什么工作?
  19. 【山科OJ】Problem A: 社交网络的好友推荐
  20. CSP漫画工作室clipstudiopaint最新版本2022功能介绍

热门文章

  1. Banana Pi开源社区开源硬件瑞芯微RK3568/RK3588全国产化支持计划
  2. 液晶弹性自由能计算_液晶性能参数的测试方法及原理.ppt
  3. 如何提高 matlab 计算速度 运算效率
  4. 关于IDEA maven工程打jar包无法引入手动导入的jar包问题的解决方式
  5. Linux-安装ifconfig
  6. MFC——CPropertySheet(属性表单)和CPropertyPage(属性页)——实现分页显示
  7. 音效工具Boom 3D
  8. 关于Scanner.nextLine()问题的解决方案
  9. 小软件大用途!分享4款超级实用的软件,请低调收藏
  10. php获取搜索记录,php如何记录搜索引擎爬行记录