工程師必備!AD7799 驅(qū)動(dòng)程序
24bit高精度ADC,支持雙極性信號(hào),使用時(shí)如果需要使用內(nèi)部增益,不能將VIN-接GND。
/************************************************************************************************************* ?*?文件名 : AD7799.c ?*?功能 : AD7799驅(qū)動(dòng) ?*?作者 : cp1300@139.com ?*?創(chuàng)建時(shí)間 : 2017-04-21 ?*?最后修改時(shí)間 : 2018-06-06 ?*?詳細(xì) : AD7799驅(qū)動(dòng) AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果 依賴系統(tǒng)ms延時(shí)函數(shù) 如果需要使用內(nèi)部增益>2,那么VIN-不能接GND,必須接基準(zhǔn)源,并且輸入的差分信號(hào)需要在指定范圍內(nèi)。 *************************************************************************************************************/ #include?"SYSTEM.H" #include?"GPIO_INIT.H" #include?"AD7799.H" //調(diào)試開關(guān) #define?AD7799_DBUG 1 #if?AD7799_DBUG #include?"system.h" #define?ad7799_debug(format,...) uart_printf(format,##__VA_ARGS__) #else #define?ad7799_debug(format,...) / / #endif //AD7799_DBUG static?const?u8?AD7799_REG_LEN[8]?=?{1,2,2,3,1,1,3,3}; //AD7799寄存器長(zhǎng)度,單位字節(jié) /************************************************************************************************************************* *?函數(shù) : bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void)) *?功能 : AD7799初始化 *?參數(shù) : pHandle:句柄;SetCLK:CLK輸出控制回調(diào);SetCS:CS輸出回調(diào);SetOutData:輸出輸出DOUT回調(diào);GetInData:數(shù)據(jù)輸入DIN回調(diào) *?返回 : TRUE:成功;FALSE:失敗 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2017-04-21 *?說明 :? 初始化檢測(cè)ID,ID不對(duì)會(huì)返回失敗 *************************************************************************************************************************/ bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void)) { u8?retry; u8?id; u8?temp; if(pHandle?==?NULL?||?SetCLK?==?NULL?||?SetCS?==?NULL?||?SetOutData==?NULL?||?GetInData?==?NULL) { DEBUG("AD7799?初始化句柄或接口無效!"); SYS_DelayMS(100); } //初始化句柄 pHandle->SetCLK?=?SetCLK; //CLK輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) pHandle->SetCS?=?SetCS; //CS輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) pHandle->SetOutData?=?SetOutData; //DOUT輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) pHandle->GetInData?=?GetInData; //DIN輸入回調(diào)(返回1:高電平;0:低電平) //開始初始化芯片 pHandle->SetCS(1); //CS默認(rèn)高電平 pHandle->SetCLK(1); //CLK默認(rèn)高電平 pHandle->SetOutData(0); //默認(rèn)輸出低電平 SYS_DelayMS(10); //延時(shí)10ms等待供電穩(wěn)定 AD7799_SoftwareReset(pHandle); //系統(tǒng)軟復(fù)位 SYS_DelayMS(20); for(retry?=?0;retry?<?8;retry?++) //循環(huán)讀取ID { id?=?AD7799_ReadReg(pHandle,?AD7799_REG_ID); if((id&0x0F)==0X9) { break; } SYS_DelayMS(100); } if((id&0x0F)!=0X9) { ad7799_debug("AD7799初始化失敗,未知的ID(%02X)rn",id); return?FALSE; } AD7799_SetConfig(pHandle,?FALSE,?TRUE,?AD7799_GAIN_1,?TRUE,?AD7799_CH_AIN1); SYS_DelayMS(10); temp?=?AD7799_ReadReg(pHandle,?AD7799_REG_STATUS); //讀取狀態(tài) if(temp?&?BIT5) { ad7799_debug("AD7799參考故障,狀態(tài)(%02X)rn",temp); } ad7799_debug("AD7799初始化成功,ID(%02X)rn",id); return?TRUE; } /************************************************************************************************************************* *?函數(shù) : u8?AD7799_ReadWriteByte(AD7799_HANDLE?*pHandle,?u8?data) *?功能 : AD7799讀寫一字節(jié) *?參數(shù) : pHandle:句柄;data:需要寫入的數(shù)據(jù) *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 不帶片選,最底層寫入1B *************************************************************************************************************************/ u8?AD7799_ReadWriteByte(AD7799_HANDLE?*pHandle,?u8?data) { u8?i; for(i?=?0;i?<?8;i?++) { pHandle->SetCLK(0); //CLK=0 if(data?&?0x80) { pHandle->SetOutData(1); //DOUT=1 } else { pHandle->SetOutData(0); //DOUT=0 } nop;nop;nop;nop;nop;nop; pHandle->SetCLK(1); //CLK=1 data?<GetInData()) //DIN { data?|=?1; } nop;nop;nop;nop;nop;nop; } return?data; } /************************************************************************************************************************* *?函數(shù) : u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr) *?功能 : AD7799讀取一個(gè)寄存器 *?參數(shù) : pHandle:句柄;RegAddr:寄存器地址 *?返回 : 讀取的數(shù)據(jù) *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 會(huì)使能片選,會(huì)自動(dòng)判斷寄存器長(zhǎng)度,并進(jìn)行讀取 *************************************************************************************************************************/ u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr) { u8?i; u32?data?=?0; if(RegAddr?>?7)? return?0; //寄存器地址0-7 pHandle->SetCS(0); //片選拉低,準(zhǔn)備讀寫數(shù)據(jù) nop;nop; data?|=?BIT6; //R/W位為1,讀取數(shù)據(jù) data?|=?RegAddr?<<?3; //寄存器地址 AD7799_ReadWriteByte(pHandle,?data); //寫入命令,讀取指定寄存器 data?=?0; for(i?=?0;i<AD7799_REG_LEN[RegAddr];i?++) { data?<SetCS(1); //片選恢復(fù) pHandle->SetOutData(0); //DOUT=0?默認(rèn)輸出低電平 return?data; } /************************************************************************************************************************* *?函數(shù) : void?AD7799_WriteReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr,?u32?RegData) *?功能 : AD7799寫一個(gè)寄存器 *?參數(shù) : pHandle:句柄;RegAddr:寄存器地址;RegData:需要寫入的值 *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 會(huì)使能片選,會(huì)自動(dòng)判斷寄存器長(zhǎng)度,并進(jìn)行寫入 *************************************************************************************************************************/ void?AD7799_WriteReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr,?u32?RegData) { u8?i; u8?data?=?0; if(RegAddr?>?7)? return; //寄存器地址0-7 pHandle->SetCS(0); //片選拉低,準(zhǔn)備讀寫數(shù)據(jù) nop;nop; data?|=?RegAddr?<<?3; //寄存器地址 AD7799_ReadWriteByte(pHandle,?data); //寫入命令,寫指定寄存器 for(i?=?0;i>((AD7799_REG_LEN[RegAddr]-1-i)*8)); //寫入數(shù)據(jù) } pHandle->SetCS(1); //片選恢復(fù) pHandle->SetOutData(0); //DOUT=0?默認(rèn)輸出低電平 } /************************************************************************************************************************* *?函數(shù) : void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed) *?功能 : AD7799設(shè)置采集模式 *?參數(shù) : pHandle:句柄;mode:模式,見AD7799_MODE_TYPE;speed:采樣速度,見AD7799_SPEED_TYPE *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 設(shè)置采集模式 *************************************************************************************************************************/ void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed) { u16?data?=?0; data?|=?mode?<<?13; //模式設(shè)置 data?|=?speed?&?0xf; //轉(zhuǎn)換速度設(shè)置 AD7799_WriteReg(pHandle,?AD7799_REG_MODE,?data); } /************************************************************************************************************************* *?函數(shù) : void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle) *?功能 : AD7799軟件復(fù)位 *?參數(shù) : pHandle:句柄 *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 連續(xù)發(fā)送32個(gè)1到AD7799會(huì)進(jìn)行復(fù)位,所有寄存器復(fù)位到原始值 *************************************************************************************************************************/ void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle) { pHandle->SetCS(0); //片選拉低,準(zhǔn)備讀寫數(shù)據(jù) nop;nop; AD7799_ReadWriteByte(pHandle,?0XFF); //發(fā)送32個(gè)1 AD7799_ReadWriteByte(pHandle,?0XFF); //發(fā)送32個(gè)1 AD7799_ReadWriteByte(pHandle,?0XFF); //發(fā)送32個(gè)1 AD7799_ReadWriteByte(pHandle,?0XFF); //發(fā)送32個(gè)1 pHandle->SetCS(1); //片選恢復(fù) pHandle->SetOutData(0); //DOUT=0?默認(rèn)輸出低電平 } /************************************************************************************************************************* *?函數(shù) : void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable) *?功能 : AD7799快速讀取模式開關(guān) *?參數(shù) : pHandle:句柄;Enable:TRUE:開啟快速讀取模式;FALSE:關(guān)閉快速讀取模式 *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 開啟快速讀取模式后,可直接快速讀取采集的數(shù)據(jù),無效發(fā)送讀取命令 使能連續(xù)可讀模式,必須在通信寄存器中寫入01011100;當(dāng)RDY變?yōu)榈蜁r(shí),向通信寄存器中寫入01011000,退出連續(xù)可讀模式。 當(dāng)在連續(xù)可讀模式下,ADC檢測(cè)到DIN腳的有效活動(dòng),也會(huì)退出連續(xù)可讀模式。另外,如果在DIN管腳上連續(xù)輸入32位的高電平,AD被復(fù)位。 因此,當(dāng)在連續(xù)讀模式下DIN腳應(yīng)被置為低電平直到一個(gè)新的命令寫入設(shè)備。 警告:開啟連續(xù)讀取后必須在RDY變?yōu)榈碗娖胶蟀l(fā)送此命令(不能發(fā)送別的命令) *************************************************************************************************************************/ void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable) { pHandle->SetCS(0); //片選拉低,準(zhǔn)備讀寫數(shù)據(jù) nop;nop; if(Enable) //使能連續(xù)讀取模式 { AD7799_ReadWriteByte(pHandle,?0x5C); //開啟連續(xù)讀取模式 AD7799_ReadWriteByte(pHandle,?0); AD7799_ReadWriteByte(pHandle,?0); } else { AD7799_ReadWriteByte(pHandle,?0x58); //關(guān)閉連續(xù)讀取模式 AD7799_ReadWriteByte(pHandle,?0XFF); AD7799_ReadWriteByte(pHandle,?0XFF); } pHandle->SetCS(1); //片選恢復(fù) pHandle->SetOutData(0); //DOUT=0?默認(rèn)輸出低電平 } /************************************************************************************************************************* *?函數(shù) : u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS) *?功能 : AD7799快速讀取采集結(jié)果 *?參數(shù) : pHandle:句柄;isCS:TRUE:需要控制片選;FALSE:無需控制片選 *?返回 : 24bit的采集結(jié)果 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 必須先開啟快速讀取模式,開啟后可以進(jìn)行快速讀取 *************************************************************************************************************************/ u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS) { u32?data?=?0; u8?i; if(isCS) //需要使能片選 { pHandle->SetCS(0); //片選拉低,準(zhǔn)備讀寫數(shù)據(jù) nop;nop; } for(i?=?0;i?<?3;i?++) { data?<SetCS(1); //片選恢復(fù) pHandle->SetOutData(0); //DOUT=0?默認(rèn)輸出低電平 } return?data; } /************************************************************************************************************************* *?函數(shù) : void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch) *?功能 : AD7799配置 *?參數(shù) : pHandle:句柄;isEnBurnout:是否開啟電流源;isUnipolar:是否使能單極性采集;Gain:增益設(shè)置,見AD7799_GAIN_TYPE;isEnBuff:是否開啟緩沖器 ch:采集通道選擇,見AD7799_CH_TYPE *?返回 : 無 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-21 *?最后修改 :? 2018-06-06 *?說明 :? 用于設(shè)置AD7799,默認(rèn)已經(jīng)開啟了參考保護(hù) *************************************************************************************************************************/ void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch) { u16?data?=?0; if(isEnBurnout)? data|=BIT13; //使能電流源 if(isUnipolar)? data|=BIT12; //使能單極性采集 data?|=?(Gain&0x07)?<<?8; //增益設(shè)置 data?|=?BIT5; //參考保護(hù)開啟 if(isEnBuff) data?|=?BIT4; //使能buff,緩沖器 data?|=?ch&0x7; //通道選擇 AD7799_WriteReg(pHandle,?AD7799_REG_CONFIG,?data); //寫入配置寄存器 } /************************************************************************************************************************* *?函數(shù) : bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed) *?功能 : AD7799校準(zhǔn)模式 *?參數(shù) : pHandle:句柄;speed:轉(zhuǎn)換速度 *?返回 : FALSE:校準(zhǔn)失敗;TRUE:校準(zhǔn)成功 *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-27 *?最后修改 :? 2018-06-06 *?說明 :? 校準(zhǔn)前需要先設(shè)置通道,使用的是內(nèi)部校準(zhǔn)模式 片內(nèi)滿度校準(zhǔn)不能在增益為128的情況下進(jìn)行。為盡量減少滿度誤差,每次的通道的增益改變都需要進(jìn)行滿度校準(zhǔn)。 *************************************************************************************************************************/ bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed) { u8?delay?=?0; AD7799_SetMode(pHandle,?AD7799_MODE_IDLE,?speed); //先進(jìn)入空閑模式 AD7799_SetMode(pHandle,?AD7799_MODE_ZEROCALI,?speed); //內(nèi)部零刻度校準(zhǔn)模式 pHandle->SetCS(0); if(pHandle->GetInData()==0)? { ad7799_debug("校準(zhǔn)失敗,提前有低電平!rn"); pHandle->SetCS(1); return?FALSE; } delay?=?0; while(pHandle->GetInData()==1)? { SYS_DelayMS(10); delay?++; if(delay?>?100)? { ad7799_debug("校準(zhǔn)失敗,等待校準(zhǔn)結(jié)束超時(shí)!rn"); pHandle->SetCS(1); return?FALSE; } } pHandle->SetCS(1); AD7799_SetMode(pHandle,?AD7799_MODE_FULLCALI,?speed); //內(nèi)部滿刻度校準(zhǔn)模式 pHandle->SetCS(0); if(pHandle->GetInData()==0)? { ad7799_debug("校準(zhǔn)失敗1,提前有低電平!rn"); pHandle->SetCS(1); return?FALSE; } delay?=?0; while(pHandle->GetInData()==1)? { SYS_DelayMS(10); delay?++; if(delay?>?100)? { ad7799_debug("校準(zhǔn)失敗1,等待校準(zhǔn)結(jié)束超時(shí)!rn"); pHandle->SetCS(1); return?FALSE; } } pHandle->SetCS(1); return?TRUE; } /************************************************************************************************************************* *?函數(shù) : u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt) *?功能 : AD7799采集數(shù)據(jù) *?參數(shù) : pHandle:句柄;ch:通道0-2;CollCnt:采集次數(shù)(用于濾波) *?返回 : 采集的結(jié)果HEX *?依賴 : 底層宏定義 *?作者 : cp1300@139.com *?時(shí)間 : 2017-04-27 *?最后修改 :? 2018-06-07 *?說明 :? *************************************************************************************************************************/ u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt) { u32?data; u32?temp; u32?ADC_Data; u8?i; if(ch?>?2)?return?0; if(CollCnt?<?1)?CollCnt?=?1; //采集 AD7799_SetConfig(pHandle,?pHandle->Config[ch].isEnBurnout,?pHandle->Config[ch].isUnipolar,?pHandle->Config[ch].Gain,?pHandle->Config[ch].isEnBuff,?(AD7799_CH_TYPE)ch); //切換通道 AD7799_SetMode(pHandle,?AD7799_MODE_IDLE,?pHandle->Config[ch].speed); //空閑模式 //uart_printf("AD7799_REG_CONFIG:0x%Xrn",AD7799_ReadReg(AD7799_REG_CONFIG)); AD7799_SetMode(pHandle,?AD7799_MODE_CONTINUOUS,?pHandle->Config[ch].speed); //連續(xù)采集模式開啟 //uart_printf("mode2:0x%Xrn",AD7799_ReadReg(AD7799_REG_MODE)); //uart_printf("AD7799_REG_STATUS2:%Xrn",AD7799_ReadReg(AD7799_REG_STATUS)); AD7799_SetCREAD(pHandle,?TRUE); //連續(xù)讀取模式使能 pHandle->SetCS(0); data?=?0; for(i?=?0;i?<?CollCnt;) //采集濾波 { if(pHandle->GetInData()==0) { temp?=?AD7799_CReadData(pHandle,?FALSE); data?+=?temp; i++; } SYS_DelayMS(5); } //退出連續(xù)讀取模式 for(i?=?0;i?<?10;i++) { if(pHandle->GetInData()==0) { AD7799_SetCREAD(pHandle,?FALSE); //連續(xù)讀取模式關(guān)閉 break; } SYS_DelayMS(10); } pHandle->SetCS(1); data?/=?CollCnt; //取得平均值 return?data; }
/************************************************************************************************************* ?*?文件名 : AD7799.h ?*?功能 : AD7799驅(qū)動(dòng) ?*?作者 : cp1300@139.com ?*?創(chuàng)建時(shí)間 : 2017-04-21 ?*?最后修改時(shí)間 : 2018-06-06 ?*?詳細(xì) : AD7799驅(qū)動(dòng) AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果 依賴系統(tǒng)ms延時(shí)函數(shù) *************************************************************************************************************/ #ifndef?__AD7799_H__ #define?__AD7799_H__ #include?"system.h" //AD7799寄存器定義 typedef?enum { AD7799_REG_STATUS = 0, //狀態(tài)寄存器,8位 AD7799_REG_MODE = 1, //模式寄存器,16位 AD7799_REG_CONFIG = 2, //配置寄存器,16位 AD7799_REG_DATA = 3, //數(shù)據(jù)寄存器,24位 AD7799_REG_ID = 4, //ID寄存器,8位 AD7799_REG_IO = 5, //IO寄存器,8位 AD7799_REG_ZERO = 6, //零刻度校準(zhǔn)寄存器,24位 AD7799_REG_FULL = 7, //滿刻度校準(zhǔn)寄存器,24位 }AD7799_REG_TYPE; //工作模式選擇 typedef?enum { AD7799_MODE_CONTINUOUS = 0, //連續(xù)轉(zhuǎn)換模式 AD7799_MODE_SINGLE = 1, //單次轉(zhuǎn)換模式 AD7799_MODE_IDLE = 2, //空閑模式 AD7799_MODE_POWERDOWN = 3, //掉電模式 AD7799_MODE_ZEROCALI = 4, //內(nèi)部零刻度校準(zhǔn)模式 AD7799_MODE_FULLCALI = 5, //內(nèi)部滿刻度校準(zhǔn)模式 AD7799_MODE_SYSZEROCALI = 6, //系統(tǒng)零刻度校準(zhǔn)模式 AD7799_MODE_SYSFULLCALI = 7, //系統(tǒng)滿刻度校準(zhǔn)模式 }AD7799_MODE_TYPE; //轉(zhuǎn)換速度設(shè)置 typedef?enum { AD7799_SPEED_500HZ = 1, AD7799_SPEED_250HZ = 2, AD7799_SPEED_125HZ = 3, AD7799_SPEED_62HZ = 4, AD7799_SPEED_50HZ = 5, AD7799_SPEED_39HZ = 6, AD7799_SPEED_33HZ = 7, AD7799_SPEED_19HZ = 8, AD7799_SPEED_16_1HZ = 9,? //16.7HZ?80db?50hz濾波 AD7799_SPEED_16_2HZ = 10,?//16.7HZ?65b AD7799_SPEED_12HZ = 11, AD7799_SPEED_10HZ = 12, AD7799_SPEED_8HZ = 13, AD7799_SPEED_6HZ = 14, AD7799_SPEED_4HZ = 15, }AD7799_SPEED_TYPE; //增益選擇 typedef?enum? { AD7799_GAIN_1 = 0, AD7799_GAIN_2 = 1, AD7799_GAIN_4 = 2, AD7799_GAIN_8 = 3, AD7799_GAIN_16 = 4, AD7799_GAIN_32 = 5, AD7799_GAIN_64 = 6, AD7799_GAIN_128 = 7, }AD7799_GAIN_TYPE; //通道選擇 typedef?enum? { AD7799_CH_AIN1 = 0, AD7799_CH_AIN2 = 1, AD7799_CH_AIN3 = 2, AD7799_CH_AVDD = 7, //電源監(jiān)控 }AD7799_CH_TYPE; //AD7799通道配置 typedef?struct { AD7799_GAIN_TYPE?Gain; //增益 AD7799_SPEED_TYPE?speed; //轉(zhuǎn)換速度 bool?isEnBurnout; //是否開啟電流源 bool?isUnipolar; //是否使能單極性采集 bool?isEnBuff; //輸出緩沖 }AD7799_CH_CONFIG; //AD7799句柄 typedef?struct { void?(*SetCLK)(u8?Level); //CLK輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) void?(*SetCS)(u8?Level); //CS輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) void?(*SetOutData)(u8?Level); //DOUT輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平) u8?(*GetInData)(void); //DIN輸入回調(diào)(返回1:高電平;0:低電平) AD7799_CH_CONFIG?Config[3]; //存放3個(gè)通道的配置信息 }AD7799_HANDLE; //相關(guān)函數(shù) bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void)); //AD7799初始化 u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr); //讀取指定寄存器 void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed); //設(shè)置模式 void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle); //軟復(fù)位 void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable); //設(shè)置連續(xù)讀取模式開關(guān) u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS); //快速讀取模式下讀取24bit數(shù)據(jù) void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch); //AD7799配置 bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed); //校準(zhǔn)模式 u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt); //AD7799采集數(shù)據(jù) #endif?//__AD7799_H__
測(cè)試
//底層接口
///////////////////////////////////////////////////////////////////////////////////////////// //AD7799支持 __inline?void?AD7799_DIO_OUT(u8?level) {PBout(6)=level;} //接芯片DIN __inline?u8?AD7799_DIO_IN(void) {return?PBin(7);} //接芯片DOUT __inline?void?AD7799_CS(u8?level) {PBout(5)=level;} //片選 __inline?void?AD7799_CLK(u8?level) {PBout(4)=level;} //時(shí)鐘 //AD7799硬件IO初始化 __inline?void?AD7799_IO_INIT(void) { DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOB時(shí)鐘*/ GPIOx_Init(GPIOB,BIT4|BIT5|BIT6,?OUT_PP,?SPEED_10M); GPIOx_Init(GPIOB,BIT7,?IN_IPU,?IN_IN); }
//初始化
AD7799_HANDLE?AD7799_Handle; //ad7799句柄
AD7799_IO_INIT(); //AD7799?IO硬件初始化
//切換到通道1,校準(zhǔn)通道1 AD7799_SetConfig(&g_SysFlag.AD7799_Handle,?FALSE,?TRUE,?AD7799_GAIN_2,?FALSE,?AD7799_CH_AIN1); //AD7799配置 g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isEnBurnout?=?FALSE; //電流源關(guān)閉 g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isUnipolar?=?TRUE; //單極性信號(hào)使能 g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].Gain??=AD7799_GAIN_2; //增益2 g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isEnBuff?=?FALSE; //輸出緩沖使能 g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].speed?=?AD7799_SPEED_50HZ; //轉(zhuǎn)換速度 if(AD7799_Calibration(&g_SysFlag.AD7799_Handle,?AD7799_SPEED_50HZ)==FALSE) { uart_printf("AD7799校準(zhǔn)失??!rn"); }
//采集
temp?=?AD7799_Coll(&g_SysFlag.AD7799_Handle,?AD7799_CH_AIN1,?3); ftemp?=?temp; ftemp?/=?0XFFFFFF; //計(jì)算比例 ftemp?/=?2; //放大倍數(shù)為2 ftemp*=2500;