stm32 TSM12模块驱动程序_第1页
stm32 TSM12模块驱动程序_第2页
stm32 TSM12模块驱动程序_第3页
stm32 TSM12模块驱动程序_第4页
stm32 TSM12模块驱动程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include "all.h"/* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */#if 0 /* 条件编译: 1 选择GPIO的库函数实现IO读写 */* 定义I2C总线连接的GPIO端口 用户只需要修改下面4行代码即可任意转变SCL和SDA的引脚 */ #define TSM12_RCC_GPIO_SCL RCC_APB2Periph_GPIOA /RCC IIC GPIO/ #define TSM12_RCC_GPIO_SDA RCC_APB2Periph_GPIOC /RCC IIC GPIO/ #define TSM12_GPIO_PORT_I

2、2C_SCL GPIOA /* GPIO端口 */ #define TSM12_GPIO_PORT_I2C_SDA GPIOC /* GPIO端口 */ #define TSM12_I2C_SCL_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */ #define TSM12_I2C_SDA_PIN GPIO_Pin_9 /* 连接到SDA数据线的GPIO */ #define TSM12_I2C_SCL_1() GPIO_SetBits(TSM12_GPIO_PORT_I2C_SCL TSM12_I2C_SCL_PIN) /* SCL = 1 */ #define TSM

3、12_I2C_SCL_0() GPIO_ResetBits(TSM12_GPIO_PORT_I2C_SCL TSM12_I2C_SCL_PIN) /* SCL = 0 */ / #define TSM12_I2C_SDA_1() GPIO_SetBits(TSM12_GPIO_PORT_I2C_SDA TSM12_I2C_SDA_PIN) /* SDA = 1 */ #define TSM12_I2C_SDA_0() GPIO_ResetBits(TSM12_GPIO_PORT_I2C_SDA TSM12_I2C_SDA_PIN) /* SDA = 0 */ #define TSM12_I2C

4、_en() GPIO_SetBits(GPIOC GPIO_Pin_7) /* en = 1 */ #define TSM12_I2C_disen() GPIO_ResetBits(GPIOC GPIO_Pin_7) /* en = 0 */ / #define TSM12_I2C_SDA_READ() GPIO_ReadInputDataBit(TSM12_GPIO_PORT_I2C_SDA TSM12_I2C_SDA_PIN) /* 读SDA口线状态 */ #define TSM12_RCC_GPIO_SCL RCC_APB2Periph_GPIOA /RCC IIC GPIO #defi

5、ne TSM12_RCC_GPIO_SDA RCC_APB2Periph_GPIOC /RCC IIC GPIO #define TSM12_GPIO_PORT_I2C_SCL GPIOA /* GPIO端口 */ #define TSM12_GPIO_PORT_I2C_SDA GPIOC /* GPIO端口 */ #define TSM12_I2C_SCL_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */ #define TSM12_I2C_SDA_PIN GPIO_Pin_9 /* 连接到SDA数据线的GPIO */ #define TSM12_I2C_SCL_1()

6、 GPIO_SetBits(GPIOA GPIO_Pin_8) /* SCL = 1 */ #define TSM12_I2C_SCL_0() GPIO_ResetBits(GPIOA GPIO_Pin_8) /* SCL = 0 */ #define TSM12_I2C_SDA_1() GPIO_SetBits(GPIOC GPIO_Pin_9) /* SDA = 1 */ #define TSM12_I2C_SDA_0() GPIO_ResetBits(GPIOC GPIO_Pin_9) /* SDA = 0 */ #define TSM12_I2C_en() GPIO_ResetBits

7、(GPIOC GPIO_Pin_7) /* en = 1 */ #define TSM12_I2C_disen() GPIO_SetBits(GPIOC GPIO_Pin_7) /* en = 0 */ #define TSM12_I2C_SDA_READ() GPIO_ReadInputDataBit(GPIOC GPIO_Pin_9) /* 读SDA口线状态 */ static void TSM12_SDA_IN(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO

