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

📄 att702x.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 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 + -