打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
驱动:电阻屏触摸芯片NS2009
userphoto

2022.06.15 北京

关注
主要特性
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;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
实现ping命令的代码
单片机C语言学习
嵌入式---程序示例
linux下将整型IPv4地址转换成点分十进制字符串的方法
详解CortexM位带操作
宏定义中的公式一定要带括号
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服