8、_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOC &GPIO_InitStructure); static void TSM12_SDA_OUT(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_

9、InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC &GPIO_InitStructure); /* 函 数 名: TSM12_i2c_Delay* 功能说明: I2C总线位延迟,最快400KHz* 形 参:无* 返 回 值: 无*/static void TSM12_i2c_Delay(void) uint8_t i; /* 下面的时间是通过安富莱AX-Pro规律分析仪测试得到的。 CPU主频72MHz时,在内部Flash运行 MDK工程不优化 循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频

10、率 = 347KHz, SCL高电平常间1.5us,SCL低电平常间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平常间1.25us,SCL低电平常间2.375us IAR工程编译效率高,不能设置为7 */ for (i = 0; i < 10; i+);/* 函 数 名: TSM12_i2c_GPIO_Config* 功能说明: 配置I2C总线的GPIO,接受模拟IO的方式实现* 形 参:无* 返 回 值: 无*/void TSM12_i2c_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_

11、APB2PeriphClockCmd(TSM12_RCC_GPIO_SCL|TSM12_RCC_GPIO_SDAENABLE);/使能MOS管PD PB PE PGIO的外设时钟 GPIO_InitStructure.GPIO_Pin = TSM12_I2C_SCL_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TSM12_GPIO_PORT_I2C_SCL &GPIO_InitStructure); GP

12、IO_InitStructure.GPIO_Pin = TSM12_I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TSM12_GPIO_PORT_I2C_SDA &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GP

13、IO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC &GPIO_InitStructure); TSM12_i2c_Stop();/* 函 数 名: TSM12_i2c_Start* 功能说明: CPU发起I2C总线启动信号* 形 参:无* 返 回 值: 无*/void TSM12_i2c_Start(void) /* 当SCL高电平常,SDA消灭一个下跳沿表示I2C总线启动信号 */ TSM12_SDA_OUT(); TSM12_I2C_SDA_1(); TSM12_I2C_SCL_1(); TSM12_i2c

14、_Delay(); TSM12_I2C_SDA_0(); TSM12_i2c_Delay(); TSM12_I2C_SCL_0(); TSM12_i2c_Delay();/* 函 数 名: TSM12_i2c_Start* 功能说明: CPU发起I2C总线停止信号* 形 参:无* 返 回 值: 无*/void TSM12_i2c_Stop(void) /* 当SCL高电平常,SDA消灭一个上跳沿表示I2C总线停止信号 */ TSM12_SDA_OUT(); TSM12_I2C_SDA_0(); TSM12_I2C_SCL_1(); TSM12_i2c_Delay(); TSM12_I2C_SD

15、A_1();/* 函 数 名: TSM12_i2c_SendByte* 功能说明: CPU向I2C总线设备发送8bit数据* 形 参:_ucByte : 等待发送的字节* 返 回 值: 无*/void TSM12_i2c_SendByte(uint8_t _ucByte) uint8_t i; TSM12_SDA_OUT(); /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i+) if (_ucByte & 0x80) TSM12_I2C_SDA_1(); else TSM12_I2C_SDA_0(); TSM12_i2c_Delay(); TSM1

16、2_I2C_SCL_1(); TSM12_i2c_Delay(); TSM12_I2C_SCL_0(); if (i = 7) TSM12_I2C_SDA_1(); / 释放总线 _ucByte <<= 1; /* 左移一个bit */ TSM12_i2c_Delay(); /* 函 数 名: TSM12_i2c_ReadByte* 功能说明: CPU从I2C总线设备读取8bit数据* 形 参:无* 返 回 值: 读到的数据*/uint8_t TSM12_i2c_ReadByte(uint8_t ack) uint8_t i; uint8_t value; TSM12_SDA_OU

