主要特性
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;
}
附件列表

