I2C软件模拟协议与电容触摸控制
I2C 与 Touch slide
最近做了一个与触摸滑条相关的测试,利用I2C通讯协议来配置触摸控制芯片的相关寄存器,读取触摸读数,并通过STM Studio动态显示触摸读数的变化过程。这个测试相对简单,只要搞定I2C通讯协议,后面的触摸控制芯片的相关寄存器配置就变得很简单了,所以我就简单地总结一下I2C通讯部分笔记。
实验平台:IAR 及 STM Studio
实验主芯片:自制STM8L051/101评估板
触摸控制芯片:ProxSense IQS263
使用硬件触摸滑条(Touch slide),如下图:

一、触摸控制芯片IQS263简介
IQS 263 ProxSense IC是一种3通道投影(或自)电容接近和触摸控制器,具有最佳的类灵敏度,信噪比和功耗。
- 硬件原理图

其中,通信线为RDY,SDA,SCL,都接有上拉电阻。RDY是通讯使能脚,当RDY为低电平时才支持I2C通信。
二、I2C软件模拟协议的实现:
- 自定义宏定义
#define I2C_PORT GPIOC
#define I2C_SCL_PIN GPIO_Pin_1
#define I2C_SDA_PIN GPIO_Pin_0 #define SCL_H I2C_PORT->ODR |= I2C_SCL_PIN
#define SCL_L I2C_PORT->ODR &= ~I2C_SCL_PIN
#define SDA_H I2C_PORT->ODR |= I2C_SDA_PIN
#define SDA_L I2C_PORT->ODR &= ~I2C_SDA_PIN
- 起始信号和停止信号

起始信号:当 SCL 线是高电平时 SDA 线从高电平向低电平切换
软件模拟协议实现如下:
/**************************************
起始信号
**************************************/
void Touch_Sen_Start()
{
SDA_H; //拉高数据线
SCL_H; //拉高时钟线
I2C_DELAY; //延时
SDA_L; //产生下降沿
I2C_DELAY; //延时
SCL_L; //拉低时钟线
}
停止信号: 当 SCL 是高电平时 SDA 线由低电平向高电平切换
软件模拟协议实现如下:
/**************************************
停止信号
**************************************/
void Touch_Sen_Stop()
{
SDA_L; //拉低数据线
SCL_H; //拉高时钟线
I2C_DELAY; //延时
SDA_H; //产生上升沿
I2C_DELAY; //延时
}
注:I2C的延迟函数一般设置为5us以上
- 应答和非应答

传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)
应答信号(ACK):SDA为低电平
非应答信号(NACK):SDA为高电平
软件模拟协议实现如下:
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void Touch_Sen_SendACK(u8 ack)
{ if (ack)//写应答信号
{
SDA_H;
}
else
{
SDA_L;
} SCL_H; //拉高时钟线
I2C_DELAY; //延时
SCL_L; //拉低时钟线
I2C_DELAY; //延时
} /**************************************
接收应答信号
**************************************/
u8 Touch_Sen_RecvACK()
{
I2C_PORT->DDR &= ~I2C_SDA_PIN; //Set as input mode
SCL_H; //拉高时钟线
I2C_DELAY; //延时 if(I2C_PORT->IDR & I2C_SDA_PIN)
{
ack = ; //读应答信号
}
else
{
ack = ; //读应答信号
} I2C_PORT->DDR |= I2C_SDA_PIN; //Set as output mode SCL_L; //拉低时钟线
I2C_DELAY; //延时 return ack;
}
- I2C读写
/**************************************
向I2C总线发送一个字节数据
**************************************/
void Touch_Sen_SendByte(u8 dat)
{
u8 i; for (i=; i<; i++) //8位计数器
{
if (dat & 0x80)
{
SDA_H;
}
else
{
SDA_L;
} dat <<= ; //移出数据的最高位
I2C_DELAY; //延时 SCL_H; //拉高时钟线
I2C_DELAY; //延时
SCL_L; //拉低时钟线
I2C_DELAY; //延时
}
Touch_Sen_RecvACK();
} /**************************************
从I2C总线接收一个字节数据
**************************************/
u8 Touch_Sen_RecvByte()
{
u8 i;
u8 dat = ; SDA_H; //使能内部上拉,准备读取数据,
I2C_PORT->DDR &= ~I2C_SDA_PIN; //Set as input mode for (i=; i<; i++) //8位计数器
{
dat <<= ;
SCL_H; //拉高时钟线
I2C_DELAY; //延时
if (I2C_PORT->IDR & I2C_SDA_PIN)//读数据
{
dat |=;
} //esle curret bit is 0 SCL_L; //拉低时钟线
I2C_DELAY; //延时
} I2C_PORT->DDR |= I2C_SDA_PIN; //Set as output mode
return dat;
}
//******单字节写入******************************************* void Single_Write_Touch_Sen(u8 REG_Address,u8 REG_data)
{
Touch_Sen_Start(); //起始信号
Touch_Sen_SendByte(I2C_SLAVE_ADDR_WR); //发送设备地址+写信号
Touch_Sen_SendByte(REG_Address); //内部寄存器地址
Touch_Sen_SendByte(REG_data); //内部寄存器数据
Touch_Sen_Stop(); //发送停止信号
} //********单字节读取***************************************** u8 Single_Read_Touch_Sen(u8 REG_Address)
{
u8 REG_data; Touch_Sen_Start(); //起始信号
Touch_Sen_SendByte(I2C_SLAVE_ADDR_WR); //发送设备地址+写信号
Touch_Sen_SendByte(REG_Address); //发送存储单元地址,从0开始
Touch_Sen_Start(); //起始信号
Touch_Sen_SendByte(I2C_SLAVE_ADDR_RD); //发送设备地址+读信号
REG_data=Touch_Sen_RecvByte(); //读出寄存器数据
Touch_Sen_SendACK();
Touch_Sen_Stop(); //停止信号 return REG_data;
}
三、Touch Slide测试及结果
注:IQS263芯片的一个地址对应好几个字节的寄存器,对IQS263 IC进行I2C读写时,需要进行多字节读写,I2C的多字节读写可参考上面的单字节读写部分代码。
滑动Touch Slide,STM Studio动态显示读数变化。


