zoukankan      html  css  js  c++  java
  • 驱动:电阻屏触摸芯片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;
    }


    附件列表

    • 相关阅读:
      int、bigint、smallint 和 tinyint
      我的fedora9安装后配置
      系统引导设置与管理EasyBCD与VistaBootPRO
      从Xml文档内部引用Xml Schema验证
      linux开机顺序
      OS引导-笔记
      Logic Volume笔记
      Service笔记
      python中若类属性与实例属性同名
      解析JavaScript中的null与undefined
    • 原文地址:https://www.cnblogs.com/bog-box/p/15441467.html
    Copyright © 2011-2022 走看看