触摸按键--模拟I2C驱动TS12芯片

TS12芯片驱动

使用模拟I2C驱动TS12完成触摸按键检测功能:

#include "stm8s.h"
#include "global.h"
#include "drv_key.h"

uint8_t KeyByte;

/*******************************************************************************
//  Function:     I2C_Int
//  Description: 模拟I2C 与ds1307端口初始化
//  Param:
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Int(void)
{
   IIC_SDA_OUTPUT;
   IIC_SCL_OUTPUT;
}

/*******************************************************************************
//  Function:     Delay_5us
//  Description:  微妙级延时函数   延时时间约为16us
//  Param:
//  Return:       fcpu 16MHz 时
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void Delay_5us(void)
{
   uint8_t i;
   for (i=5; i>0; i--);
}

/*******************************************************************************
//  Function:     I2C_Start
//  Description:  I2C 开始传输信号  当SCL 为高时  SDA由高变低
//  Param:
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Start(void)
{
    // SDA 1->0 while SCL High
    SDA_HIGH;
    SCL_HIGH;
    Delay_5us(); 

    SDA_LOW;
    Delay_5us(); 

    SCL_LOW;
}

/*******************************************************************************
//  Function:     I2C_Stop
//  Description:  I2C 停止传输信号  当SCL 为高时  SDA由低变高
//  Param:
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_Stop(void)
{
    // SDA 0->1 while SCL High
    SDA_LOW;
    SCL_HIGH;
    Delay_5us();     

    SDA_HIGH;
    Delay_5us();
}

/*******************************************************************************
//  Function:     I2C_SendACK
//  Description:  主机向从机发送应答信号
//  Param:   应答信号 1:表示SDA高电平(无应答) 0:SDA低电平(有应答)
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static void I2C_SendACK(uint8_t ack)
{
    if(ack == 0)
    {
      SDA_LOW;
    }
    else
    {
      SDA_HIGH;
    }

    SCL_HIGH;
    Delay_5us();  

    SCL_LOW;
    Delay_5us();
}

/*******************************************************************************
//  Function:     I2C_SendByte
//  Description:  模拟I2C通信 发送8位数据
//  Param:        发送的8为数据值
//  Return:       返回应答信号  0表示有应答  1表示无应答
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static uint8_t I2C_SendByte(uint8_t SendByte)
{
  static uint8_t i,RevAckTS;

  SDA_LOW;
  for (i= 0 ; i< 8; i++)
  {
    SCL_LOW;    

    if (SendByte & 0x80)             // write data
    {
      SDA_HIGH;
    }
    else
    {
      SDA_LOW;
    }

    Delay_5us();
    SendByte <<=  1;
    SCL_HIGH;
    Delay_5us();
  } 

  SCL_LOW;
  SDA_HIGH;
  Delay_5us();  

  IIC_SDA_INPUT;

  SCL_HIGH;
  asm("nop");
  asm("nop");  

  RevAckTS = (uint8_t)READ_SDA;

  Delay_5us();
  SCL_LOW;   

  IIC_SDA_OUTPUT;
  Delay_5us();  

  return RevAckTS;
}

/*******************************************************************************
//  Function:     I2C_RecvByte
//  Description:  模拟I2C通信 从从机读取8位数据
//  Param:
//  Return:       返回读取的8为数据值
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
static uint8_t I2C_RecvByte()
{
    uint8_t i;
    uint8_t RecvData = 0;

    SDA_HIGH;     // latch the Data port befor reading

    IIC_SDA_INPUT;

    for (i=0; i<8; i++)
    {
       RecvData <<= 1;

       SCL_HIGH; 

       asm("nop");
       asm("nop");

       if (READ_SDA)
       {
          RecvData |= 0x01;
       }
       else
       {
          RecvData &= 0xfe;
       }

       Delay_5us();
       SCL_LOW;
       Delay_5us();
    }

   IIC_SDA_OUTPUT;

   return RecvData;
}

/*******************************************************************************
//  Function:     Ts12_WriteByte
//  Description:  模拟I2C通信 写入1字节数据到指定地址
//  Param:        WriteAddr:待写入数据  WriteData;写入的地址
//  Return:       1: 成功写入  0: 写入出错
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
uint8_t Ts12_WriteByte(uint8_t WriteAddr,uint8_t WriteData)
{
   I2C_Start();      

   if(I2C_SendByte(0xF0))    // Device Addr + Write (operation)
   {
      return 0;
   }

   if(I2C_SendByte(WriteAddr))
   {
      return 0;
   }

   if(I2C_SendByte(WriteData))
   {
      return 0;
   }

   I2C_Stop();   

   return 1;
}

/*******************************************************************************
//  Function:     Ts12_ReadByte
//  Description:  模拟I2C通信 从指定地址读取1字节数据
//  Param:        ReadAddr:读取的地址
//  Return:       RevData:读取的8位数据
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
uint8_t Ts12_ReadByte(uint8_t ReadAddr)
{
  uint8_t RevData;

  I2C_Start();
  I2C_SendByte(0xF0);     // Device Addr + Write (operation)
  I2C_SendByte(ReadAddr); 

  I2C_Start();
  I2C_SendByte(0xF1);     // Device Addr + Read (operation)   

  RevData = I2C_RecvByte();    

  I2C_SendACK(1);

  I2C_Stop();   

  return RevData;
}

void  TS12_InitAgain()
{
   I2C_Start();
   I2C_SendByte(0xf0);
   I2C_SendByte(0x02);
   I2C_SendByte(0xAA);    //Sensitivity1
   I2C_SendByte(0xAA);
   I2C_SendByte(0xAA);
   I2C_SendByte(0xAA);
   I2C_SendByte(0xAA);
   I2C_SendByte(0xAA);
   I2C_SendByte(0x33);    //CTRL1
   I2C_Stop();

   I2C_Start();
   I2C_SendByte(0xF0);
   I2C_SendByte(0x0A);
   I2C_SendByte(0x00);    //Ref_rst1
   I2C_SendByte(0x00);    //Ref_rst2
   I2C_SendByte(0x00);    //Ch_hold1
   I2C_SendByte(0x00);    //Ch_hold2
   I2C_SendByte(0x00);    //Cal_hold1
   I2C_SendByte(0x00);    //Cal_hold2
   I2C_Stop();
}

/*******************************************************************************
//  Function:     Ts12_Init
//  Description:  模拟I2C通信 写入8字节数据 从0x02~0x0f
//  Param:        pWriteData: 指针指向待写入的数组的地址
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
void Ts12_Init()
{
   I2C_Int();

   I2C_Start();
   I2C_SendByte(0xF0);     // Device Addr + Write (operation)
   I2C_SendByte(0x09);
   I2C_SendByte(0x0F);
   I2C_Stop();    

   TS12_InitAgain();  

   I2C_Start();
   I2C_SendByte(0xF0);     // Device Addr + Write (operation)
   I2C_SendByte(0x09);
   I2C_SendByte(0x07);
   I2C_Stop();
}

/*******************************************************************************
//  Function:     Ts12_ReadKey
//  Description:  模拟I2C通信 读取8字节数据 从0x10~0x12
//  Param:        pReadData: 指针指向保存数据的数组
//  Return:
//  Author: Huangzhigang 2014-0410
*******************************************************************************/
void Ts12_ReadKey()
{
  static uint8_t KeyValue1;
  static uint8_t KeyValue2;
  static uint8_t KeyValue3;

  I2C_Start();
  I2C_SendByte(0xF0);     // Device Addr + Write (operation)
  I2C_SendByte(0x10);
//  I2C_Stop();   //此步骤需要确认  -》可加可不加

  I2C_Start();
  I2C_SendByte(0xF1);     // Device Addr + Read (operation)   

  KeyValue1 = I2C_RecvByte();
  I2C_SendACK(0);    //DIO低电平 表示ACK 

  KeyByte = KEY_EVENT_NULL_CLICK;     //每次都清楚按键

  if(((KeyValue1 >> 6) & 0x03 ) >= KeyStandard)   //i-Sense
  {
     KeyByte += KEY_EVENT_SMART_CLICK;
  }

  if(((KeyValue1 >> 4) & 0x03) >= KeyStandard)     //Crisper
  {
     KeyByte += KEY_EVENT_CRISPER_CLICK;
  }

  if(((KeyValue1 >> 2) & 0x03) >= KeyStandard)    //MODE
  {
     KeyByte += KEY_EVENT_MODE_CLICK;
  }

  if((KeyValue1) & 0x03 >= KeyStandard)           //DOWN
  {
     KeyByte += KEY_EVENT_DOWN_CLICK;
  }

  KeyValue2 = I2C_RecvByte();
  I2C_SendACK(0);    //DIO低电平 表示ACK 

  if(((KeyValue2 >> 6) & 0x03) >= KeyStandard)    //Auto Defrost
  {
     KeyByte += KEY_EVENT_AD_CLICK;
  }

  if(((KeyValue2 >> 4) & 0x03) >= KeyStandard)    //UP
  {
     KeyByte += KEY_EVENT_ICE_CLICK;
  }

  if(((KeyValue2 >> 2) & 0x03) >= KeyStandard)    //Fast ICE
  {
     KeyByte += KEY_EVENT_UP_CLICK;
  }

  if((KeyValue2 & 0x03) >= KeyStandard)           //Energy Saving
  {
     KeyByte += KEY_EVENT_SAVE_CLICK;
  }

  KeyValue3 = I2C_RecvByte();
  I2C_SendACK(1);

  if((KeyValue3 & 0x03) >= KeyStandard)          //Manual Defrost
  {
     KeyByte += KEY_EVENT_MD_CLICK;
  }

  I2C_Stop();
}

