为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ad7799驱动程序stm32

2018-04-02 18页 doc 46KB 189阅读

用户头像

is_212655

暂无简介

举报
ad7799驱动程序stm32ad7799驱动程序stm32 /**************************************************andon******** ****************************************** * 文件 名:ad7799.h * 作者:hhp * 时间: 2015-03-11 * 描述:ad7799驱 动文件,包括函数声明,寄存器定义等 * * ****************************************************andon...
ad7799驱动程序stm32
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); } }
/
本文档为【ad7799驱动程序stm32】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索