📄 att702x.c
字号:
#include "includes.h"
const unsigned char _att702x_wr[]=
{
ATT_ADDR_IREGION1,
ATT_ADDR_IREGION2,
ATT_ADDR_IREGION3,
ATT_ADDR_IREGION4,
ATT_ADDR_PGAINA0,
ATT_ADDR_PGAINB0,
ATT_ADDR_PGAINC0,
ATT_ADDR_PGAINA1,
ATT_ADDR_PGAINB1,
ATT_ADDR_PGAINC1,
ATT_ADDR_PHSREGA0,
ATT_ADDR_PHSREGA1,
ATT_ADDR_PHSREGA2,
ATT_ADDR_PHSREGA3,
ATT_ADDR_PHSREGA4,
ATT_ADDR_PHSREGB0,
ATT_ADDR_PHSREGB1,
ATT_ADDR_PHSREGB2,
ATT_ADDR_PHSREGB3,
ATT_ADDR_PHSREGB4,
ATT_ADDR_PHSREGC0,
ATT_ADDR_PHSREGC1,
ATT_ADDR_PHSREGC2,
ATT_ADDR_PHSREGC3,
ATT_ADDR_PHSREGC4,
ATT_ADDR_UGAINA,
ATT_ADDR_UGAINB,
ATT_ADDR_UGAINC,
ATT_ADDR_IRECHG,
ATT_ADDR_ISTARTUP,
ATT_ADDR_HFCONST,
ATT_ADDR_LFCONST,
ATT_ADDR_IGAINA,
ATT_ADDR_IGAINB,
ATT_ADDR_IGAINC,
ATT_ADDR_FAILVOLTAGE,
ATT_ADDR_EADDMODE,
ATT_ADDR_ENDTIORDER,
ATT_ADDR_HFDOUBLE,
ATT_ADDR_UADCPGA,
ATT_ADDR_ENLINEFREQ,
ATT_ADDR_ENHARMONIC,
ERROR
};
unsigned short DeltaWattActiveZ[4] = {0,0,0,0};
unsigned short DeltaWattActiveF[4] = {0,0,0,0};
unsigned short DeltaWattReactiveZ[4] = {0,0,0,0};
unsigned short DeltaWattReactiveF[4] = {0,0,0,0};
unsigned short DeltaWattLActive[4] = {0,0,0,0};
unsigned short DeltaWattLReactive[4] = {0,0,0,0};
void Att702xSeqErrDet(void)
{
unsigned long temp;
unsigned char irq[3];
temp = ATT_VALUE_ENCURRENTSEQ;
Att702xWrite( ATT_ADDR_ENDTIORDER, (unsigned char *)&temp );
Att702xRead( ATT_ADDR_SFLAG, irq );
temp = ATT_VALUE_DISABLECURRENTSEQ;
Att702xWrite( ATT_ADDR_ENDTIORDER, (unsigned char *)&temp );
if( !( irq[0] & ATT_SFLAG_MASK_ISEQERR ) )
{
if( EvtTimerCounterflag & BIT0 )
{
EvtTimerCounterflag &=(unsigned char)(~ BIT0);
EvtTimerCounter[0] = 0;
}
if( AlarmCtlWord1 & ALARM_OF_ISEQERR )
{
if( EvtTimerCounter[0]++ > _SysPotInfo.timer_count[EVT_TC_CURSEQERR] )
{
EvtTimerCounter[0] = 0;
AlarmCtlWord1 &=(uchar)(~ ALARM_OF_ISEQERR);
MeterRunningState &=~ PS_DIR;
SaveEvtStopInfo(1);
}
}
}
else
{
if( !(EvtTimerCounterflag & BIT0 ) )
{
EvtTimerCounterflag |= BIT0;
EvtTimerCounter[0] = 0;
}
if( !( AlarmCtlWord1 & ALARM_OF_ISEQERR ) )
{
if( EvtTimerCounter[0]++ > _SysPotInfo.timer_count[EVT_TC_CURSEQERR] )
{
EvtTimerCounter[0] = 0;
AlarmCtlWord1 |= ALARM_OF_ISEQERR;
MeterRunningState |= PS_DIR;
SaveEvtStartInfo(1);
}
}
}
if( !( irq[0] & ATT_SFLAG_MASK_VSEQERR ) )
{
if( EvtTimerCounterflag & BIT4 )
{
EvtTimerCounterflag &=~ BIT4;
EvtTimerCounter[4] = 0;
}
if( AlarmCtlWord2 & ALARM_OF_VSEQERR )
{
if( EvtTimerCounter[4]++ > _SysPotInfo.timer_count[EVT_TC_VOLSEQERR] )
{
EvtTimerCounter[4] = 0;
AlarmCtlWord2 &=~ ALARM_OF_VSEQERR;
SaveEvtStopInfo(0);
}
}
}
else
{
if( !(EvtTimerCounterflag & BIT4 ) )
{
EvtTimerCounterflag |= BIT4;
EvtTimerCounter[4] = 0;
}
if( !( AlarmCtlWord2 & ALARM_OF_VSEQERR ) )
{
if( EvtTimerCounter[4]++ > _SysPotInfo.timer_count[EVT_TC_VOLSEQERR] )
{
EvtTimerCounter[4] = 0;
AlarmCtlWord2 |= ALARM_OF_VSEQERR;
SaveEvtStartInfo(0);
}
}
}
}
void Att702xReinit(void)
{
unsigned long ucData;
unsigned char ii, data1[ATT_REGISTER_LEN];
if(! IsPowerOn() ) return;
memset( &data1[0], 0, ATT_REGISTER_LEN );
Att702xWrite( ATT_COMMAND_ADDR_RESET, &data1[0] );
Delay(500);
for( ii = 0; ii < ATT_REGISTER_CAL_NUMBER; ii++ )
{
Att702xWrite( _att702x_wr[ii], (unsigned char *)&_SysPotInfo.att702x_info[ii*ATT_REGISTER_LEN] );
}
ucData = ATT_VALUE_ENVANGLE;
Att702xWrite( ATT_ADDR_ENUANGLE, (unsigned char *)&ucData );
}
void Att702xValidityCheck(void)
{
unsigned char item = 0, data[3], ii;
if( IsPowerOn() )
{
SpiWriteOrder( 0xc6, 0x5A );
for( ii = 0; ii < ATT_REGISTER_CAL_NUMBER; ii++ )
{
Att702xRead( _att702x_wr[ii], data );
if( IsEqual( data, (unsigned char *)&_SysPotInfo.att702x_info[item], ATT_REGISTER_LEN ) != OK )
{
goto INIT_ATT702X;
}
item += ATT_REGISTER_LEN;
}
SpiWriteOrder( 0xc6, 0x55 );
}
_sys_evt_del( EVT_INIT_ATT702X );
AlarmCtlWord3 &=~ ALARM_OF_SPI;
return;
INIT_ATT702X:
AlarmCtlWord3 |= ALARM_OF_SPI;
_sys_evt_add( EVT_INIT_ATT702X );
}
#if 0
void ReadLineActivePowerFromAtt702x(void)
{
unsigned long LPowerData1, LPowerData2;
unsigned char ii;
if( !IsPowerOn() ) return;
for( ii = 0; ii < 4; ii++ )
{
if( !IsPowerOn() ) return;
Att702xRead( ATT_ADDR_LINE_EPA+ii, (unsigned char *)&LPowerData1 );
LPowerData1 &= 0xFFFF;
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&LPowerData2 );
LPowerData2 &= 0xFFFF;
if( LPowerData1 != LPowerData2 )
{
continue;
}
DeltaWattLActive[ii] += (ushort)LPowerData1;
}
}
void ReadLineReActivePowerFromAtt702x(void)
{
unsigned long LPowerData1, LPowerData2;
unsigned char ii;
if( !IsPowerOn() ) return;
for( ii = 0; ii < 4; ii++ )
{
if( !IsPowerOn() ) return;
Att702xRead( ATT_ADDR_LINE_EQA+ii, (unsigned char *)&LPowerData1 );
LPowerData1 &= 0xFFFF;
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&LPowerData2 );
LPowerData2 &= 0xFFFF;
if( LPowerData1 != LPowerData2 )
{
continue;
}
DeltaWattLReactive[ii] += (ushort)LPowerData1;
}
}
#endif
void ReadLinePowerFromAtt7022B(void)
{
unsigned long LPowerData1, LPowerData2;
unsigned char ii;
if( !IsPowerOn() )
{
return;
}
for( ii = 0; ii < 8; ii++ )
{
Att702xRead( ATT_ADDR_LINE_EPA + ii, (unsigned char *)&LPowerData1 );
LPowerData1 &= 0xFFFF;
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&LPowerData2 );
LPowerData2 &= 0xFFFF;
if( LPowerData1 != LPowerData2 )
{
continue;
}
if( ii < 4 )
{
DeltaWattLActive[ii] += (ushort)LPowerData1;
}
else
{
DeltaWattLReactive[ii-4] += (ushort)LPowerData1;
}
}
}
void ReadActivePowerFromAtt702x(void)
{
unsigned long ucPowerData1, ucPowerData2;
unsigned char ucPFlag1[3],ucPFlag2[3];
unsigned char ii,temp;
if( !IsPowerOn()) return;
Att702xRead( ATT_ADDR_PFLAG, (unsigned char *)&ucPFlag1[0] );
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&ucPFlag2[0] );
if( OK != IsEqual(&ucPFlag1[0], &ucPFlag2[0], 3 ) ) return;
for( ii = 0; ii < 4; ii++ )
{
if( !IsPowerOn() ) return;
temp = 0;
Att702xRead( ATT_ADDR_EPA2 + ii, (unsigned char *)&ucPowerData1 );
ucPowerData1 &= 0xFFFF;
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&ucPowerData2 );
ucPowerData2 &= 0xFFFF;
if( ucPowerData1 != ucPowerData2 )
{
continue;
}
if( ucPFlag1[0] & ( ATT_PFLAG_MASK_BIT << ii ) )
{
temp=0x55;
}
if( temp == 0x55 )
{
MeterRunningStateWord |= 0x10;
DeltaWattActiveF[ii] += (ushort)ucPowerData1;
}
else
{
MeterRunningStateWord &=~ (0x10);
DeltaWattActiveZ[ii] += (ushort)ucPowerData1;
}
}
}
void ReadReActivePowerFromAtt702x(void)
{
unsigned long ucPowerData1, ucPowerData2;
unsigned char ucPFlag1[3],ucPFlag2[3];
unsigned char ii,temp;
Att702xRead( ATT_ADDR_PFLAG, (unsigned char *)&ucPFlag1[0] );
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&ucPFlag2[0] );
if( OK != IsEqual(&ucPFlag1[0], &ucPFlag2[0], 3 ) ) return;
for( ii = 0; ii < 4; ii++ )
{
if( !IsPowerOn() ) return;
temp = 0;
Att702xRead( ATT_ADDR_EQA2 + ii, (unsigned char *)&ucPowerData1 );
ucPowerData1 &= 0xFFFF;
Att702xRead( ATT_ADDR_RSPIDATA, (unsigned char *)&ucPowerData2 );
ucPowerData2 &= 0xFFFF;
if( ucPowerData1 != ucPowerData2 )
{
continue;
}
if( ucPFlag1[0] & ( ATT_PFLAG_MASK_BIT << (ii+4) ) )
{
temp=0x55;
}
if( temp == 0x55 )
{
DeltaWattReactiveF[ii] += (ushort)ucPowerData1;
MeterRunningStateWord |= 0x20;
}
else
{
MeterRunningStateWord &=~ (0x20);
DeltaWattReactiveZ[ii] += (ushort)ucPowerData1;
}
}
}
void SpiWriteByte(unsigned char wdata)
{
unsigned char ii;
for( ii = 0; ii < 8; ii++)
{
if( wdata & 0x80 )
{
ATT7022DIN_IN |= ATT7022DIN;
}
else
{
ATT7022DIN_IN &=~ ATT7022DIN;
}
wdata <<= 1;
ATT7022CLK_OUT |= ATT7022CLK;
Delay(30);
ATT7022CLK_OUT &=~ ATT7022CLK;
Delay(30);
}
}
void SpiWriteOrder(unsigned char addr,unsigned char wdata)
{
if( IsPowerOn() )
{
addr |= 0xC0;
ATT7022CS_OUT &=~ ATT7022CS;
_NOP();
_NOP();
ATT7022CLK_OUT &=~ ATT7022CLK;
Delay(125);
SpiWriteByte(addr);
SpiWriteByte(0);
SpiWriteByte(0);
SpiWriteByte(wdata);
ATT7022CLK_OUT |= ATT7022CLK;
_NOP();
_NOP();
ATT7022CS_OUT |= ATT7022CS;
_NOP();
_NOP();
ATT7022DIN_IN |= ATT7022DIN;
Delay(125);
}
}
void Att702xWrite( unsigned char addr, unsigned char *data )
{
unsigned char ii;
if( IsPowerOn() )
{
addr |= SPI_WRITE_OPER;
SpiWriteOrder(0xC9, 0x00);
ATT7022CS_OUT &=~ ATT7022CS;
_NOP();
_NOP();
ATT7022CLK_OUT &=~ ATT7022CLK;
Delay(125);
SpiWriteByte(addr);
for( ii = 0; ii < 3; ii++)
{
SpiWriteByte( *(2+data--) );
}
ATT7022CS_OUT |= ATT7022CS;
_NOP();
_NOP();
ATT7022CLK_OUT |= ATT7022CLK;
_NOP();
_NOP();
ATT7022DIN_IN |= ATT7022DIN;
_NOP();
_NOP();
Delay(250);
SpiWriteOrder( 0xC9, 0x01 );
Delay(250);
}
}
void Att702xRead( unsigned char addr, unsigned char *data )
{
unsigned char ii;
if( IsPowerOn() )
{
ATT7022CS_OUT &=~ ATT7022CS;
_NOP();
_NOP();
ATT7022CLK_OUT &=~ ATT7022CLK;
addr = addr & SPI_Read_OPER;
data += 3;
Delay(125);
SpiWriteByte(addr);
for( ii = 0; ii < 24; ii++)
{
if( ii % 8 == 0 ) data--;
*data <<= 1;
ATT7022CLK_OUT &=~ ATT7022CLK;
Delay(30);
ATT7022CLK_OUT |= ATT7022CLK;
Delay(30);
if(!( ATT7022DOUT_OUT & ATT7022DOUT ))
{
*data |= 0x01;
}
}
ATT7022CLK_OUT &=~ ATT7022CLK;
_NOP();
_NOP();
ATT7022CS_OUT |= ATT7022CS;
_NOP();
_NOP();
ATT7022CLK_OUT |= ATT7022CLK;
_NOP();
_NOP();
ATT7022DIN_IN |= ATT7022DIN;
Delay(250);
}
else
{
for( ii = 0; ii < 3; ii++ )
{
*( data + ii ) = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -