驅動:電阻屏觸摸芯片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;
}


附件列表

     


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM