驱动:电阻屏触摸芯片NS2009
主要特性
NS2009是一款带I2C接口的4线制电阻式触摸屏控制电路,内含12位分辨率A/D转换器。NS2009能通过执行两次A/D转换查
出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。在2.7V的典型工作状态下,功耗可小于0.75mW。
工作电压范围为 2.0V~5.5V
触摸压力测量
采用 2线制 I2C通信接口
具有自动 power down 省电功能
MSOP10 ,QFN(3×3)-16封装
-40~85℃工作温度范围
典型电路

应用建议
在应用中,建议添加一些外部电容跨接于触摸屏,以便虑掉触摸屏自身产生的噪声(如:由 LCD 和背光电路产生的噪声)。
电容和电阻形成一个低通滤波器从而抑制了噪声。电容值过大可能导致建立时间的增加,出现增益错误,因此选择电容时要考虑输入信号的带宽要求。
数字接口
NS2009 数据接口是 I2C 串行接口,满足 I2C 的接口协议,可实现标准模式(100K)、快速模式(400K)或高速模式(3.4M),
对 NS2009 的控制分为写、读两种命令格式,写命令用于输入地址和命令字节,让 NS2009 工作在指定的配置和模式下,
读命令用于输出 NS2009 的 ADC 转换数据,以便获取相关的测量信息。
写命令

写命令的第一字节为地址字节:

最低位 R/W(bit0),为 0 表示写命令,1 表示读命令
A1(Bit2)和 A0(Bit1)为硬件地址控制位,对 MSOP-10 封装,A1(Bit2)默认是 0。A0(Bit1)这
1 位必须要和 MSOP-10 封装芯片的第 8 脚电平一致,才能选中对应的 NS2009;对 QFN(3×3)-16 封装,A1
(Bit2)和 A0(Bit1)这两位必须要和 QFN(3×3)-16 封装芯片的第 1 脚和第 2 脚(A1 和 A0)电平一致,才能
选中对应的 NS2009;。
最高 5 位为软件地址位,必须输入固定码“10010”,如图 6 所示。
在第一字节全部被接收后,NS2009 会在第 9 个时钟周期,发出应答信号 ACK(0 电平),表示数据已接收。
写命令的第二字节为命令字节:





读命令

注意事项


驱动代码
bsp_ns2009.h
#ifndef _BSP_NS2009
#define _BSP_NS2009
#define NS2009_ADDR 0x48
#define NS2009_ADDR_READ 0x91
#define NS2009_ADDR_WRITE 0x90
#define NS2009_LOW_POWER_READ_X 0xc0
#define NS2009_LOW_POWER_READ_Y 0xd0
#define NS2009_LOW_POWER_READ_Z1 0xe0
#define NS2009_LOW_POWER_READ_Z2 0xf0
#define SCREEN_X_PIXEL 240
#define SCREEN_Y_PIXEL 320
unsigned char bsp_ns2009_init(void);
unsigned int ns2009_read(const unsigned char _cmd);
unsigned int bsp_ns2009_getPress(void);
unsigned int bsp_ns2009_getPos(unsigned int *_pos);
#endif
bsp_ns2009.c
#include "bsp_ns2009.h"
/*
**********************************************************************
* @fun :bsp_ns2009_init
* @brief :
* @param :
* @return :None
* @remark :
**********************************************************************
*/
unsigned char bsp_ns2009_init(void)
{
bsp_i2c_tp_init();
}
/*
**********************************************************************
* @fun :ns2009_read
* @brief :读取ns2009数据
* @param :
* @return :None
* @remark :
**********************************************************************
*/
unsigned int ns2009_read(const unsigned char _cmd)
{
unsigned int tp_adc = 0;
bsp_i2c_tp_start();
bsp_i2c_tp_sendByte(NS2009_ADDR_WRITE);
bsp_i2c_tp_waitAck();
bsp_i2c_tp_sendByte(_cmd);
bsp_i2c_tp_waitAck();
bsp_i2c_tp_stop();
bsp_i2c_tp_start();
bsp_i2c_tp_sendByte(NS2009_ADDR_READ);
bsp_i2c_tp_waitAck();
tp_adc = bsp_i2c_tp_readByte();
bsp_i2c_tp_ack();
tp_adc <<= 8;
tp_adc |= bsp_i2c_tp_readByte();
bsp_i2c_tp_nack();
bsp_i2c_tp_stop();
tp_adc >>= 4;
return tp_adc;
}
/*
**********************************************************************
* @fun :ns2009_getPress
* @brief :读取ns2009压力数据
* @param :
* @return :None
* @remark :
**********************************************************************
*/
unsigned int bsp_ns2009_getPress(void)
{
return ns2009_read(NS2009_LOW_POWER_READ_Z1);
}
/*
**********************************************************************
* @fun :ns2009_getPos
* @brief :获取ns2009坐标数据
* @param :
* @return :None
* @remark :
**********************************************************************
*/
unsigned int bsp_ns2009_getPos(unsigned int *_pos)
{
unsigned int x=0, y=0, z=0;
z = bsp_ns2009_getPress();
if ((z > 70) && (z < 2000))
{
x = ns2009_read(NS2009_LOW_POWER_READ_X);
y = ns2009_read(NS2009_LOW_POWER_READ_Y);
*(_pos+0) = x * SCREEN_X_PIXEL / 4096; //4096 = 2 ^ 12
*(_pos+1) = y * SCREEN_Y_PIXEL / 4096;
}
else
{
*(_pos+0) = 0;
*(_pos+1) = 0;
}
return z;
}
附件列表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了