17、T(); /* 读到第1个bit为数据的bit7 */ value = 0; for (i = 0; i < 8; i+) value <<= 1; TSM12_I2C_SCL_1(); TSM12_i2c_Delay(); TSM12_SDA_IN();/输入等待SDA if (TSM12_I2C_SDA_READ() value+; TSM12_I2C_SCL_0(); TSM12_i2c_Delay(); if(ack=0) TSM12_i2c_NAck(); else TSM12_i2c_Ack(); /OutputIO(GPIOA GPIO_Pin_15 1); /

18、配置输出 return value;/* 函 数 名: TSM12_i2c_WaitAck* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号* 形 参:无* 返 回 值: 返回0表示正确应答,1表示无器件响应*/uint8_t TSM12_i2c_WaitAck(void) uint8_t re; TSM12_SDA_IN(); /输入等待SDA TSM12_I2C_SDA_1(); /* CPU释放SDA总线 */ TSM12_i2c_Delay(); TSM12_I2C_SCL_1(); /* CPU驱动SCL = 1 此时器件会返回ACK应答 */ TSM12_i2c_Del

19、ay(); if (TSM12_I2C_SDA_READ() /* CPU读取SDA口线状态 */ re = 1; else re = 0; TSM12_I2C_SCL_0(); TSM12_i2c_Delay(); /OutputIO(GPIOA GPIO_Pin_15 1); /配置输出 return re;/* 函 数 名: TSM12_i2c_Ack* 功能说明: CPU产生一个ACK信号* 形 参:无* 返 回 值: 无*/void TSM12_i2c_Ack(void) TSM12_SDA_OUT(); TSM12_I2C_SDA_0(); /* CPU驱动SDA = 0 */ T

20、SM12_i2c_Delay(); TSM12_I2C_SCL_1(); /* CPU产生1个时钟 */ TSM12_i2c_Delay(); TSM12_I2C_SCL_0(); TSM12_i2c_Delay(); TSM12_I2C_SDA_1(); /* CPU释放SDA总线 */* 函 数 名: TSM12_i2c_NAck* 功能说明: CPU产生1个NACK信号* 形 参:无* 返 回 值: 无*/void TSM12_i2c_NAck(void) TSM12_SDA_OUT(); TSM12_I2C_SDA_1(); /* CPU驱动SDA = 1 */ TSM12_i2c_D

21、elay(); TSM12_I2C_SCL_1(); /* CPU产生1个时钟 */ TSM12_i2c_Delay(); TSM12_I2C_SCL_0(); TSM12_i2c_Delay();/* 函 数 名: TSM12_i2c_CheckDevice* 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来推断该设备是否存在* 形 参:_Address:设备的I2C总线地址* 返 回 值: 返回值 0 表示正确, 返回1表示未探测到*/uint8_t TSM12_i2c_CheckDevice(uint8_t _Address) uint8_t ucAck; TSM

22、12_i2c_GPIO_Config(); /* 配置GPIO */ TSM12_i2c_Start(); /* 发送启动信号 */ /* 发送设备地址+读写把握bit(0 = w, 1 = r) bit7 先传 */ TSM12_i2c_SendByte(_Address|I2C_WR); ucAck = TSM12_i2c_WaitAck(); /* 检测设备的ACK应答 */ TSM12_i2c_Stop(); /* 发送停止信号 */ return ucAck;/*/ * brief 写数据到TSM12寄存器/ * param / * retval / */void TSM12_Wri

23、teReg(uint8_t reg_datuint8_t CMD)/ i2c_Start();/ i2c_SendByte(SSD1306_ADDRESS);/ i2c_WaitAck();/ i2c_SendByte(reg_add);/ i2c_WaitAck();/ i2c_SendByte(reg_dat);/ i2c_WaitAck();/ i2c_Stop();/ TSM12_i2c_Start();/ TSM12_i2c_SendByte(TSM12_ADDRESS);/ TSM12_i2c_WaitAck();/ if(CMD)TSM12_i2c_SendByte(0x40);

24、/ else TSM12_i2c_SendByte(0x00);/ TSM12_i2c_WaitAck();/ TSM12_i2c_SendByte(reg_dat);/ TSM12_i2c_WaitAck();/ TSM12_i2c_Stop();/*/ * brief 写数据到TSM12 * param * retval */void TSM12_WriteReg(uint8_t reg_adduint8_t reg_dat) TSM12_i2c_Start(); TSM12_i2c_SendByte(TSM12_ADDRESS); TSM12_i2c_WaitAck(); TSM12_i

25、2c_SendByte(reg_add); TSM12_i2c_WaitAck(); TSM12_i2c_SendByte(reg_dat); TSM12_i2c_WaitAck(); TSM12_i2c_Stop();/*/ * brief 从TSM12读数据 * param * retval */void TSM12_ReadData(uint8_t reg_addunsigned char*Readuint8_t num) unsigned char i; TSM12_i2c_Start(); TSM12_i2c_SendByte(TSM12_ADDRESS); TSM12_i2c_Wa

26、itAck(); TSM12_i2c_SendByte(reg_add); TSM12_i2c_WaitAck(); TSM12_i2c_Stop(); TSM12_i2c_Start(); TSM12_i2c_SendByte(TSM12_ADDRESS+1); TSM12_i2c_WaitAck(); for(i=0;i<(num-1);i+) *Read=TSM12_i2c_ReadByte(1); Read+; *Read=TSM12_i2c_ReadByte(0); TSM12_i2c_Stop();void TSM12_init(void) TSM12_I2C_en(); D

27、elay_ms(100);/必需有这个延时 TSM12_WriteReg(CTRL2 0x0f); /复位 TSM12_WriteReg(CTRL2 0x07); /复位 TSM12_WriteReg(SENS1 CH_SENS(22);/ /灵敏度 TSM12_WriteReg(SENS2 CH_SENS(22);/ TSM12_WriteReg(SENS3 CH_SENS(32); / * 9 TSM12_WriteReg(SENS4 CH_SENS(22);/# 0 TSM12_WriteReg(SENS5 CH_SENS(22);/1 4 TSM12_WriteReg(SENS6 CH

28、_SENS(22);/2 3 TSM12_WriteReg(CTRL1 0x08);/设置为0x88、0x80不会自动休眠 TSM12_WriteReg(CTRL2 0x03); TSM12_WriteReg(REF_RST1 0x00); TSM12_WriteReg(REF_RST2 0x00); TSM12_WriteReg(CH_HOLD1 0x00); TSM12_WriteReg(CH_HOLD2 0x00); TSM12_WriteReg(CAL_HOLD1 0x00); TSM12_WriteReg(CAL_HOLD2 0x00); TSM12_I2C_disen();/*/v

29、oid TSM12_Into_Sleep_Mode(void) TSM12_I2C_en(); TSM12_WriteReg(CTRL2 0x07); /?0aH?18? TSM12_WriteReg(REF_RST1 0x00); TSM12_WriteReg(REF_RST2 0x00); TSM12_I2C_disen();/*? ?: TSM12_Exit_Sleep_Mode()*/void TSM12_Exit_Sleep_Mode(void) TSM12_I2C_en(); TSM12_WriteReg(CTRL2 0x03); TSM12_WriteReg(REF_RST1 0

30、x00); TSM12_WriteReg(REF_RST2 0x00); TSM12_I2C_disen();void TSM12_Run(void) TSM12_I2C_en(); TSM12_WriteReg(CTRL2 0x03); /?0aH?18? TSM12_WriteReg(CH_HOLD1 0x00); TSM12_WriteReg(CH_HOLD2 0x00); TSM12_I2C_disen();void TSM12_Stop(void) TSM12_I2C_en(); TSM12_WriteReg(CTRL2 0x07); /?0aH?18? TSM12_WriteReg

31、(CH_HOLD10xFF); TSM12_WriteReg(CH_HOLD20x0F); TSM12_I2C_disen();unsigned char get_key(void) unsigned char temp3; u8 Key_Value=0; TSM12_I2C_en(); TSM12_ReadData(OUTPUT1temp+01);/?14 TSM12_ReadData(OUTPUT2temp+11); TSM12_ReadData(OUTPUT3temp+21); TSM12_I2C_disen(); if(temp2 > 0) switch(temp2) case

32、0x01: case 0x02: /# case 0x03:Key_Value=0x02;break; case 0x04: case 0x08: /9 case 0x0c:Key_Value=0x07;break; case 0x10: case 0x20: /6 case 0x30:Key_Value=0x04;break; case 0x40: case 0x80: /3 case 0xc0:Key_Value=0x03;break; default:Key_Value=0xff;break; else if(temp1 > 0) switch(temp1) case 0x01:

33、case 0x02: case 0x03:Key_Value=0x09;break; /0 case 0x04: case 0x08: case 0x0c:Key_Value=0x06;break; /8 case 0x10: case 0x20: case 0x30:Key_Value=0x0b;break; /5 case 0x40: case 0x80: case 0xc0:Key_Value=0x01;break; /2 default:Key_Value=0xff;break; else if(temp0 > 0) switch(temp0) case 0x01: case 0

34、x02: case 0x03:Key_Value=0x00;break; /1 case 0x04: case 0x08: case 0x0c:Key_Value=0x05;break; /4 case 0x10: case 0x20: case 0x30:Key_Value=0x0a;break; /7 case 0x40: case 0x80: case 0xc0:Key_Value=0x08;break; /* default:Key_Value=0xff;break; else Key_Value=0xff; return Key_Value;#ifndef _TSM12_H_#define _TSM12_H_#include "all.h"#define TSM12_ADDRESS 0xD0/ /TSM12器件读地址#define I2C_WR 0 /* 写把握bit */#define I2C_RD 1 /* 读把握bit */#define CH_SENS(ab) 0x#a#btypedef enumSENS1 = 0x02 /Sensitivity Channel 2 and 1SENS2 = 0x03 /Channel 4 and 3SENS3 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论