驱动如下:
/******************************************************************************
* 文 件 名 称:BspLTC2991.c
* 文件功能概述:实现LTC2991接口声明
* 文 件 作 者:
* 版 本:V1.0.0.0
* 修 订 记 录:2017-6-30创建
******************************************************************************/
#include "BspLTC2991.h"
E_I2Cx eLtc2991I2c[E_LTC2991_Max] = {E_I2C_1};
uint8 u8Ltc2991SubAddr[E_LTC2991_Max]={0x90};
/*
* 用于记录LTC2991的内部存储区数据
*/
static uint16 stLTC2991Memory[E_LTC2991_Max][10]={0};
/*******************************************************************************
* 函 数 名:sint8 LTC2991Init(E_LTC2991 eLtc2991)
* 参 数:uint32 ms : 延时时间长度
* 返 回:0:正常返回 -1:发生错误
* 创 建 人:
* 创建时间:2017-6-30
* 详 述:LTC2991的初始化
* 修改记录:2017-6-30创建
*******************************************************************************/
sint8 LTC2991Init(E_LTC2991 eLtc2991)
{
uint8 command = 0;
uint8 RegAddr = 0;
//float temp=0;
if(I2CxInit(eLtc2991I2c[eLtc2991]) == -1)
{
return -1;
}
memset(stLTC2991Memory[eLtc2991], 0, sizeof(stLTC2991Memory[eLtc2991]));
RegAddr = LTC2991_REG_STA_HIGH; //
command = 0xF8; //enable V1-V2;T_internal and Vcc eable
I2CxWriteBytes(eLtc2991I2c[eLtc2991], u8Ltc2991SubAddr[eLtc2991], &RegAddr, 1, &command, 1);
RegAddr = LTC2991_REG_CTRL_V1_4; //
command = 0x08; //enable V1-V4 filter; detect voltage;single-ended voltage
I2CxWriteBytes(eLtc2991I2c[eLtc2991], u8Ltc2991SubAddr[eLtc2991], &RegAddr, 1, &command, 1);
RegAddr = LTC2991_REG_CTRL_V5_8; //
command = 0x08; //enable V5-V8 filter; detect voltage;single-ended voltage
I2CxWriteBytes(eLtc2991I2c[eLtc2991], u8Ltc2991SubAddr[eLtc2991], &RegAddr, 1, &command, 1);
RegAddr = LTC2991_REG_PWM_LSB; //
command = 0x18; //disable PWM; enable Repeated mode; enable temperature filter
I2CxWriteBytes(eLtc2991I2c[eLtc2991], u8Ltc2991SubAddr[eLtc2991], &RegAddr, 1, &command, 1);
LTC2991ReadToMemory(eLtc2991);
//temp = LTC2991GetChannelValue(LTC2991_CH_V1);
return 0;
}
/*******************************************************************************
* 函 数 名:sint16 LTC2991ReadToMemory(E_LTC2991 eLtc2991)
* 参 数:无
* 返 回:0:正常返回 -1:发生错误
* 创 建 人:
* 创建时间:2017-6-30
* 详 述:LTC2991的读取存储值
一次性所有通道全部读取出来,周期性调用即可
* 修改记录:2017-6-30创建
*******************************************************************************/
sint16 LTC2991ReadToMemory(E_LTC2991 eLtc2991)
{
uint8 RegAddr = LTC2991_REG_V1_MSB;
uint8 data[20] = {0};
uint8 temp = 0;
memset(data, 0, 20);
if(I2CxReadBytes(eLtc2991I2c[eLtc2991], u8Ltc2991SubAddr[eLtc2991], &RegAddr, 1, data, 16) == 16)
{
memset(stLTC2991Memory[eLtc2991], 0, sizeof(stLTC2991Memory[eLtc2991]));
for(temp=0; temp<8; temp++)
{
stLTC2991Memory[eLtc2991][temp] = data[2*temp];
stLTC2991Memory[eLtc2991][temp] = ((stLTC2991Memory[eLtc2991][temp]) << 8);
stLTC2991Memory[eLtc2991][temp] |= data[2*temp+1];
}
}
else
{
return -1;
}
return 0;
}
/*******************************************************************************
* 函 数 名:float LTC2991GetChannelValue(E_LTC2991 eLtc2991,E_LTC2991_Channel channel)
* 参 数:无
* 返 回:float temp_f :各通道的转换结果
* 创 建 人:
* 创建时间:2017-6-30
* 详 述:取LTC2991某个通道转换值
V1-V8转换结果的单位为mV
VCC转换结果的单位为mV
温度转换结果保留四位小数
* 修改记录:2017-6-30创建
*******************************************************************************/
float LTC2991GetChannelValue(E_LTC2991 eLtc2991,E_LTC2991_Channel channel)
{
float temp_f = 0.0;
uint8 flag = 0;
uint16 data = stLTC2991Memory[eLtc2991][channel];
if(channel < LTC2991_CH_VCC)
{
/* handle V1-V8 channel value */
if(data & 0x4000)
{
flag = 1;
data ^= 0x3fff;
}
else
{
}
data &= 0x3fff;
temp_f = (float)((float)(data) * (float)LTC2991_SINGLE_ENDED_RATIO);
temp_f = (temp_f / (float)(1000.0)) ;
if(flag == 1)
{
temp_f = (float)(0.0) - temp_f;
}
}
else if(channel == LTC2991_CH_VCC)
{
/* VCC converst value */
data &= 0x1fff;
temp_f = (float)((float)(data) * (float)LTC2991_VCC_RATIO) + 2500;
temp_f = (temp_f / (float)(1000.0)) ;
}
else
{
/* temperature converst value */
data &= 0x1fff;
temp_f = (float)((float)(data) * (float)LTC2991_TEMPERATURE_RATIO);
}
return temp_f;
}
头文件如下:
/******************************************************************************
* 文 件 名 称:BspLTC2991.h
* 文件功能概述:实现LTC2991驱动接口声明
* 文 件 作 者:
* 版 本:V1.0.0.0
* 修 订 记 录:2017-6-30创建
******************************************************************************/
#ifndef __BSP_LTC2991_H__
#define __BSP_LTC2991_H__
/*----------------------------------------------*
* 包含头文件 *
*----------------------------------------------*/
#include "..\BspInterface.h"
/*----------------------------------------------*
* 宏定义 *
*----------------------------------------------*/
#define LTC2991_SINGLE_ENDED_RATIO (305.18) //单点采集的分辨率 305.18uV = 2.5/(2^13)
#define LTC2991_DIFFERENTIAL_RATIO (19.075) //单点采集的分辨率 19.075uV = 2.5/(2^17)
#define LTC2991_VCC_RATIO (305.18) //单点采集的分辨率 305.18uV = 2.5/(2^13)
#define LTC2991_VCC_BASE (2.5) //
#define LTC2991_TEMPERATURE_RATIO (0.0625) //温度的分辨率
#define LTC2991_DIODE_RATIO (38.15) //分辨率为38.15uV
typedef enum
{
LTC2991_REG_STA_LOW = 0X00,
LTC2991_REG_STA_HIGH,
LTC2991_REG_RSV1,
LTC2991_REG_RSV2,
LTC2991_REG_RSV3,
LTC2991_REG_RSV4,
LTC2991_REG_CTRL_V1_4,
LTC2991_REG_CTRL_V5_8,
LTC2991_REG_PWM_LSB,
LTC2991_REG_PWM_MSB,
LTC2991_REG_V1_MSB,
LTC2991_REG_V1_LSB,
LTC2991_REG_V2_MSB,
LTC2991_REG_V2_LSB,
LTC2991_REG_V3_MSB,
LTC2991_REG_V3_LSB,
LTC2991_REG_V4_MSB,
LTC2991_REG_V4_LSB,
LTC2991_REG_V5_MSB,
LTC2991_REG_V5_LSB,
LTC2991_REG_V6_MSB,
LTC2991_REG_V6_LSB,
LTC2991_REG_V7_MSB,
LTC2991_REG_V7_LSB,
LTC2991_REG_V8_MSB,
LTC2991_REG_V8_LSB,
LTC2991_REG_T_INT_MSB,
LTC2991_REG_T_INT_LSB,
LTC2991_REG_VCC_MSB,
LTC2991_REG_VCC_LSB,
}E_LTC2991_Reg;
typedef enum
{
LTC2991_CH_V1 = 0X00,
LTC2991_CH_V2,
LTC2991_CH_V3,
LTC2991_CH_V4,
LTC2991_CH_V5,
LTC2991_CH_V6,
LTC2991_CH_V7,
LTC2991_CH_V8,
LTC2991_CH_VCC,
LTC2991_CH_T,
}E_LTC2991_Channel;
/*----------------------------------------------*
* 常量定义 *
*----------------------------------------------*/
/*----------------------------------------------*
* 外部变量说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 全局变量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 模块级变量 *
*----------------------------------------------*/
typedef enum
{
E_LTC2991_1=0x00,
E_LTC2991_Max,
E_LTC2991_Invalid
}E_LTC2991;
/*----------------------------------------------*
* 外部函数原型说明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 内部函数原型说明 *
*----------------------------------------------*/
sint8 LTC2991Init(E_LTC2991 eLtc2991);
sint16 LTC2991ReadToMemory(E_LTC2991 eLtc2991);
float LTC2991GetChannelValue(E_LTC2991 eLtc2991,E_LTC2991_Channel channel);
#endif