⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs5463.c

📁 著名的CS5463抄表模块
💻 C
📖 第 1 页 / 共 4 页
字号:
/*********************************************
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 + -