STM32之LTC2636

驱动如下:

/******************************************************************************
* 文 件  名 称:BspLTC2636.c
* 文件功能概述:实现LTC2636的接口
* 文 件  作 者:    
* 版        本:V1.0.0.0
* 修 订  记 录:2017-6-30创建
******************************************************************************/
  
/***********************************相关配置***********************************  
LTC2636采用SPI串行通信时,LTC在CLK的上升沿取数据,首先发送高位数据  
使用的LTC2636芯片为12bit精度
*******************************************************************************/
  
#include "BspLTC2636.h"

/*
 * 数据结构-LTC2636端口信息
 */
typedef struct LTC2336CtrlStruc
{
  E_SPIx     LTC2636xSPIx;
  S_GpioCtrl LTC2636xCS;
}S_LTC2336Ctrl;

/*
 * 用于记录LTC2636的端口信息
 */
static S_LTC2336Ctrl stLTC2636Ctrl[E_LTC2636_Max] = 
{
 {E_SPI_1,{RCC_AHB1Periph_GPIOF,GPIOF,GPIO_Pin_14}},
 {E_SPI_3,{RCC_AHB1Periph_GPIOH,GPIOH,GPIO_Pin_13}}
};

/*
 *SPI总线上挂接的设备类型不一样,每次使用前均需对总线进行初始化
 */
static void LTC2636InitSPIModule(E_LTC2636 eLtc2636)
{
	SPI_InitTypeDef SPIxInitStruct;  
    
  /* Initialize the SPI_Direction member */
  SPIxInitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  /* initialize the SPI_Mode member */
  SPIxInitStruct.SPI_Mode = SPI_Mode_Master;
  /* initialize the SPI_DataSize member */
  SPIxInitStruct.SPI_DataSize = SPI_DataSize_8b;
  /* Initialize the SPI_CPOL member */
  SPIxInitStruct.SPI_CPOL = SPI_CPOL_Low;
  /* Initialize the SPI_CPHA member */
  SPIxInitStruct.SPI_CPHA = SPI_CPHA_1Edge;
  /* Initialize the SPI_NSS member */
  SPIxInitStruct.SPI_NSS = SPI_NSS_Soft;    
  /* Initialize the SPI_FirstBit member */
  SPIxInitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
  /* Initialize the SPI_CRCPolynomial member */
  SPIxInitStruct.SPI_CRCPolynomial = 7;
	
	SPIxUpdateModule(stLTC2636Ctrl[eLtc2636].LTC2636xSPIx,&SPIxInitStruct);
	
}

/*
 * 不选中当前LTC2636
 */
static __inline void LTC2636_CS_UNSELECTED(E_LTC2636 eLtc2636)  
{
  GPIOxWriteBit(stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOx, 
                stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOxPinx, 
                1);
}

/*
 * 选中当前LTC2636
 */
static __inline void LTC2636_CS_SELECTED(E_LTC2636 eLtc2636)   
{
  GPIOxWriteBit(stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOx, 
                stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOxPinx , 
                0);
}

/*******************************************************************************
 * 函 数 名:sint8 LTC2636Init(E_LTC2636 eLtc2636)
 * 参    数:E_LTC2636 eLtc2636:详见E_LTC2636
 * 返    回:0 :正常返回  -1 :发生错误
 * 创 建 人:    
 * 创建时间:2017-6-30
 * 详    述:LTC2636初始化
 * 修改记录:2017-6-30创建
*******************************************************************************/
sint8 LTC2636Init(E_LTC2636 eLtc2636)
{
  sint8 ret = 0;
  
  if(eLtc2636 < E_LTC2636_Max)
  {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
    /* 配置CS引脚 */
    RCC_AHB1PeriphClockCmd(stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOxSource, ENABLE);
    
    /* 配置CS引脚 */
    GPIO_InitStructure.GPIO_Pin = stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOxPinx;
    GPIO_Init(stLTC2636Ctrl[eLtc2636].LTC2636xCS.GPIOx, &GPIO_InitStructure);
           
    LTC2636_CS_UNSELECTED(eLtc2636);
    
    /* 设置所有通道数据为0 */
    LTC2636_CS_SELECTED(eLtc2636);
    LTC2636WriteValue(eLtc2636,SELECT_EXTERNAL_REF,LTC_CHANNEL_ALL,0x0000);
    LTC2636_CS_UNSELECTED(eLtc2636);
  }
  else
  {
    ret = -1;
  }
  
  return ret;
}

