ad7799驱动程序stm32
/**************************************************andon********
******************************************
* 文件
名:ad7799.h
* 作者:hhp
* 时间:
2015-03-11
* 描述:ad7799驱
动文件,包括函数声明,寄存器定义等
*
*
****************************************************andon******
*******************************************/
#ifndef __AD7799_H__
#define __AD7799_H__
#include "stm32f10x.h"
//用户自己定义使用的管脚
#define ad7799_SPI SPI1
#define ad7799_CS_Port GPIOA
#define ad7799_CS_Pin GPIO_Pin_0
#define ad7799_DIN_Port GPIOA
#define ad7799_DIN_Pin GPIO_Pin_0
#define ad7799_DOUT_Port GPIOA
#define ad7799_DOUT_Pin GPIO_Pin_0
#define ad7799_SCLK_Port GPIOA
#define ad7799_SCLK_Pin GPIO_Pin_0
//ad7799内部寄存器地址
typedef enum
{
ad7799_COM_STAT = ((unsigned char)(0x00)),//通信、状态寄存器地
址
ad7799_MODE = ((unsigned char)(0x01)),//模式寄存器
ad7799_CONFIG = ((unsigned char)(0x02)),//配置寄存器
ad7799_DATA = ((unsigned char)(0x03)),//数据寄存器
ad7799_ID = ((unsigned char)(0x04)),//ID寄存器
ad7799_IO = ((unsigned char)(0x05)),//IO寄存器
ad7799_OFFSET = ((unsigned char)(0x06)),//偏移校准寄存器
ad7799_FULL_SCALE = ((unsigned char)(0x07)),//满量程校准寄存器
}ad7799_Register_TypeDef;
//状态寄存器屏蔽位
typedef enum
{
ad7799_StatCH0 = ((unsigned char)(0x01<<0)),//通道0被转换完成
ad7799_StatCH1 = ((unsigned char)(0x01<<1)),//通道1被转换完成
ad7799_StatCH2 = ((unsigned char)(0x01<<2)),//通道2被转换完成
ad7799_StatNOR = ((unsigned char)(0x01<<5)),//参考电压低于阈值
ad7799_StatERR = ((unsigned char)(0x01<<6)),//超出转换范围
ad7799_StatRDY = ((unsigned char)(0x01<<7)),//转换完成标志
}ad7799_StatMask_TypeDef;
//模式寄存器MD15-MD13 bit
typedef enum
{
ad7799_MD_CC = ((unsigned short)0x0000<<13),//连续转换模式(默认)
ad7799_MD_SC = ((unsigned short)0x0001<<13),//单次转换模式
ad7799_MD_ID = ((unsigned short)0x0002<<13),//空闲模式
ad7799_MD_PD = ((unsigned short)0x0003<<13),//掉电模式
ad7799_MD_IZSC = ((unsigned short)0x0004<<13),//内部零点校准,校准完成后恢复到空闲模式
ad7799_MD_IFSC = ((unsigned short)0x0005<<13),//内部满量程校准
ad7799_MD_SZSC = ((unsigned short)0x0006<<13),//系统零点校准
ad7799_MD_SFSC = ((unsigned short)0x0007<<13),//
系统满量程校准
}ad7799_Mode_MD_TypeDef;
//模式寄存器MD12 bit
typedef enum
{
ad7799_PSW_OPEN = ((unsigned short)(0x0000<<12)),//与地断开
连接
ad7799_PSW_CLOSE = ((unsigned short)(0x0001<<12)),//连接到地
}ad7799_Mode_PSW_TypeDef;
//模式寄存器MD4-MD0 bit,转换速率设置
typedef enum
{
ad7799_MD_FS_RESERVED1 = ((unsigned short)(0x0000)),
ad7799_MD_FS_470 = ((unsigned short)(0x0001)),
ad7799_MD_FS_242 = ((unsigned short)(0x0002)),
ad7799_MD_FS_123 = ((unsigned short)(0x0003)),
ad7799_MD_FS_62 = ((unsigned short)(0x0004)),
ad7799_MD_FS_50 = ((unsigned short)(0x0005)),
ad7799_MD_FS_39 = ((unsigned short)(0x0006)),
ad7799_MD_FS_33_2 = ((unsigned short)(0x0007)),
ad7799_MD_FS_19_6 = ((unsigned short)(0x0008)),
ad7799_MD_FS_16_70 = ((unsigned short)(0x0009)),
ad7799_MD_FS_16_7 = ((unsigned short)(0x000a)),
ad7799_MD_FS_12_5 = ((unsigned short)(0x000b)),
ad7799_MD_FS_10 = ((unsigned short)(0x000c)),
ad7799_MD_FS_8_33 = ((unsigned short)(0x000d)),
ad7799_MD_FS_6_25 = ((unsigned short)(0x000e)),
ad7799_MD_FS_4_17 = ((unsigned short)(0x000f)),
}ad7799_Mode_FS_TypeDef;
//config寄存器bit13
typedef enum
{
ad7799_BO_ENABLE = ((unsigned short)(0x0001<<13)),//burnout
电流使能
ad7799_BO_DISABLE = ((unsigned short)(0x0000<<13)),//burnout
电流失能
}ad7799_Config_BO_TypeDef;
//config寄存器bit12
typedef enum
{
ad7799_UNIPOLAR = ((unsigned short)(0x0001<<12)),//单极性
ad7799_BIPOLAR = ((unsigned short)(0x0000<<12)),//双极性
}ad7799_Config_UB_TypeDef;
//config寄存器bit10-bit8,放大器增益配置
typedef enum
{
ad7799_G1 = ((unsigned short)(0x0000<<8)),
ad7799_G2 = ((unsigned short)(0x0001<<8)),
ad7799_G4 = ((unsigned short)(0x0002<<8)),
ad7799_G8 = ((unsigned short)(0x0003<<8)),
ad7799_G16 = ((unsigned short)(0x0004<<8)),
ad7799_G32 = ((unsigned short)(0x0005<<8)),
ad7799_G64 = ((unsigned short)(0x0006<<8)),
ad7799_G128 = ((unsigned short)(0x0007<<8)),
}ad7799_Config_GAIN_TypeDef;
//config寄存器bit5,参考电压保护
typedef enum
{
ad7799_Config_REFDET_ENABLE = ((unsigned short)0x0001<<5),
ad7799_Config_REFDET_DISABLE = ((unsigned short)0x0000<<5),
}ad7799_Confif_REFDET_TypeDef;
typedef enum
{
ad7799_BUF_ENABLE = ((unsigned short)0x0001<<4),
ad7799_BUF_DISABLE = ((unsigned short)0x0000<<4),
}ad7799_Config_BUF_TypeDef;
//config寄存器bit2-bit0,通道选择位
typedef enum
{
ad7799_Config_CH1 = ((unsigned short)0x0000),
ad7799_Config_CH2 = ((unsigned short)0x0001),
ad7799_Config_CH3 = ((unsigned short)0x0002),
ad7799_Config_CHADD = ((unsigned short)0x0007),
}ad7799_Config_CH_TypeDef;
void ad7799_Write_Register(ad7799_Register_TypeDef REG, unsigned int Value);
unsigned int ad7799_Read_Register(ad7799_Register_TypeDef REG);
void ad7799_Port_Init(void);
void ad7799_Config(void);
unsigned int ad7799_CC_Read_Data(void);
#endif
//=============
=========================================================================================================================
/**************************************************andon********
******************************************
* 文件
名:ad7799.c
* 作者:hhp
* 时间:
2015-03-11
* 描述:ad7799驱
动文件,包括函数声明,寄存器定义等
*
*
****************************************************andon******
*******************************************/
#include "ad7799.h"
/*********************************************************
*函数名:static unsigned char ad7799_RW_SPI(unsigned char Value)
*函数功能:ad7799SPI读写
*参数: Value:写入值
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-11
*其他:
*
*
***************************************************************/
static unsigned char ad7799_RW_SPI(unsigned char Value);
static void ad7799_Calibration(void);
static unsigned char ad7799_Read_Stat(void);
static unsigned char ad7799_RW_SPI(unsigned char Value)
{
SPI_I2S_SendData(ad7799_SPI, Value);
while (SPI_I2S_GetFlagStatus(ad7799_SPI, SPI_I2S_FLAG_BSY) != RESET);
return (uint8_t)(SPI_I2S_ReceiveData(ad7799_SPI));
}
/*********************************************************
*函数名: void ad7799_Write_Register
(ad7799_Register_TypeDef REG, unsigned int Value)
*函数功能:写ad7799寄存器
*参数: REG:寄存器地址 Value:寄存器值
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-11
*其他:
*
*
***************************************************************/
void ad7799_Write_Register(ad7799_Register_TypeDef REG, unsigned int
Value)
{
unsigned char communication;
GPIO_ResetBits(ad7799_CS_Port, ad7799_CS_Pin);
communication = 0;
communication |= (REG<<3);//写入RS0、RS1、RS2
ad7799_RW_SPI(communication);//将数
值写入通信寄存器
switch(REG)
{
case ad7799_OFFSET : ;
case ad7799_FULL_SCALE :
ad7799_RW_SPI((unsigned char)((Value>>16)&0xff));//写入24bit寄存器的24-16bit
case ad7799_MODE : ;
case ad7799_CONFIG :
ad7799_RW_SPI((unsigned char)((Value>>8)&0xff));//写入16、
24bit寄存器的15-8bit
case ad7799_COM_STAT : ;
case ad7799_IO :
ad7799_RW_SPI((unsigned char)(Value&0xff));//写入8、16、24bit寄存器的7-0bit
break;
default :
ad7799_RW_SPI(0x00);//没有要写的寄存器,则写入0x00,避免下次写出错
break;
}
GPIO_SetBits(ad7799_CS_Port, ad7799_CS_Pin);
}
/*********************************************************
*函数名:unsigned int ad7799_Read_Register(ad7799_Register_TypeDef
REG)
*函数功能:读ad7799寄存器
*参数: REG:寄存器地址
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-11
*其他:
*
*
***************************************************************/
unsigned int ad7799_Read_Register(ad7799_Register_TypeDef REG)
{
unsigned char communication;
unsigned int tmp,rx;
GPIO_ResetBits(ad7799_CS_Port, ad7799_CS_Pin);
rx = 0;
communication = 0;
communication |= (1<<6);// R/W=1,
示读
communication |= (REG<<3);//写入RS0、RS1、RS2
ad7799_RW_SPI(communication);//将数值写入通信寄存器
switch(REG)
{
case ad7799_DATA : ;
case ad7799_OFFSET : ;
case ad7799_FULL_SCALE :
tmp = ad7799_RW_SPI(0x00);//读出24bit寄存器的24-16bit
rx |= (tmp<<16);
case ad7799_MODE : ;
case ad7799_CONFIG :
tmp = ad7799_RW_SPI(0x00);//读出16、24bit寄存器的15-8bit
rx |= (tmp << 8);
case ad7799_COM_STAT : ;
case ad7799_ID : ;
case ad7799_IO :
tmp = ad7799_RW_SPI(0x00);// 读出8、16、24bit寄存器的7-0bit
rx |= tmp;
break;
default :
ad7799_RW_SPI(0x00);//没有要读的寄存器,
break;
}
GPIO_SetBits(ad7799_CS_Port, ad7799_CS_Pin);
return rx;
}
/*********************************************************
*函数名: void ad7799_Port_Init(void)
*函数功能:配置AD7799端口
*参数: 无
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-11
*其他:
*
*
***************************************************************/
void ad7799_Port_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
//添加时钟配置代码
/* Configure SPI pin: nSS --------------------------------------------------*/
GPIO_InitStructure.GPIO_Pin = ad7799_CS_Pin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(ad7799_CS_Port, &GPIO_InitStructure);
GPIO_SetBits(ad7799_CS_Port, ad7799_CS_Pin);
/* Configure SPI pin: SCK MOSI
MISO--------------------------------------------------*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = ad7799_SCLK_Pin;
GPIO_Init(ad7799_SCLK_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = ad7799_DOUT_Pin;
GPIO_Init(ad7799_DOUT_Port, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ad7799_DIN_Pin;
GPIO_Init(ad7799_DIN_Port, &GPIO_InitStructure);
/* SPI configuration ------------------------------------------------------*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(ad7799_SPI, &SPI_InitStructure);
/* Enable SPI */
SPI_Cmd(ad7799_SPI, ENABLE);
}
/*********************************************************
*函数名: void ad7799_Config(void)
*函数功能:配置ad7799芯片
*参数: 无
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-12
*其他:
*
*
***************************************************************/
void ad7799_Config(void)
{
//配置ad7799,单极性,放大倍数为8,禁止buf,禁止bo电流,通
道0
ad7799_Write_Register(ad7799_CONFIG, ad7799_UNIPOLAR|ad7799_G8|ad7799_Config_CH1);
//校准ad7799
ad7799_Calibration();
//设置转换速率,设置连续转换,PSW连接到VDD,
ad7799_Write_Register(ad7799_MODE, ad7799_MD_CC|ad7799_PSW_CLOSE|ad7799_MD_FS_123);
}
/*********************************************************
*函数名: static unsigned
char ad7799_Read_Stat(void)
*函数功能:读ad7799状态寄存器
*参数: 无
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-12
*其他:
*
*
***************************************************************/
static unsigned char ad7799_Read_Stat(void)
{
return (unsigned char)ad7799_Read_Register(ad7799_COM_STAT);
}
/*********************************************************
*函数名: static void ad7799_Calibration(void)
*函数功能:ad7799校准
*参数: 无
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-12
*其他: 校准后需重新设置转换速率
*
*
***************************************************************/
static void ad7799_Calibration(void)
{
//1.零刻度校准
ad7799_Write_Register(ad7799_MODE,
ad7799_MD_IZSC|ad7799_PSW_CLOSE|ad7799_MD_FS_39);
while(GPIO_ReadInputDataBit(ad7799_DOUT_Port, ad7799_DOUT_Pin));//等待RDY引脚go low
//2.满刻度校准
ad7799_Write_Register(ad7799_MODE,
ad7799_MD_IFSC|ad7799_PSW_CLOSE|ad7799_MD_FS_39);
while(GPIO_ReadInputDataBit(ad7799_DOUT_Port, ad7799_DOUT_Pin));//等待RDY引脚go low
//while((ad7799_Read_Stat()&ad7799_StatRDY) == 0);//等待RDY位
变高
}
/*********************************************************
*函数名: unsigned int ad7799_CC_Read_Data(void)
*函数功能:连续转换模式下读数据 Continuous-Conversion Mode
*参数: 无
*返回值: 无
*作者: 霍宏鹏
*时间: 2015-03-12
*其他:
*
*
***************************************************************/
unsigned int ad7799_CC_Read_Data(void)
{
unsigned int timeout;
timeout = 0;
//检测RDY位变低
while((ad7799_Read_Stat()&ad7799_StatRDY) != 0)
{
timeout++;
if(timeout > 100000)
{
break;
}
}
if((ad7799_Read_Stat()&ad7799_StatERR) == 0)
{
return ad7799_Read_Register(ad7799_DATA);//没有出错就读出数据
}
else
{
ad7799_Config();//出错重新配置
ad7799
return (0xffff);
}
}