触摸按键--模拟I2C驱动TS12芯片

时间: 2024-09-30 05:22:45

触摸按键--模拟I2C驱动TS12芯片的相关文章

gpio模拟i2c驱动

前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama5d35 MCU 用其中两个GPIO引脚模拟i2c通信. * 其中两个引脚连接到了hd1650上面.然后检测按键扫描的驱动 * */ 该程序可以作为gpio模拟i2c程序的参考.不同的平台,函数实现不同,但是i2c通信的时序和原理是相同的.希望对一些朋友有帮助. 1 #include<linux/i

Linux的i2c驱动详解

目录(?)[-] 简介 架构 设备注册 I2C关键数据结构和详细注册流程 关键数据结构 详细注册流程 使用I2C子系统资源函数操作I2C设备 Gpio模拟i2c总线的通用传输算法 总结 理清i2c中的个结构体关系 i2c驱动的编写建议 1 简介 I2C 总线仅仅使用 SCL . SDA 两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和 PCB 板布线空间的占用.因此, I2C 总线被非常广泛地应用在 EEPROM .实时钟.小型 LCD 等设备与 CPU 的接口中. Linux I2

S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看发板,读写都行:通过增加一些调试信息,对linux i2c驱动其中的编写方法之一有了一定了解,在我的另外一篇博文有详细说明.但同时对在linux下GPIO模拟i2c产生了兴趣,于是就写这篇博文来记录驱动编写过程中遇到的问题.如果想了解了i2c时序,请google或百度一下. 本篇博文通过misc驱动

