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℃