I2C软件模拟协议与电容触摸控制的更多相关文章
- I2C总线协议的软件模拟实现方法
I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...
- 软件模拟I2C通讯
I2C协议概述,有相当详细的名词解释: 通信数量受限于地址空间和400Pf总线电容. 所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定. ...
- I2C总线通讯协议
I2C总线通讯协议 1. I2C总线简介 I2C是Inter-Integrated Circuit的简称,读作:I-squared-C.由飞利浦公司于1980年代提出,为了让主板.嵌入式系统或手机用以 ...
- 【STM32H7教程】第54章 STM32H7的LTDC应用之LCD电阻触摸和电容触摸
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第54章 STM32H7的LTDC应用之LCD电阻 ...
- I2C软件调试思路并知识总结
I2C是一种只使用两根线的串行通信协议.一根线是串行数据线SDA,另外一种是串行时钟线SCL. I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v. I²C的参考设计使用一个7比特长 ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
#ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...
- stm32软件模拟IIC读取PX4FLOW光流传感器数据
这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...
- STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前 ...
- win7如何设置某个软件不弹出用户账户控制
手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面 ...
随机推荐
- windows系统的错误码
https://blog.csdn.net/u011785544/article/details/51682290
- 个人Hadoop编程代码记录
**WordCount package cn.cpl.recom; import java.io.IOException; import java.util.StringTokenizer; impo ...
- 021logging模块
##importlogging logging.debug('debug message')logging.info('info message')logging.warning('warning ...
- JavaScript的DOM_操作表格
一.使用HTML标签创建表格 thead.tfoot.caption标签在一个表格中只能有一个 tbody.tr.td.th标签在一个表格中可以有N个 <table border=&quo ...
- Yii 日志组件
详细的介绍查看官网的document:http://www.yiiframework.com/doc/guide/1.1/en/topics.logging 也可以看 Yii 1.1 Applicat ...
- 【[HNOI2005]狡猾的商人】
加权并查集 由于给出信息的是一些一个区间的和为多少,我们显然并不好处理出每一个点应该为多少,这我们根本做不到 但是我们想一下,如果要求一个区间\([l,r]\)的和,那么我们是不是可以利用前缀和\(p ...
- nrf52840蓝牙BLE5.0空中速率测试(nordic对nordic)
一.基础知识: [1]Data Length:物理层发送一包数据的最大值: [2]MTU: ATT层发送一次数据长度的最大值: [3]GAP Event Length:一个connection eve ...
- MyBatis(3)开发dao方法
本次全部学习内容:MyBatisLearning SqlSession SqlSession是一个面向用户(程序员)的接口. SqlSession中提供了很 ...
- linux内核自己添加模块(内核版本:3.0.101)
做内核驱动第一步都是学习如何添加模块,这是基础,有了这个基础,剩下就是写代码了. 由于2.4到2.6内核版本的更新,无论是系统调用还是模块添加机制都有了巨大的变化,本人也因此饱经挫折,最后在3.0.1 ...
- FactoryBean的实现原理与作用
FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...