合泰BS8116A-3触摸芯片开发踩坑指南

一、硬件说明

引脚图:

接线:

 说明:由于用到了唤醒检测,所以KEY16引脚用作IRQ中断唤醒功能,未使用引脚拉低。

二、IIC配置说明

1、最大波特率:

实际单片机配置最好不要设置波特率100Khz容易出错,50Khz就可以了。

2、从机地址:

 注意:这里需要注意的是,从机地址位不包括读写位,实际使用需要右移一位,从机地址是0x50实际发送读是0xA1,写是0xA0。

3、从机忙碌

 这个判断程序里面还是加一下,不加的话一般也能用,但是容易出问题。

三、读写按键寄存器

 1、中断说明:

 

 检测到IRQ引脚低电平开始读取按键状态,高电平停止读取。

2、工作模式:

 这里需要注意在8秒按键没有按下时,会进入低功耗状态。两种状态下的按键唤醒速度是不同的,体验有明显差异,且无法修改进入休眠时间。

3、读取按键状态

 4、读写配置寄存器

 注意:最后是一个字节的校验和,只是简单的单字节累加从合泰同类型其他手册里找到说明了。

 5、配置寄存器

注意:触发门槛值越低敏感度越高,门槛值数值越高敏感度越低。

 免大家去查表直接复制过来了。

四、代码片段

1、配置寄存器数据结构

#define KEY_ADDR1_8		0x08
#define KEY_ADDR9_12	0x09#define REG_CFG_ADDR	0xB0
#define REG_CFG_CNT		21#pragma pack(1) //单字节对齐typedef union {uint8_t reg[REG_CFG_CNT+1];struct {uint8_t opt1_oms : 1;uint8_t opt1_17_res:7;uint8_t res1;uint8_t res2;uint8_t res3;uint8_t opt2_05_res : 6;uint8_t opt2_6_lsc : 1;uint8_t opt2_7_res : 1;uint8_t k1_th_val : 6;uint8_t k1_th_res : 1;uint8_t k1_th_wu : 1;uint8_t k2_th_val : 6;uint8_t k2_th_res : 1;uint8_t k2_th_wu : 1;uint8_t k3_th_val : 6;uint8_t k3_th_res : 1;uint8_t k3_th_wu : 1;uint8_t k4_th_val : 6;uint8_t k4_th_res : 1;uint8_t k4_th_wu : 1;uint8_t k5_th_val : 6;uint8_t k5_th_res : 1;uint8_t k5_th_wu : 1;uint8_t k6_th_val : 6;uint8_t k6_th_res : 1;uint8_t k6_th_wu : 1;uint8_t k7_th_val : 6;uint8_t k7_th_res : 1;uint8_t k7_th_wu : 1;uint8_t k8_th_val : 6;uint8_t k8_th_res : 1;uint8_t k8_th_wu : 1;uint8_t k9_th_val : 6;uint8_t k9_th_res : 1;uint8_t k9_th_wu : 1;uint8_t k10_th_val : 6;uint8_t k10_th_res : 1;uint8_t k10_th_wu : 1;uint8_t k11_th_val : 6;uint8_t k11_th_res : 1;uint8_t k11_th_wu : 1;uint8_t k12_th_val : 6;uint8_t k12_th_res : 1;uint8_t k12_th_wu : 1;uint8_t k13_th_val : 6;uint8_t k13_th_res : 1;uint8_t k13_th_wu : 1;uint8_t k14_th_val : 6;uint8_t k14_th_res : 1;uint8_t k14_th_wu : 1;uint8_t k15_th_val : 6;uint8_t k15_th_res : 1;uint8_t k15_th_wu : 1;uint8_t k16_th_val : 6;uint8_t k16_th_mod : 1;uint8_t k16_th_wu : 1;uint8_t checksum;}setting;
} key_setting_t;#pragma pack()

 2、初始化配置寄存器

void TK_Module_Cfg(void)
{int i;rt_int32_t ret = 0;key_setting_t write_setting = {{0x00,0x00,0x83,0xf3,0xd8,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x4f,0},},read_setting={0};for(i=0;i<REG_CFG_CNT;i++){write_setting.setting.checksum += write_setting.reg[i];}for(i=0;i<30;i++){TK_WriteReg(&write_setting);rt_thread_mdelay(1);TK_ReadReg(&read_setting);ret = rt_memcmp(&write_setting,&read_setting,REG_CFG_CNT);if(ret==0){break;}}
}

