STM32之LTC2991

驱动如下:

/******************************************************************************
* 文 件  名 称: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

你可能感兴趣的:(ARM)