Linux内核调用I2C驱动_以MPU6050为例

Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于没有人打扰,有这个奢侈的大块时间,可以一个人安安静静的在教研室看看Linux内核驱动的东西.按照Linux嵌入式学习的进程,SPI驱动搞完了之后就进入到I2C驱动的学习当中,十一还算是比较顺利,I2C的Linux驱动完成了. 为了测试I2C是否好用,选择一个常用的I2C传感器,手头有个MPU6050,刚好作为I2C的

TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

作者:彭东林 邮箱:[email protected] 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   NandFlash:256M  内存:64M) 摘要 这里并不深入分析Linux下I2C驱动的实现,只是以TQ2440硬件平台为例分析I2C驱动的两种方法. 第一种方法: 使用S3C2440自带的I2C控制器实现,这个kernel已经支持,我们只需要配置即可. 第二种方法: 使用GPIO模拟,这个在kernel中

20150503 imx257下实现I2C驱动的四种方法

20150503 imx257下实现I2C驱动的四种方法 2015-05-3 Lover雪儿 时间过得好快,转眼间五一假期就即将结束了,假期期间,大家都潇洒的去玩了,徒留辛辛苦苦的程序员还是窝在宿舍乖乖的敲着代码... 好啦,开开玩笑,辛酸史每家都有一大本,还是要积极的面对生活!!! 今天我们的任务是简单的入门linux内核下i2c设备驱动分离的四种写法. 一.一个简单的i2c驱动 和以前的驱动程序不同,i2c驱动分为drv驱动和dev设备驱动两个文件,不懂的可以参考我以前写的<20150313

I2C驱动详解

I2C讲解: 在JZ2440开发板上,I2C是由两条数据线构成的SCL,SDA:SCL作为时钟总线,SDA作为数据总线:两条线上可挂载I2C设备,如:AT24C08 两条线连接ARM9 I2C控制器,通过控制来控制I2C设备的识别设备地址.读.写操作:如图所示 从中所知:I2C线上可以挂载很多个I2C设备:挂载简单,只需要一根数据线和一根时钟线就可以挂载上去,通过地址来去别每个设备的区别: I2C操作: 对I2C操作主要思想为:1.找到设备  2.进行读写操作 主要原理为: 1.发送开始信号S

MSP430G2553 Launchpad 硬件I2C驱动

一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A和USCI_B,其中USCI_A支持UART/IrDA/LIN/SPI通讯,USCI_B支持I2C/SPI通讯.MSP430G2553带有一个USCI_A和一个USCI_B,硬件I2C对应的管脚为P1.6(UCB0SCL)和P1.7(UCB0SDA). 由于Launchpad上P1.6连接到了LED

i2c驱动(二) core分析

设备和CPU连接方式 1)gpio连接设备 (LED按键) 2)ram-like  会使用到数据线,地址线,控制线 nand DDRAM   DM9000 3)协议类型接口 i2c   spi  usb   uart 按照总线设备来完成AT24C02的驱动程序 1,总线i2c 总线也是设备 该设备也应该实现驱动程序 ,该驱动程序完成的功能就是按照   i2c协议的要求收发数据i2c_transfer(...)?? i2c驱动怎么写的也就是怎么实现的啊)找到i2c控制器的驱动程序 make men