驱动如下:
/******************************************************************************
* 文 件 名 称: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