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

📄 att7022.c

📁 ATT7022 电力计量芯片读写程序.对开发电力计量数显仪表非常有用.
💻 C
📖 第 1 页 / 共 2 页
字号:
      } 
    Calibrate_7022(Adrs_7022_UgainC,m_byBuf);
			i = 0xff;
			while(i--);
    Read_7022(Adrs_7022_ChkSum1,m_byBuf);  

    #else    CURRENT
    I2C_Read(FM24C16addr2,12,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
     {
	    m_byBuf[0] = 0x87;
		m_byBuf[1] = 0xae;
		m_byBuf[2] = 0x15; 
      } 
    Calibrate_7022(Adrs_7022_IgainA,m_byBuf);
			i = 0xff;
			while(i--);
    Read_7022(Adrs_7022_ChkSum1,m_byBuf);  
    I2C_Read(FM24C16addr2,16,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
    {
	    m_byBuf[0] = 0xe7;
		m_byBuf[1] = 0x24;
		m_byBuf[2] = 0x75; 
     } 
    Calibrate_7022(Adrs_7022_IgainB,m_byBuf);
			i = 0xff;
			while(i--);
    Read_7022(Adrs_7022_ChkSum1,m_byBuf);  
    I2C_Read(FM24C16addr2,20,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
     {
	    m_byBuf[0] = 0xe7;
		m_byBuf[1] = 0x24;
		m_byBuf[2] = 0x75; 
      } 
     Calibrate_7022(Adrs_7022_IgainC,m_byBuf);
			i = 0xff;
			while(i--);
     Read_7022(Adrs_7022_ChkSum1,m_byBuf);
     #endif  
     watchDOG();
     m_byBuf[0] = 0;
     m_byBuf[1] = 0;
     m_byBuf[2] = 1;
     Calibrate_7022(Cmd_7022_EnableWD, m_byBuf);			//disable write	
	 i = 0xffff;
	 watchDOG();
 	 while(i--)
			{
				NOP();
				NOP();
				NOP();
				NOP();
		    }
     Read_7022(Adrs_7022_ChkSum1,m_byBuf);  
     DelyNms(200); 	
     watchDOG(); 
 	}

unsigned char  Calibrate_7022(uchar address,uchar *pointer)
{
	CS_7022_PM = OUT_PORTST;   
	CS_7022 = 0;
	NOP();
	NOP();
	if(Write_SPI(address+0X80) == 0)
	 	return false;
	if(Write_SPI(*pointer) == 0)
		return false;
	if(Write_SPI(*(pointer+1))== 0)
		return false;
	if(Write_SPI(*(pointer+2))== 0)
		return false;
	NOP();
	NOP();
	CS_7022 = 1;
	return true;
}
unsigned char    Readdata(uchar byAddress,uchar romAddr)
{
    uchar   m_byBuf[4];
	I2C_Read(FM24C16addr2,romAddr,4,m_byBuf);  
	if(m_byBuf[3]==(m_byBuf[0] + m_byBuf[1] + m_byBuf[2]))
	{
	    Calibrate_7022(byAddress, m_byBuf);  
	    return true;
	}
	else return false;
}
//* --------------------------------------------------------------------------
//* Function			: Reade2Calibrate                                         
//* Describing		    :                                           
//* In parameter		: none                                                
//* Out parameter		: none                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
uchar    Reade2Calibrate(uchar byAddress,uchar romAddr)
{
    uchar   m_byBuf[4];
	//I2C_Read(FM24C16addr2,romAddr,4,m_byBuf);  
	if(m_byBuf[3]==(m_byBuf[0] + m_byBuf[1] + m_byBuf[2]))
	{
	    Calibrate_7022(byAddress, m_byBuf);  
	    return true;
	}
	else return false;
}

void Port_7022_INIT(void)
{	
    DOUT_7022_PM = INPUT_PORTST; 
    DIN_7022_PM = INPUT_PORTST;   
    SCK_7022_PM = INPUT_PORTST;   
    CS_7022_PM   = INPUT_PORTST;   
//    SIG_7022_PM  = INPUT_PORTST;      
    RESET_7022_PM= INPUT_PORTST;   

  /*  DOUT_7022_PM = OUT_PORTST; 
    DIN_7022_PM = OUT_PORTST;   
    SCK_7022_PM = OUT_PORTST;   
    CS_7022_PM   = OUT_PORTST;   
    SIG_7022_PM  = OUT_PORTST;      
    RESET_7022_PM= OUT_PORTST;    */   
}
//* --------------------------------------------------------------------------
//* Function			: Att7022_INIT                                         
//* Describing		    : INIT 7022,PORT,RESET                                          
//* In parameter		: none                                                
//* Out parameter		: none                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
void  Att7022_INIT(void)
{
	uint 	i;
	i = 0x7fff;
    watchDOG();
	while(i--);  //需要喂狗
    watchDOG();

	Port_7022_INIT();
	Calibrate_INIT();	
}

//* --------------------------------------------------------------------------
//* Function			: Read_SigST                                         
//* Describing		    :                                       
//* In parameter		:                                   
//* Out parameter		: true is work right,false is work eeror.                                               
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
uchar Read_SigST(void)
{
	uchar   i = 0xff;
//	SIG_7022_PM  = INPUT_PORTST;        		//SIG IS INPUT
    if(Calibrate_bit)  	return true;  
/*	if(!SIG_7022)
	{
		watchDOG();
        while(i--);                               //Watch_Dog();
        watchDOG();
		if(!SIG_7022)							//Calibrate_INIT()
		{
			return  false;                  			//work eeror
		}
	}*/ 
	return true;                       					 //work right
}

//--------------------------------------------------------------------------
//* Function			: Read_ChkSum  校表数据的校验                          
//* Describing		    : Read the ChkSum of Calibrate Data                                     
//* In parameter		:                                           
//* Out parameter		:                                                
//* Mend Note		    : none                                                    
//* Remark			    : ture   is no problom, false is question                                                 
//* --------------------------------------------------------------------------
unsigned char Check_ChkSum(void)
{
    	uchar   m_byBuf1[4];
    	uchar   m_byBuf2[4];
        uchar   i;
        Read_7022(Adrs_7022_ChkSum1,m_byBuf1);
    	I2C_Read(FM24C16addr2,24,4,m_byBuf2); 
        i = (m_byBuf2[0]+m_byBuf2[1]+m_byBuf2[2]);
    	if(m_byBuf2[3] == i)
    	{
        	/*if(memcmp(m_byBuf1,m_byBuf2,3)!=0)
        	{
            		return true;    
        	}*/
            if(m_byBuf2[2]!=m_byBuf1[2])  return false;
            if(m_byBuf2[1]!=m_byBuf1[1])  return false;
            if(m_byBuf2[0]!=m_byBuf1[0])  return false;
            return  true;
    	}
    	return false;
}
//* --------------------------------------------------------------------------
//* Function			: Receive_Calibrate_Data                                 
//* Describing		    : the data record in EEPROM,and use in ATT7022B                     
//* In parameter		: The *p of 4 Byte                                           
//* Out parameter		: true is succeed  false is lost,                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
unsigned char Receive_Calibrate_Data(unsigned char *p)
{
	uchar   m_byBuf[4];
	uchar   m_byBuf1[4];
	uchar   m_byControl;
	uint    i;
    m_byControl = *p;
	m_byBuf[0] = *(p+1);
	m_byBuf[1] = *(p+2);
	m_byBuf[2] = *(p+3);
    if(m_byControl!=0x55)
     {
		m_byBuf1[0] = 0;  
		m_byBuf1[1] = 0;
		m_byBuf1[2] = 0;
		Calibrate_7022(Cmd_7022_EnableWD, m_byBuf1);			//enable write
		watchDOG();
	    i = 0xff;
		while(i--);
		Calibrate_7022(m_byControl, m_byBuf);
		i = 0xff;
		while(i--);
	    watchDOG();
 	    m_byBuf1[0] = 0;  
		m_byBuf1[1] = 0;
		m_byBuf1[2] = 1;
		Calibrate_7022(Cmd_7022_EnableWD, m_byBuf1);			//disable write
		i = 0xffff;
	    watchDOG();
		while(i--)
		{
			NOP();
			NOP();
			NOP();
			NOP();
	    }
     }
     else
      {
		i = 50;
		while(i--);
		RESET_7022_PM = 0;
		RESET_7022 = 0;
		i = 30;
		while(i--);
	    watchDOG();
		RESET_7022 =1;
		NOP();	
	    DelyNms(10);
        watchDOG();
	    m_byBuf[0] = 0;
	    m_byBuf[1] = 0;
	    m_byBuf[2] = 0;
		Calibrate_7022(Cmd_7022_SoftReset, m_byBuf);			//SoftReset
        DelyNms(10);
      }
    watchDOG();
    Read_7022(Adrs_7022_ChkSum1,m_byBuf); 
    m_byBuf[3] =  m_byBuf[0] + m_byBuf[1] + m_byBuf[2];
    I2C_Write(FM24C16addr2,24,4,m_byBuf);
    watchDOG();
	i = 0xff;
	while(i--);
    return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -