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. htm5 手机自适应问题 文本框被激活(获取焦点)时,页面会放大至原来尺寸。

    加上这句话就ok啦 <meta name="viewport" content="width=device-width, initial-scale=1.0, mi ...

  2. List 的 removeAll 方法的效率

    List 的 removeAll 方法的效率低的原因: 要遍历source,对dest进行contain操作,而contain又要遍历dest进行equal比较. 解决办法:dest转为set,用se ...

  3. June 28th 2017 Week 26th Wednesday

    Anger begins with folly, and ends in repentance. 愤怒以愚蠢开始,以后悔告终. Learn to control your temper, don't ...

  4. Alpha Scrum1

    Alpha Scrum1 牛肉面不要牛肉不要面 Alpha项目冲刺(团队作业5) 各个成员在 Alpha 阶段认领的任务 林志松:音乐网页前端页面编写,博客发布 吴沂章:博客编写 林锃寒:前端页面编写 ...

  5. WC2018 滚粗记

    虽然又考炸了但还是总结一下.. $day0$:没有什么很重要的事.. $day1$:除了听(dong)课(mian)以外没有什么很重要的事.. $day2$:除了听(dong)课(mian)以外没有什 ...

  6. argsort

    argsort函数返回的是数组值从小到大的索引值One dimensional array:一维数组 >>> x = np.array([3, 1, 2]) >>> ...

  7. JZ2440学习笔记之IIS音频芯片WM8976

    音频芯片的接线图:IIS接到MPU的IIS controller上:看L3总线的接法,应该是使用GPIO来模拟时序. IIS总线用来传输音频数据. L3总线用来配置WM8976的内部寄存器. L3总线 ...

  8. 关于ligerui grid 行内编辑 combobox 只能选择的问题

    这个貌似是天然的不支持,修复方案,在ligerGridOrd.js中添加一行代码,如下,跟了一下午的源码,发现在这里的时候,options中只保留了combobox中的一部分属性,所以可能combob ...

  9. 第28章 LTDC—液晶显示中英文

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板配 ...

  10. DQL-子查询

    一:含义 嵌套在其他语句内部的select语句称之为子查询或内查询 外套的语句还可以是 insert,update,delete,一般用select比较多 外面如果是select语句,我们称之为外查询 ...