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 键下面 ...
随机推荐
- linu常用命令链接
linux命令大全ps命令详解: http://www.jb51.net/LINUXjishu/151851.html Linux禁止ping以及开启ping的方法: http://www.cnblo ...
- QT网络编程UDP下C/S架构广播通信
QT有封装好的UDP协议的类,QUdpSocket,里面有我们想要的函数接口.感兴趣的话,可以看看. 先搞服务端吧,写一个子类,继承QDialog类,起名为UdpServer类.头文件要引用我们上边说 ...
- 什么是封装? ----------------php中"public"类似的访问修饰符分别有什么作用?----什么是抽象?抽象的关键字以及用法----- 什么是接口?接口的关键字以及用法-------------
什么是封装? ------------------------------------封装是php面向对象的其中一个特性,将多个可重复使用的函数封装到一个类里面.在使用时直接实例化该类的某一个方法,获 ...
- 026json和pickle,xml模块
###json和pickle ##json#dumps()data = #源数据data = json.dumps(data)这时候的data可以写入到文件了#loads()data = f.read ...
- mongoDB 创建数据库、删除数据库
创建数据库 use 命令 MongoDB 用 use + 数据库名称 的方式来创建数据库.use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库. 语法格式 use 语句的基本格式如下: u ...
- Struts2.3.4.1 + Spring3.1.2 + Hibernate4.1.6整合
1. Jar包 2. web.xml配置 3. struts.xml配置 4. hibernate.cfg.xml配置 5. applicationContext.xml配置 6. log4j.pro ...
- 关于浏览器被http://www.51jetso.com/劫持
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wwkaven/article/details/36373447 近期,新装了一下系统.安装软 ...
- Impala 加载Hive的UDF
Impala的UDF有两种: Native Imapal UDF:使用C++开发的,性能极高,官方性能测试比第二种高出将近10倍 Hive的UDF:是Hive中的UDF,直接加载到Impala中,优点 ...
- 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)
链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...
- UVA11987 【Almost Union-Find】
这是一道神奇的题目,我调了大概一天多吧 首先hack一下翻译,操作3并没有要求查询后从其所在集合里删除该元素 于是我们来看一下这三个操作 第一个合并属于并查集的常规操作 第三个操作加权并查集也是可以解 ...