嵌入式开发--XW09A触摸芯片的使用

XW09A触摸芯片

XW09A是厦门市芯网电子科技有限公司出品的一颗触摸芯片,支持9键多点触摸,I2C接口,带中断引脚。
以下摘抄自芯片手册
极高的灵敏度,可穿透13mm 的玻璃,感应到手指的触摸
超强的抗干扰和ESD 能力,不加任何器件即可通过人体8000v 实验
外围电路简单,最少只需一个4.7nf 电容,芯片即可正常工作
外围寄生电容自动校正
工作电压范围:2.5 ~ 5.5 V
SOP16 环保封装

电路图

嵌入式开发--XW09A触摸芯片的使用_第1张图片
外围电路很简单,就是几个电容,连接到触摸键时需要通过1K电阻,SDA,SCL,INT需要上拉,电源输入最好经过RC滤波,实测无RC滤波也不影响。

通讯时序

嵌入式开发--XW09A触摸芯片的使用_第2张图片
按上图写软件就可以,说明一下:
1 主机发送起始信号
2 主机发送7位地址和1位读,对于本芯片来说,就是发送0x81
3 等待芯片响应的ACK位
4 连续读取16位按键数据,其中起始3位是高电平,抛弃,然后连续读的9位是按键状态,最后4位抛弃
5 NACK信号
6 主机发送STOP
通信结束。

软件编写

因为其I2C的通讯协议与标准I2C通讯协议不兼容,故没有采用硬件I2C,而是用的软件I2C,当INT进中断后置标志位,在主程序中查询标志位,并调用以下这个函数即可。

u8 I2C_Read_XW09A(void)//i2c读XW09A,返回值是是当前的键值,从1开始计数,为0表示未按下
{
	u16 i,receive=0;
  u8 ret=0;
  
	I2C_SDA_OUT();//SDA设置为输出
  
  //主机发送开始信号
  I2C_Start();
  
  //发送8位地址
  I2C_Send_Byte(0x81);    //xw09a高7位表示地址,其值为0x4,左移1位为i2c地址,再加上最低位的1(表示读取),组合后地址为0x81
  
  //等待从机应答
  if(I2C_Wait_Ack() != 0)
    return 0;
  
  //接收16位数据
  I2C_SDA_IN();//SDA设置为输入
  for(i=0;i<16;i++ )
	{
    I2C_SCL(0); 
    delay_us(1);
		I2C_SCL(1);
    receive<<=1;
    if(I2C_SDA_READ())
      receive++;   
    else
      ret = i-2;
		delay_us(1); 
  }
  
  //主机发送无应答信号
  I2C_NAck();//发送nACK
  
  //主机发送停止信号
  I2C_Stop();

  //SDA设置为输入
	I2C_SDA_IN();//SDA设置为输入
    
  return ret;
}

问题和解决

任何时刻均可以读取芯片数据,但只能在INT为低电平期间才会有正确的触摸状态的数据
这一点我开始没有注意到,我是设定的上升沿进中断,读取的状态如下图
嵌入式开发--XW09A触摸芯片的使用_第3张图片
SDA始终是高电平。
后来找厂家咨询,索要时序图,但未能提供,最后是把板子寄到厂家搞定,最后总结问题,才发现我的时序是上升沿进中断,改为下降沿进中断,然后读取i2c,一切正常,时序如下图:
嵌入式开发--XW09A触摸芯片的使用_第4张图片
在解决问题期间,厂家的客服和技术支持表现出了极其负责的态度,在这里为他们点赞,也祝愿芯网公司产品大卖。
同时希望厂家能把PDF文档做得完善些,将INT,SDA,SCL的时序图放进去,如果PDF里面有这个图的话,可以让用户少走弯路。

你可能感兴趣的:(stm32,嵌入式,触摸,单片机,XW09A)