【BLE】TLSR8258开发记录之9--IIC驱动TMP102

1、说明

基于SDK3.4完成温度传感器TMP102的驱动(参考甜甜大香瓜的博客点击
TMP102 参数如下:
在这里插入图片描述

2、操作

A.在MG_Application目录下新建MG_TMP102.c和MG_TMP102.h,
其中,MG_TMP102.c的代码为

/*
* MG_TMP102.c
*
*  Created on: 2019-9-23
*      Author: huangjinxu
*/
#include "MG_tmp102.h"
//TMP相关寄存器定义
#define TMP102SLAVEADDR                 0x90 //0x48<<1
//TMP102 寄存器地址
#define TMP102_REG_ADDR_TEMPERATURE     0x00
#define TMP102_REG_ADDR_CONFIG          0x01
/* Register length */
#define IRTEMP_REG_LEN                  2
#define I2CCLOCK                        (unsigned  char)(CLOCK_SYS_CLOCK_HZ/(4*200000))
void MG_TMP102_ReadReg(unsigned char addr, unsigned char *pBuf, unsigned  char nBytes);
void MG_TMP102_WriteReg(unsigned char addr, unsigned char *pBuf,  unsigned char nBytes);
void MG_TMP102_Config(unsigned char* pData, unsigned char read_write);
/*
函数说明:传感器初始化
入口参数:none
最后修改时间:20190906 14:00
*/
void MG_Sensor_Init()
{
    unsigned char Config_Read_buf[2]= {0x00};
    unsigned char Config_Write_buf[2] = {0x70,0xA0};
    //PC0:SDA,PC1:SCL
    i2c_gpio_set(I2C_GPIO_GROUP_C0C1);
    //TMP102SLAVEADDR,IIC:200KHz
    i2c_master_init(TMP102SLAVEADDR,I2CCLOCK);
    //读取配置寄存器
    MG_TMP102_Config(Config_Read_buf,TPM102_REGISTER_READ);
    //配置寄存器,开启温度转换功能
    MG_TMP102_Config(Config_Write_buf,TPM102_REGISTER_WRITE);
    //读取配置寄存器
    MG_TMP102_Config(Config_Read_buf,TPM102_REGISTER_READ);
}
/*
函数说明:传感器读出温度数据
入口参数:*pData:存放温度数据的缓冲
最后修改时间:20190906 14:00
*/
void MG_Sensor_Work(unsigned char *pData)
{
    MG_TMP102_ReadReg(TMP102_REG_ADDR_TEMPERATURE,pData,IRTEMP_REG_LEN);
}
//TMP102寄存器设置
void MG_TMP102_Config(unsigned char* pData, unsigned char read_write)
{
    switch (read_write)
        {
        case TPM102_REGISTER_READ:
            MG_TMP102_ReadReg(TMP102_REG_ADDR_CONFIG,pData,IRTEMP_REG_LEN);
            break;
        case TPM102_REGISTER_WRITE:
             MG_TMP102_WriteReg(TMP102_REG_ADDR_CONFIG,pData,IRTEMP_REG_LEN);
            break;
        }
}
//TMP102读寄存器
void MG_TMP102_ReadReg(unsigned char addr, unsigned char *pBuf, unsigned  char nBytes)
{
    i2c_read_series(addr,1,pBuf,nBytes);
}
//TMP102写寄存器
void MG_TMP102_WriteReg(unsigned char addr, unsigned char *pBuf,  unsigned char nBytes)
{
    i2c_write_series(addr,1,pBuf,nBytes);
}

MG_TMP102.h的代码如下

/*
* MG_TMP102.h
*
*  Created on: 2019-9-23
*      Author: huangjinxu
*/
#ifndef MG_TMP102_H_
#define MG_TMP102_H_
//公共头文件
#include "tl_common.h"
#define TPM102_REGISTER_READ                    0
#define TPM102_REGISTER_WRITE                   1
//任意字节获取
#define BYTE0(Temp)  ( *( ( (u8*)(&Temp)+0 ) ) )
#define BYTE1(Temp)  ( *( ( (u8*)(&Temp)+1 ) ) )
#define BYTE2(Temp)  ( *( ( (u8*)(&Temp)+2 ) ) )
#define BYTE3(Temp)  ( *( ( (u8*)(&Temp)+3 ) ) )
//外部函数
extern void MG_Sensor_Init();
extern void MG_Sensor_Work(unsigned char *pData);
#endif /* MG_TMP102_H_ */

B.tl_common.h中添加以下头文件路径

#include "drivers/8258/i2c.h"
#include "vendor/8258_ble_remote/MG_Application/MG_TMP102.h"

C.在app.c的user_init_normal函数中中添加测试代码

  u8 sensor_buf[2]={0x00,0x00};
  u16 sensor_temp=0;
  u8 sensor_out[2]={0x00,0x00};

  MG_Sensor_Init();
  MG_Sensor_Work(sensor_buf);
  sensor_temp = (sensor_buf[0]*256);
  sensor_temp |= sensor_buf[1];
  sensor_temp = sensor_temp>>4;//低4位无作用
  printf("Sensor data[1] is: %d\r\n",sensor_temp);

   // sensor_data = (float)(sensor_temp*0.0625);
   // sensor_temp = (u16)(sensor_data*100);
    //printf("Sensor data[1] is: %d\r\n",sensor_temp);

  sensor_temp *= 100;//先扩大100倍
  sensor_temp = sensor_temp>>4;//sensor_temp*0.0625
  sensor_out[0] = (u8)((sensor_temp>>8)&0xFF);
  sensor_out[1] = (u8)((sensor_temp)&0xFF);
  printf("Sensor data[0] is: %x\r\n",sensor_out[0]);
  printf("Sensor data[1] is: %x\r\n",sensor_out[1]);
  printf("Sensor data is: %d\r\n",sensor_temp);

3、现象

一上电显示读取到的温度为2731/100 = 27.31℃
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值