XW09A触摸芯片
XW09A是厦门市芯网电子科技有限公司出品的一颗触摸芯片,支持9键多点触摸,I2C接口,带中断引脚。
以下摘抄自芯片手册
极高的灵敏度,可穿透13mm 的玻璃,感应到手指的触摸
超强的抗干扰和ESD 能力,不加任何器件即可通过人体8000v 实验
外围电路简单,最少只需一个4.7nf 电容,芯片即可正常工作
外围寄生电容自动校正
工作电压范围:2.5 ~ 5.5 V
SOP16 环保封装
电路图
外围电路很简单,就是几个电容,连接到触摸键时需要通过1K电阻,SDA,SCL,INT需要上拉,电源输入最好经过RC滤波,实测无RC滤波也不影响。
通讯时序
按上图写软件就可以,说明一下:
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++; elseret = i-2;delay_us(1); }//主机发送无应答信号I2C_NAck();//发送nACK//主机发送停止信号I2C_Stop();//SDA设置为输入I2C_SDA_IN();//SDA设置为输入return ret;
}
问题和解决
任何时刻均可以读取芯片数据,但只能在INT为低电平期间才会有正确的触摸状态的数据。
这一点我开始没有注意到,我是设定的上升沿进中断,读取的状态如下图
SDA始终是高电平。
后来找厂家咨询,索要时序图,但未能提供,最后是把板子寄到厂家搞定,最后总结问题,才发现我的时序是上升沿进中断,改为下降沿进中断,然后读取i2c,一切正常,时序如下图:
在解决问题期间,厂家的客服和技术支持表现出了极其负责的态度,在这里为他们点赞,也祝愿芯网公司产品大卖。
同时希望厂家能把PDF文档做得完善些,将INT,SDA,SCL的时序图放进去,如果PDF里面有这个图的话,可以让用户少走弯路。