一:了解触摸芯片的工作协议
1:资料 BS814A(8SOP)为例:
2:数据讲解
此芯片是通过IIC接收八位数据来判断四个按键是否按下的,
bit0-3代表Key1-4脚位的触摸按键的状态,0代触摸按键按下,1则为没有按下。
bit6-4代表按键上有几个按键按下,000表示没有按键按下,100表示四个按键全部按下。
bit7为停止位,此位总是为“1”。
3:iic数据接收讲解
BS814A芯片是作为从机使用的,在接收BS814A时,主机的配置为下:
初始化配置:数据线和时钟线都配置为输出高。
起始信号配置:时钟线输出高->数据线输出高->延时500us->数据线配置低->延时500us->时钟线配置低。
停止信号:时钟线配置低->延时500us->数据线输出低->延时500us->数据线和时钟线配置为高。
读取一个字节数据:发送其实信号->数据线设置为输入模式->时钟线配置为高是开始读数据,匹配为低时停止读数据,直到八位数据全部读取完成->判断bit7是否为1,为1则正确,为0则错误。示例代码如下:
//发送起始信号
void _user_iic_start(){
IIC_SCL_OUTMODE;
IIC_SCL_OPEN; //时钟线配置输出高
IIC_DATA_OUTMODE;
IIC_DATA_OPEN; //数据线配置输出高
DelayUs_M(500); //延时500us
IIC_DATA_CLOSE; //数据线配置低
DelayUs_M(500);
IIC_SCL_CLOSE; //时钟线配置低
}
//发送停止信号
void _user_iic_stop(){
IIC_SCL_CLOSE;
DelayUs_M(500);
IIC_DATA_OUTMODE;
IIC_DATA_CLOSE;
DelayUs_M(500);
IIC_DATA_OPEN;
IIC_SCL_OPEN;
}
//读取一个字节
uint8_t IIC_Read_Byte( ){
uint8_t i = 0;
uint8_t receive = 0; //用于存放读取的数据
_user_iic_start(); //发送起始信号
IIC_DATA_INMODE; //数据线设置为输入模式
for(i = 0;i < 8;i++) {
IIC_SCL_CLOSE;
DelayUs_M(500);
IIC_SCL_OPEN; //时钟线拉高开始读数据
DelayUs_M(250);
if(user_gpio_get_value(IIC_IO_DATA) == 1){ //读取数据线的高低电平
receive |= (1<<i);
}else{
receive &= (0xFF^(1<<i));
}
DelayUs_M(250);
}
IIC_SCL_CLOSE;
IIC_DATA_CLOSE; //8位读取完成配置时钟线和数据线为低
if((receive&0x80) == 0){ //停止位判断(bit7为0时数据错误,数据则恢复无按键状态)
receive = 0x8F;
}
// _user_iic_stop(); //此芯片停止位为bit7所以不用发停止信号
return receive;
}
int main(){
int ret = 0; //用于存放接收到的iic数据
while(1){
ret = IIC_Read_Byte();
vTaskDelay(50); //延时50ms(每隔50ms查询一次是否有按键按下)
//其下为按键判断部分,需要的可以去看我之前发的按键判断部分。
}
}