📄 cs5463.c
字号:
/*********************************************
Copyright(C) 2007,Huaruijie Co.Ltd.
文件名: cs5463.c
版权:华瑞杰公司 2007
作者: 开发部 zhw
描述: 提供三片CS5463、一片CS5460A 电压数据采集和标定接口
文件记录:
1. 2007-01-24 zhw <Crealte> 在cs5460.c的基础上建立此文件
*/
#define _CS5463_GLOBE_
#define _HRJ803_GLOBE_
//#define _NVRAM_GLOBE_
#include "cs5463.h"
//#include "includes.h"
#include "HRJ803.h"
#include "Lpc2000Reg.h"
#include "basetype.h"
#include "DrvCfg.h"
#include "UartDrv.h"
extern void InitAdcCommand(void) ;
extern const SSysParam *p_gcSysParam ; //use for compute data item offset address
#define WriteSTATUS(dw) WriteAdc24Bits(STATUSR,dw)
#define WrietMaskReg(dw) WriteAdc24Bits(MASKR,dw)
#define SendAdcFinishiSignal() g_iAdcUpdateFlag = 1 //发送数据就绪信号
#define SendWaveFinishiSignal() g_iAdcWaveUpdateFlag =1 //数据就绪信号
#define SendPulseUpdateSignal() g_iAdcPulseUpdateFlag = 1
const BYTE byStartWavCommand[4]= {0x00,0x00,0x10,0x74};//进行波形的采集,写屏蔽寄存器
//定义成静态变量
//DWORD dwReadAdcCommand[26]; //AD数据读取(写)命令 /*mod,lyq,2007-03-07 修改为 const BYTE g_szReadAdcCommand[26][4]={...};*/
//以下常量赋值 请参见 InitAdcCommand函数
const BYTE dwReadAdcCommand[27][4] = {
{0xfe,0xfe,0xfe,0x36}, //0
{0xfe,0xfe,0xfe,0x14}, //1
{0xfe,0xfe,0xfe,0x28},//2
{0xfe,0xfe,0xfe,0x32},//3
{0xfe,0xfe,0xfe,0x18},//4
{0xfe,0xfe,0xfe,0x16},//5
{0xfe,0xfe,0xfe,0x26},//6
{0xfe,0xfe,0xfe,0x1a},//7
{0xfe,0xfe,0xfe,0x36},//8
{0xfe,0xfe,0xfe,0x14},//9
{0xfe,0xfe,0xfe,0x28},//10
{0xfe,0xfe,0xfe,0x32},//11
{0xfe,0xfe,0xfe,0x18},//12
{0xfe,0xfe,0xfe,0x16},//13
{0xfe,0xfe,0xfe,0x36},//14
{0xfe,0xfe,0xfe,0x14},//15
{0xfe,0xfe,0xfe,0x28},//16
{0xfe,0xfe,0xfe,0x32},//17
{0xfe,0xfe,0xfe,0x18},//18
{0xfe,0xfe,0xfe,0x16},//19
{0xfe,0xfe,0xfe,0x18},//20
{0xfe,0xfe,0xfe,0x16},//21
{0xfe,0xfe,0xfe,0x1e},//22
{0xff,0xff,0xff,0x5e},//23
{0xff,0xff,0xff,0x5e},//24
{0x00,0x00,0x80,0x74}//25
};
const BYTE dwReadAdcWaveCommand[10][4] = {
{0xfe,0xfe,0xfe,0x10}, //0
{0xfe,0xfe,0xfe,0x0e}, //1
{0xfe,0xfe,0xfe,0x10},//2
{0xfe,0xfe,0xfe,0x0e},//3
{0xfe,0xfe,0xfe,0x10},//4
{0xfe,0xfe,0xfe,0x0e},//5
{0xff,0xff,0xff,0x5e},//6
{0xfe,0xfe,0xfe,0x1a},//7
{0x00,0x00,0x80,0x74},//8
{0x00,0x00,0x00,0x00},//9
};
//以下常量赋值 请参见 InitAdcSelCommand 函数
const DWORD dwregSet_RMS[27] = {
0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000,0x7000, //0 -7
0x6800,0x6800,0x6800,0x6800,0x6800,0x6800,//8-13
0x5800,0x5800,0x5800,0x5800,0x5800,0x5800,//14-19
0x3800,0x3800,0x3800,0x3800,//20-23
0x7000,0x7000,//24-25
0x7800,//26
};
const DWORD dwregClr_RMS[27] =
{0x800, 0x800, 0x800, 0x800, 0x800, 0x800,0x800,0x800, //0 -7
0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,//8-13
0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,//14-19
0x4000,0x4000,0x4000,0x4000,//20-23
0x800, 0x800,//24-25
0x0,//26
};
const DWORD dwregSet_Wav[10] =
{0x7000,0x7000, //0-1
0x6800,0x6800,//2-3
0x5800,0x5800,//4-5
0x7000,0x7000,0x7000,//6-8 mod zhw 2007-4-13 old "0x800,0x800"
0x7800,//9
};
const DWORD dwregClr_Wav[10] =
{0x800,0x800, //0-1
0x1000,0x1000,//2-3
0x2000,0x2000,//4-5
0x800,0x800,0x800,//6-8 mod zhw 2007-4-13 old "0x800,0x800"
0x0//9
};
static BYTE byAdcCommandIndex =0;
DWORD *pg_sRealCode;
static BYTE byAdcSampleType =0 ; //AD中断的标志,有效值功率等的采样采样或 波形采样
static DWORD dwWaveSampleCount =0 ; //三片AD波形采样的总次数,
static BYTE PAsign;
static BYTE QAsign;
static BYTE PBsign;
static BYTE QBsign;
static BYTE PCsign;
static BYTE QCsign;
void Calibration(BYTE byCmd, BYTE byReg, DWORD *pdwResult, INT32 iIndex);
static void SelectAdc(INT32 iIndex)
{
switch(iIndex)
{
case 0:
pgsFPort0->regOutClr = ADCSA;
break;
case 1:
pgsFPort0->regOutClr = ADCSB;
break;
case 2:
pgsFPort0->regOutClr = ADCSC;
break;
case 3:
pgsFPort0->regOutClr = ADCSO;
break;
default:
break;
}
}
static void UnSelAdc(INT32 iIndex)
{
switch(iIndex)
{
case 0:
pgsFPort0->regOutSet = ADCSA;
break;
case 1:
pgsFPort0->regOutSet = ADCSB;
break;
case 2:
pgsFPort0->regOutSet = ADCSC;
break;
case 3:
pgsFPort0->regOutSet = ADCSO;
break;
default:
break;
}
}
static void WriteAdcCommand(BYTE byCommand)
{
BYTE Dummy;
while ( !(pgsSsp1->regStatus & 0x02) );
pgsSsp1->regData = byCommand;
/* Wait until the Busy bit is cleared */
while ( !(pgsSsp1->regStatus & 0x04) );
Dummy = pgsSsp1->regData; /* Flush the RxFIFO */
}
static void WriteAdcReg(BYTE byAddr, BYTE *pBuf, BYTE byNum)
{
BYTE Dummy;
pBuf += byNum-1; //调整为高位字节先发送
Dummy = (byAddr <<1) | 0x40;
while ( !(pgsSsp1->regStatus & 0x02) );
pgsSsp1->regData = (Dummy & 0x7e); //write communication register, write command
while ( !(pgsSsp1->regStatus & 0x04) );
Dummy = pgsSsp1->regData; /* Flush the RxFIFO */
while ( byNum >0 )
{
/* as long as TNF bit is set, TxFIFO is not full, I can write */
while ( !(pgsSsp1->regStatus & 0x02) );
pgsSsp1->regData = *pBuf;
/* Wait until the Busy bit is cleared */
while ( !(pgsSsp1->regStatus & 0x04) );
Dummy = pgsSsp1->regData; /* Flush the RxFIFO */
byNum --;
pBuf --;
}//while
return;
}
static void WriteAdc24Bits(BYTE byAddr, DWORD dw)
{
WriteAdcReg(byAddr, (BYTE*)&dw,3);
}
static void ReadAdcReg(BYTE byAddr, BYTE *pBuf, BYTE byNum)
{
BYTE Dummy;
pBuf += byNum-1; //调整为高位字节先发送
Dummy = (byAddr << 1) ;
while ( !( pgsSsp1->regStatus & 0x02) );
pgsSsp1->regData = Dummy & 0x3e; //write communication register, read command
while ( !(pgsSsp1->regStatus & 0x04) );
Dummy = pgsSsp1->regData;
while(byNum>0)
{
/* as long as TNF bit is set, TxFIFO is not full, We can write */
while ( !( pgsSsp1->regStatus & 0x02) );
pgsSsp1->regData = 0xfe;//SYNC0; //must be NOP in cs5460a
/* Wait until the Busy bit is cleared */
while ( !(pgsSsp1->regStatus & 0x04) );
*pBuf = pgsSsp1->regData; /* Flush the RxFIFO */
byNum --;
pBuf --;
}
}
static void ReadAdc24Bits(BYTE byAddr, DWORD *pdw)
{
ReadAdcReg(byAddr, (BYTE*)pdw,3);
*pdw &= 0x00ffffff;
}
static DWORD ReadRSTATUS(void)//读取状态寄存器
{
DWORD dwStatus;
ReadAdcReg(STATUSR,(BYTE*)&dwStatus, 3);
dwStatus &= 0x00ffffff;
return(dwStatus);
}
void InitSSp1(void)
{
DWORD portConfig;
BYTE i, Dummy;
/* Configure PIN connect block */
pgsSsp1->regCtrl1 = 0x00; /* SSP master (off) in normal mode */
/*set SSEL to GPIO pin that you will have the totoal
freedom to set/reset the SPI chip-select pin */
/* Set data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0,
and SCR is 4 */
pgsSsp1->regCtrl0 = 0x0407;
/* SSPCPSR clock prescale register, master mode, minimum divisor
is 0x02*/
pgsSsp1->regClkPrescale = 0x02; //0x02
/* Device select as master, SSP Enabled, normal operational mode */
pgsSsp1->regCtrl1 = 0x02;
for ( i = 0; i < 8; i++ )Dummy = pgsSsp1-> regData; /* clear the RxFIFO */
return;
}
void InitSSp1_1(void)
{
DWORD portConfig;
BYTE i, Dummy;
/* Configure PIN connect block */
pgsSsp1->regCtrl1 = 0x00; /* SSP master (off) in normal mode */
/*set SSEL to GPIO pin that you will have the totoal
freedom to set/reset the SPI chip-select pin */
/* Set data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0,
and SCR is 4 */
pgsSsp1->regCtrl0 = 0x0407;
/* SSPCPSR clock prescale register, master mode, minimum divisor
is 0x02*/
pgsSsp1->regClkPrescale = 0x06; //0x06
/* Device select as master, SSP Enabled, normal operational mode */
pgsSsp1->regCtrl1 = 0x02;
for ( i = 0; i < 8; i++ )Dummy = pgsSsp1-> regData; /* clear the RxFIFO */
return;
}
//extern void ADCPulseIrq(void);
/*脉冲计数中断处理程序,在快速中断中调用*/
void ADCPulseFiqSrv(void)
{
DWORD dwIntFlag;
DWORD dwDir;
dwIntFlag = pgsPort0Int ->regFallingStatus;
dwDir = pgsFPort0 ->regPinVal;
//**************** A **********
if(dwIntFlag & P23) //有功电能
{
if(dwDir & P21)
{
g_sEneryCnt.dwEPap++; //A相正向有功电能计数值++
PAsign = 1;
}
else
{
g_sEneryCnt.dwEPan++;//A相反向有功电能计数值++
PAsign = 0;
}
pgsPort0Int->regIntClr = P23;
}
if(dwIntFlag & P22)//无功电能
{
if(dwDir & P21)
{
g_sEneryCnt.dwEQap++; //A相正向无功电能计数值++
QAsign = 1;
}
else
{
g_sEneryCnt.dwEQan++;//A相反向无功电能计数值++
QAsign = 0;
}
pgsPort0Int->regIntClr = P22;
//mod,lyq,2007-03-07
if(PAsign)
{
if(QAsign) g_sEneryCnt.dwEQ1++;
else g_sEneryCnt.dwEQ4++;
}
else
{
if(QAsign) g_sEneryCnt.dwEQ2++;
else g_sEneryCnt.dwEQ3++;
}
}
//**************** B **********
if(dwIntFlag & P26) //有功电能
{
if(dwDir & P24)
{
g_sEneryCnt.dwEPbp++; //B相正向有功电能计数值++
PBsign = 1;
}
else
{
g_sEneryCnt.dwEPbn++;//B相反向有功电能计数值++
PBsign = 0;
}
pgsPort0Int->regIntClr = P26;
}
if(dwIntFlag & P25)//无功电能
{
if(dwDir & P24)
{
g_sEneryCnt.dwEQbp++; //B相正向无功电能计数值++
QBsign = 1;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -