驱动:电阻屏触摸芯片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;
}

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值