/*******************************************************************************
 * 函 数 名:sint8 LTC2636WriteValue(E_LTC2636 eLtc2636,uint8 command, uint8 channel, uint16 value)
 * 参    数: E_LTC2636 eLtc2636: E_LTC2636_1或 E_LTC2636_2
             uint8 command : 命令码
             uint8 channel : 通道
             uint16 value  : 数据
 * 返    回: 0 :正常返回  -1 :命令错误
             -2:通道错误  -3 :写操作错误
 * 创 建 人:    
 * 创建时间:2017-6-30
 * 详    述:LTC2636设置某个通道的值
 * 修改记录:2017-6-30创建
*******************************************************************************/
sint8 LTC2636WriteValue(E_LTC2636 eLtc2636,uint8 command, uint8 channel, uint16 value)
{
 
  uint8 data[3]={0, 0, 0};
  
	LTC2636InitSPIModule(eLtc2636);//SPI总线上挂接的设备类型不一样,每次使用前均需对总线进行初始化
	
  if((command&0x0F) != 0)
  {
    return -1;
  }
  else
  {
    if((command>SELECT_EXTERNAL_REF) && (command != NO_OPERATION))
    {
      return -1;
    }
    else
    {}
  }
  
  if((channel&0xF0) != 0)
  {
    return -2;
  }
  else
  {
    if((channel>LTC_CHANNEL_H) && (channel != LTC_CHANNEL_ALL))
    {
      return -2;
    }
    else
    {}
  }
  
  data[0] = command | channel;
  data[1] = (value >> 4) & 0xff;
  data[2] = (value & 0x000f) << 4;
 
  LTC2636_CS_SELECTED(eLtc2636);
 
  if(SPIxWriteBytes(stLTC2636Ctrl[eLtc2636].LTC2636xSPIx, data, 3) != 3)
  {
    LTC2636_CS_UNSELECTED(eLtc2636);
    return -3;
  }
  else
  {}
 
  LTC2636_CS_UNSELECTED(eLtc2636);

  return 0; 
}

/*******************************************************************************
 * 函 数 名:uint16 LTC2636VoltageToResistor(float voltage, float MaxValue)
 * 参    数: float voltage    : 需要量化得数据(要转换的电压值)     单位是mv      
             float MaxValue : 最大值
 * 返    回: 0xFFFF :发生错误
           非0xFFFF :量化后的数据
 * 创 建 人:    
 * 创建时间:2017-6-30
 * 详    述:根据传入输出数据,计算量化得到符合LTC2636范围的数据
 * 修改记录:2017-6-30创建
*******************************************************************************/
uint16 LTC2636VoltageToResistor(float voltage, float MaxValue)
{
  uint16 result = 0;
  
  if(voltage > MaxValue)
  {
    voltage =  MaxValue;
  }
  else
  {}
  
  result = (uint16)roundf((float)((voltage / MaxValue) * LTC2636_RATIO));
  
  return result;
}

头文件如下:

/******************************************************************************
* 文 件  名 称:BspLTC2636.h
* 文件功能概述:实现LTC2636驱动接口声明
* 文 件  作 者:   
* 版        本:V1.0.0.0
* 修 订  记 录:2017-6-30创建
******************************************************************************/

#ifndef __BSP_LTC2636_H__
#define __BSP_LTC2636_H__


/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/
#include "..\BspInterface.h"
/*----------------------------------------------*
 * 宏定义                                       *
 *----------------------------------------------*/

#define LTC2636_REF_VOLTAGE (2500.0f)    //单位为mv 
#define LTC2636_RATIO       (0xFFF)  //精度
 
/**************命令码***************************/ 
#define WRITE_REGISTERn            0x00
#define UPDATE_REGISTERn           0x10
#define WRITE_REGISTERn_UPDATE_ALL 0x20
#define WRITE_UPDATE_REGISTERn     0x30
#define POWER_DOWN_CHANNELn        0x40
#define POWER_DOWN_CHIP            0x50
#define SELECT_INTERNAL_REF        0x60
#define SELECT_EXTERNAL_REF        0x70
#define NO_OPERATION               0xF0

/**************地址码***************************/ 
#define LTC_CHANNEL_A   0x00
#define LTC_CHANNEL_B   0x01
#define LTC_CHANNEL_C   0x02
#define LTC_CHANNEL_D   0x03
#define LTC_CHANNEL_E   0x04
#define LTC_CHANNEL_F   0x05
#define LTC_CHANNEL_G   0x06
#define LTC_CHANNEL_H   0x07
#define LTC_CHANNEL_ALL 0x0F

/***************端口定义******************************/

#define LTC2636_SPI_SUBADDR 0     //该参数当前无意义

/*----------------------------------------------*
 * 常量定义                                     *
 *----------------------------------------------*/
typedef enum
{
  E_LTC2636_1=0x00,
  E_LTC2636_2,
	
  E_LTC2636_Max,
  
  E_LTC2636_Invalid
}E_LTC2636; 
 
/*----------------------------------------------*
 * 外部变量说明                                 *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 全局变量                                     *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 模块级变量                                   *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 外部函数原型说明                             *
 *----------------------------------------------*/

/*----------------------------------------------*
 * 内部函数原型说明                             *
 *----------------------------------------------*/
 
sint8 LTC2636Init(E_LTC2636 eLtc2636);

sint8 LTC2636WriteValue(E_LTC2636 eLtc2636,uint8 command, uint8 channel, uint16 value);

uint16 LTC2636VoltageToResistor(float voltage, float MaxValue);

#endif

你可能感兴趣的:(ARM)