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软件模拟协议与电容触摸控制的更多相关文章

  1. I2C总线协议的软件模拟实现方法

    I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...

  2. 软件模拟I2C通讯

    I2C协议概述,有相当详细的名词解释: 通信数量受限于地址空间和400Pf总线电容. 所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定. ...

  3. I2C总线通讯协议

    I2C总线通讯协议 1. I2C总线简介 I2C是Inter-Integrated Circuit的简称,读作:I-squared-C.由飞利浦公司于1980年代提出,为了让主板.嵌入式系统或手机用以 ...

  4. 【STM32H7教程】第54章 STM32H7的LTDC应用之LCD电阻触摸和电容触摸

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第54章       STM32H7的LTDC应用之LCD电阻 ...

  5. I2C软件调试思路并知识总结

    I2C是一种只使用两根线的串行通信协议.一根线是串行数据线SDA,另外一种是串行时钟线SCL. I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v. I²C的参考设计使用一个7比特长 ...

  6. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    #ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...

  7. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

  8. STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前 ...

  9. win7如何设置某个软件不弹出用户账户控制

    手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面 ...

随机推荐

  1. linux下生成带符号的随机密码

    cat /dev/urandom |tr -dc "[:graph:]"|fold -w 15|head 结果如下:

  2. redis外网连接的一些坑

    前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量.但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问.因此,正好帮人解决一个问题,就拿出来分享一下. 阿呆的故事 ...

  3. 2017U-Mail邮件营销平台新邮件模板功能

    据U-Mail调查表明,企业用户中普遍最关心群发邮件会不会被列入垃圾箱?的确,哪怕你最用功,一旦邮件进了垃圾箱,意味着全盘尽废.业界知名服务商U-Mail一直想用户之所想,急用户之所急,十几年如一日, ...

  4. Promise里捕捉错误的最佳实践

    Promise里的同步部分不需要try catch new Promise((resolve, reject) => { throw new Error('error'); setTimeout ...

  5. [原]Android打包之Eclipse打多渠道包

    Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...

  6. .ne 基础(2)

    类是一种抽象 抽象的概念,具体的实例. 现实是先有对象,再抽象成类,再用类来创建实例 构造方法 (1)如果写好了类,不写构造方法,系统会默认一个无参的构造方法 (2) 如果手动添加了一个 构造方法,就 ...

  7. 说说DBA职责和目标

    数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,他属于运维工程师的一个分支,主要负责业务数据库从设计.测试到部 ...

  8. idea中ssm自动配置

    自动生成 只需要创建好maven项目,然后创建一个类Test,复制代码粘贴即可 使用注意: 代码 import java.io.*; public class Test { //包名格式 //列如配置 ...

  9. 作为测试新手,web测试从何开始学起?

    我们先来弄清楚web测试的测试范围,通常web测试包含:功能测试.性能测试.浏览器兼容测试.安全测试以及用户界面测试等.那么,作为一个初级测试员或者实习测试员,最开始的能做的只能是功能测试和用户界面测 ...

  10. Using Lookup Tables to Accelerate Color Transformations

    转自:http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter24.html In feature-film visual-effects ...