3、寄存器读写

//写寄存器
int TK_I2c_WriteReg(uint8_t *dest,uint16_t count,uint8_t reg)
{uint8_t u8i=0,flag[10]={0},idx=0,u8State;uint32_t u32KeyTimer = rt_tick_get()+200;I2C_ClearFunc(BS8116A_IIC,I2cStart_En);I2C_ClearFunc(BS8116A_IIC,I2cAck_En);I2C_ClearFunc(BS8116A_IIC,I2cStop_En);I2C_SetFunc(BS8116A_IIC,I2cModule_En);I2C_SetFunc(BS8116A_IIC,I2cStart_En);    while(u32KeyTimer > rt_tick_get()){while(0 == I2C_GetIrq(BS8116A_IIC) && u32KeyTimer > rt_tick_get()){;}u8State = I2C_GetState(BS8116A_IIC);switch(u8State){case 0x08:                                    //已发送起始条件,将发送SLA+Rflag[0]++;I2C_ClearFunc(BS8116A_IIC,I2cStart_En);I2C_WriteByte(BS8116A_IIC,(I2C_DEVADDR));//发送SLA+Wbreak;case 0x18:                                    //已发送SLA+W,并接收到ACKflag[1]++;while(!IIC_READ_SDA){}I2C_WriteByte(BS8116A_IIC,reg);              //发送内存地址case 0x20:flag[2]++;I2C_WriteByte(BS8116A_IIC,reg);              //发送内存地址break;case 0x28:										//已发送 I2Cx_DATA 中的数据,已接收 ACKflag[3]++;I2C_WriteByte(BS8116A_IIC,dest[u8i++]);              //发送内存地址if(u8i>count){I2C_SetFunc(BS8116A_IIC,I2cStop_En);            //其他错误状态,重新发送起始条件goto FINISH;}break;default:                                      //其他错误状态,重新发送起始条件flag[9]++;I2C_SetFunc(BS8116A_IIC,I2cStop_En);            //其他错误状态,重新发送起始条件goto FINISH;}I2C_ClearIrq(BS8116A_IIC);                               //清除中断状态标志位idx++;}FINISH:I2C_ClearIrq(BS8116A_IIC);                               //清除中断状态标志位return 0;
}//获取按键码
int TK_I2c_ReadReg(uint8_t *dest,uint16_t count,uint8_t reg)
{en_result_t enRet = Error;uint8_t u8i=0,flag[10]={0},idx=0,u8State,pu8Data[32]={0};uint32_t u32KeyTimer = rt_tick_get()+200;I2C_ClearFunc(BS8116A_IIC,I2cStart_En);I2C_ClearFunc(BS8116A_IIC,I2cAck_En);I2C_ClearFunc(BS8116A_IIC,I2cStop_En);I2C_SetFunc(BS8116A_IIC,I2cModule_En);I2C_SetFunc(BS8116A_IIC,I2cStart_En);    while(u32KeyTimer > rt_tick_get()){while(0 == I2C_GetIrq(BS8116A_IIC) && u32KeyTimer > rt_tick_get()){;}u8State = I2C_GetState(BS8116A_IIC);switch(u8State){case 0x08:                                    //已发送起始条件,将发送SLA+Rflag[0]++;I2C_ClearFunc(BS8116A_IIC,I2cStart_En);I2C_WriteByte(BS8116A_IIC,(I2C_DEVADDR));//发送SLA+Wbreak;case 0x18:                                    //已发送SLA+W,并接收到ACKflag[1]++;while(!IIC_READ_SDA){}I2C_WriteByte(BS8116A_IIC,reg);              //发送内存地址break;case 0x28:                                    //已发送数据,接收到ACKflag[2]++;I2C_SetFunc(BS8116A_IIC,I2cStart_En);break;case 0x10:                                    //已发送重复起始条件flag[3]++;I2C_ClearFunc(BS8116A_IIC,I2cStart_En);I2C_WriteByte(BS8116A_IIC,(I2C_DEVADDR)|0x01);//读命令发送break;case 0x40:                                    //已发送SLA+R,并接收到ACKflag[4]++;if(count>1){I2C_SetFunc(BS8116A_IIC,I2cAck_En);}break;case 0x50:                                    //已接收数据字节,并已返回ACK信号flag[5]++;pu8Data[u8i++] = I2C_ReadByte(BS8116A_IIC);if(u8i>=count){I2C_ClearFunc(BS8116A_IIC,I2cAck_En);        //读数据时,倒数第二个字节ACK关闭}else{I2C_SetFunc(BS8116A_IIC,I2cAck_En);}break;case 0x58:                                    //已接收到最后一个数据,NACK已返回case 0x38:                                    //在发送地址或数据时,仲裁丢失case 0x48:                                    //发送SLA+R后,收到一个NACKdefault:                                      //其他错误状态,重新发送起始条件flag[9]++;I2C_SetFunc(BS8116A_IIC,I2cStop_En);            //其他错误状态,重新发送起始条件goto FINISH;}I2C_ClearIrq(BS8116A_IIC);                               //清除中断状态标志位idx++;}FINISH:I2C_ClearIrq(BS8116A_IIC);                               //清除中断状态标志位rt_memcpy(dest,pu8Data,count);return 0;
}void TK_ReadReg(key_setting_t * setting)
{uint8_t * pset = (uint8_t *)setting,i=0;TK_I2c_ReadReg(pset,REG_CFG_CNT,REG_CFG_ADDR);
}void TK_WriteReg(key_setting_t * setting)
{uint8_t * pset = (uint8_t *)setting,i=0;uint16_t checksum = 0;TK_I2c_WriteReg(pset,REG_CFG_CNT+1,REG_CFG_ADDR);
}uint16_t TK_GetKey(void)
{uint8_t pu8Data[2]={0};uint16_t key_status = 0;TK_I2c_ReadReg(pu8Data,2,KEY_ADDR1_8);key_status = pu8Data[1];key_status = key_status<<8 | pu8Data[0];return key_status;
}

结束。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

BS4基本用法

1.找米下锅&#xff0c;安装bs4库 pip install BeautifulSoup 2.此物何用&#xff0c;BS4作用 Beautiful Soup库是解析、遍历、维护“html标签树”的功能库。在爬虫中用于解析数据。 3.bs4标签元素&#xff0c;解析其组成&#xff0c;方可庖丁解牛&#xff0c;游刃有余 by…

XPath和bs4

XPath XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航 使用方法&#xff1a; 使用前要把response.text通过etree.HTML()转换为对应的格式&#xff0c;再通过 变量名.xpath(xpath)截取内容 responserequests.get(url,headershead…

Python爬虫 BeautifulSoup(bs4)-- bs4介绍、安装bs4、bs4基础语法

1. BeautifulSoup简介 BeautifulSoup简称&#xff1a; bs4 。什么是BeatifulSoup&#xff1f; BeautifulSoup&#xff0c;和lxml一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析和提取数据 。优缺点&#xff1f; 缺点&#xff1a;效率没有lxml的效率高优点&a…

Python爬虫 之数据解析之bs4

数据解析之bs4 一、bs4进行数据解析二、bs4库和lxml库的安装三、BeautifulSoup对象四、项目实例 一、bs4进行数据解析 1、数据解析的原理 ① 标签定位。 ② 提取标签、标签属性中存储的数据值。 2、bs4数据解析的原理 ① 实例化一个BeautifulSoup对象&#xff0c;并且将网页源…

【数据结构】手撕顺序表

一&#xff0c;概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储&#xff1b; 在数组上完成数据的增删查改。 1&#xff0c; 静态顺序表&#xff1a;使用定长数组存储元素。 2.&#xff0c;动态顺序表&#xff1…

java bs项目_BS(Java平台)

采用前后端分离的体系架构。采用前后端分离的开发模式的好处是前端、后台互不影响,发挥各自的特长,提高工作效率。前后端根据约定好的接口规范,按照规范的报文格式分别进行独立开发。前后端开发完成后,进行前后端联调,联调过程中对前后端的参数传递,页面串联,业务逻辑等…

BS架构和CS架构的优缺点

1、CS、BS架构定义 CS(Client/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任…

HAproxy+keepalived高可用配置搭建

目录 一、概述 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;核心功能 &#xff08;三&#xff09;关键特性 &#xff08;四&#xff09;应用场景 二、安装 1&#xff09;拓补图 2&#xff09;配置 &#xff08;一&#xff09;内核配置 &#xff08;二…

oracle orcl不存在,oracle服务丢失的处理方法之OracleServiceORCL不存在示例

oracle服务是oracle数据库的重要组成部分,下面就教您oracle服务丢失的处理方法,如果您之前遇到过oracle服务丢失的问题,不妨一看。 今天发现数据库服务器上的所有oracle服务都丢失了——也就是说在服务管理器中没有oracle服务了,如OracleOraDb10g_home1TNSListener、Oracle…

如何打开计算机的Oracle服务,win10系统手动启动oracle服务的操作方法

有关win10系统手动启动oracle服务的操作方法想必大家有所耳闻。但是能够对win10系统手动启动oracle服务进行实际操作的人却不多。其实解决win10系统手动启动oracle服务的问题也不是难事&#xff0c;小编这里提示两点&#xff1a;1、打开“服务”窗口。或者“管理”口&#xff1…

在现有oracle服务器上新建一个oracle实例

一 概述 假如一台服务器上已经安装了一个单机版的oracle实例orcl&#xff0c;这时想在这台服务器上再部署一个单机版的oracle实例ystat&#xff0c;则可以参考该文档进行部署。 注意&#xff1a;新实例名不要带特殊字符&#xff0c;下划线也不要。 二 操作步骤 2.1 创建相关…

linux下Oracle服务的启动和关闭

1.前言 确保我们能够访问oracle数据库包含两部分&#xff0c;一个是oracle实例&#xff0c;一个是监听&#xff0c;两个同时开启&#xff0c;我们才能正常的使用数据库&#xff0c;因此我们在关闭和启动oracle服务时&#xff0c;也需要同时操作实例和监听。能够操作linux的工具…

AI绘图(11)stable diffusion 如何写好prompt 四

在最开始我写了三篇关于prompt的&#xff0c;具体的大家可以跳转来去看&#xff0c;以下给出来链接&#xff1a; AI绘图&#xff08;3&#xff09;stable diffusion如何写好prompt 一_牧子川的博客-CSDN博客 AI绘图&#xff08;4&#xff09;stable diffusion如何写好prompt …

几个nlp的小任务(生成式任务——语言模型(CLM与MLM))

@TOC 本章节需要用到的类库 微调任意Transformers模型(CLM因果语言模型、MLM遮蔽语言模型) CLM MLM 准备数据集 展示几个数据的结构

MERN Stack 教程

This tutorial will show you how to build a full-stack MERN application—in this case, an employee database—with the most current tools available. Before you begin, make sure that you are familiar with Node.js and React.js basics and have Node and Create R…

取消开机自检

1. 打开运行窗口 win R &#xff0c;输入regedit&#xff0c;点击确定&#xff0c;如图&#xff1a; 2. 一次打开以下节点&#xff0c;如图&#xff1b; 3. 在找到如图所示的节点 4. 双击BootExecute&#xff0c;如图&#xff1a; 5. 清空弹窗中的数据&#xff0c;点击确定&a…

拯救者Y7000 2020新版Bios关闭开机自检

原因 重启按F2进入bios&#xff08;联想笔记本是F2&#xff09; 点击boot选项 关闭自检&#xff08;PXE Boot to LAN改为Disabled&#xff09;

服务器系统自检时间长,我的服务器开机自检提示:waiting for controller to start...是什么意思,而且要等1-5分钟的时间问题是?...

满意答案 alexteresa 2013.06.11 采纳率&#xff1a;46% 等级&#xff1a;12 已帮助&#xff1a;16267人 你好&#xff0c;电脑开机自检&#xff0c;主要是&#xff1a;“内存有错误”或“非正常关机”引起&#xff01; 这是解决方法&#xff1a;(原创&#xff0c;引用请说明…

服务器跳过系统自检,win7 64位旗舰版跳过开机自检功能直接进入系统的方法

如果遇到断电或其他情况导致电脑不正常关机&#xff0c;下次开机电脑会出现磁盘自动检测&#xff0c;win7 64位旗舰版系统磁盘自检的过程需要花费好几分钟的时间&#xff0c;来检测到硬盘是否有坏道或系统是否损坏等问题。如果碰到每次开机磁盘会自检好长时间怎么办呢&#xff…

计算机主板 上电顺序,BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗?

原标题:BIOS很熟悉,电脑开机BIOS开机自检顺序你知道吗? 开机键→主板控制芯片向→CPU发出RESET信号→CPU初始化 当电源供电稳定后,芯片组便撤去RESET信号,CPU马上就从FFFFOH处开始执行指令。注:这个地址在系统BIOS的地址范围内,无论是BIOS还是AMI BIOS,放在这里的只是一…