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

📄 att7022.c

📁 ATT7022 电力计量芯片读写程序.对开发电力计量数显仪表非常有用.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "ATT7022.h"
#include "Pindefine.h"
#include "variable.h"
#include  <string.h>
 D7022 bank1  D_Sampling;
//#define     Nop()    asm("nop") 
#define     NOP()              asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")
unsigned char Read_7022(uchar address,uchar *pointer);
unsigned char Read_SPI(void);
unsigned char  Write_SPI(uchar by_data);
unsigned char Conver_r( uchar n,uchar *pointer,uchar *p1,uchar num);
unsigned char  Read_Voltage(unsigned int bank1 *p);
unsigned char  Read_Current(unsigned int *p);
unsigned char  Calibrate_7022(uchar address,uchar *pointer);
void DelyNms(unsigned int Nms);
uchar    Reade2Calibrate(uchar byAddress,uchar EromAddr);
void  Port_7022_INIT(void);
void  Att7022_INIT(void);
unsigned char  Read_SigST(void);
unsigned char Check_ChkSum(void);
void    Calibrate_INIT(void);
unsigned char    Readdata(uchar byAddress,uchar romAddr);
unsigned char Receive_Calibrate_Data(unsigned char *p);
extern unsigned  char  I2C_Read(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);
extern unsigned  char  I2C_Write(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);
unsigned char Calibrate_bit = 0;
extern void watchDOG(void);
void DelyNms(unsigned int Nms)
{
  unsigned int i,j;
  for(i = 0;i<Nms;i++)
  {
    j = 500;
    while(j--);
  }
}
//* --------------------------------------------------------------------------
//* Function			: Read_7022
//* Describing		    : Read 3 byte from 7022 on spi.
//* In parameter		: uchar Address,uchar *
//* Out parameter		: bit---true/false
//* Mend Note		    : none
//* Remark			    : none
//* --------------------------------------------------------------------------
unsigned char Read_7022(uchar address,uchar *pointer)
{
	CS_7022_PM = OUT_PORTST;   
	CS_7022 = 0;		
	NOP();	
	NOP();
	Write_SPI(address);
	*(pointer) = Read_SPI();
	*(pointer+1) = Read_SPI();
	*(pointer+2) = Read_SPI();
	NOP();
	NOP();			
	CS_7022 = 1;
	return true;
}
//* --------------------------------------------------------------------------
//* Function			: read_spi
//* Describing		    : Read a byte from 7022 on spi.
//* In parameter		: none
//* Out parameter		: uchar byte
//* Mend Note		    : none
//* Remark			    : none
//* --------------------------------------------------------------------------
uchar Read_SPI(void)
{
	uchar	by_data = 0;
	uchar 	i = 0;
	for(i = 0;i < 8;i++)
	{
		SCK_7022_PM = OUT_PORTST;
		NOP();
		SCK_7022 = 1;
		NOP();
		NOP();		
		by_data <<= 1;
		DOUT_7022_PM = INPUT_PORTST;
		if(DOUT_7022)by_data |= 1;
		NOP();
		NOP();
		SCK_7022 = 0;
		NOP();		
	}    
	return  by_data; 
}

//* --------------------------------------------------------------------------
//* Function			: Write_Spi
//* Describing		    : Write a byte to 7022 on spi.
//* In parameter		: uchar Data
//* Out parameter		: bit---true/false
//* Mend Note		    : none
//* Remark			    : none
//* --------------------------------------------------------------------------
unsigned char  Write_SPI(uchar by_data)
{
	uchar i ;
	uchar j=0;
	for(i = 0 ; i < 8 ; i++ )
	{
		NOP();
		j= by_data&0x80;
		DIN_7022_PM = OUT_PORTST;
		if(j)DIN_7022 = 1;
		else DIN_7022 = 0;
		NOP();
		by_data <<= 1;
		NOP();
		SCK_7022_PM = OUT_PORTST;
		SCK_7022 = 1;
		NOP();
		NOP();
		NOP();
		SCK_7022 = 0;
	}
	DIN_7022_PM = INPUT_PORTST;
	if(DIN_7022)
	{
		DIN_7022_PM = OUT_PORTST;   
		DIN_7022 = 0;
	}return true;
}
//* --------------------------------------------------------------------------
//* Function			: Read_Voltage    2349600                                     
//* Describing		    : Read the A B C 0 Voltage                                       
//* In parameter		: the * six byte buf                                            
//* Out parameter		: none                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
uchar  Read_Voltage(unsigned int bank1 *p)      			//
{
    uchar   m_byBuf[3];
    uint  m_inTemp;
    uchar   by_address;
    uchar   i;    
    by_address = Adrs_7022_Ua;
    for(i = 0;i<3;i++)
    {
        if(Read_7022(by_address++,m_byBuf))		        //
        {    
            Conver_r(13,m_byBuf,(uchar*)&m_inTemp,10);
            if((m_inTemp > DATA_UABC_MAX))
            {
                return false;   
            }
            *p = m_inTemp;
             p++;
        }
        else return false;
    }       
    return true;
}
//* --------------------------------------------------------------------------
//* Function			: Read_Current                                       
//* Describing		    : Read the A B C 0 Current                                     
//* In parameter		: the * six byte buf                                            
//* Out parameter		: none                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
uchar	Read_Current(unsigned int *p)
{
    	uchar   m_byBuf[3];
    	uchar   by_address;
    	uint    m_inTemp;
    	uchar   i;    
    	by_address = Adrs_7022_Ia;
   	   for(i = 0;i<3;i++)
    	{
        	if(Read_7022(by_address++,m_byBuf))		            //A
        	{  
            	Conver_r(13,m_byBuf,(uchar*)&m_inTemp,100);
	     	    if(i<3)
	          	{
            		if(m_inTemp > DATA_IABC_MAX)
            		{	
                		return false;   
            		}
            	}    
            	*p = m_inTemp;
            	p++;                
            	NOP();		    
        	}
        	else return false;
    	}
    	return true;  
}
//* --------------------------------------------------------------------------
//* Function			: Conver_r                                         
//* Describing		    :                                       
//* In parameter		:                                   
//* Out parameter		: none                                                
//* Mend Note		    : none                                                    
//* Remark			    : none                                                    
//* --------------------------------------------------------------------------
unsigned char Conver_r( uchar n,uchar *pointer,uchar *p1,uchar num)//
{
	union{
		   ulong	lg_Buf;
		    uchar   by_Buf[4];
	     }un_4Buf;   
    un_4Buf.by_Buf[3] = 0;           
	un_4Buf.by_Buf[2] = (*pointer);    
	un_4Buf.by_Buf[1] = (*(pointer+1));
	un_4Buf.by_Buf[0] = (*(pointer+2));
    un_4Buf.lg_Buf = un_4Buf.lg_Buf*num;
	un_4Buf.lg_Buf>>= n;
	*p1 = un_4Buf.by_Buf[0];
	*(p1+1) = un_4Buf.by_Buf[1];
	return true;
}

void    Calibrate_INIT(void)
{
	uint	i;
	uchar	m_byBuf[4];
    watchDOG();
	i = 50;
	while(i--);
	RESET_7022_PM = 0;
	RESET_7022 = 0;
	i = 30;
	while(i--);
    watchDOG();
	RESET_7022 =1;
	NOP();	
    DelyNms(5);
    m_byBuf[0] = 0;
    m_byBuf[1] = 0;
    m_byBuf[2] = 0;
	Calibrate_7022(Cmd_7022_SoftReset, m_byBuf);			//SoftReset
    NOP();
    i = 0xff;
    while(i--);
    Read_7022(Adrs_7022_ChkSum1,m_byBuf); 
	Calibrate_7022(Cmd_7022_ClearData, m_byBuf);			//ClearData
			i = 0xff;
			while(i--);
    Calibrate_7022(Cmd_7022_EnableWD, m_byBuf);			    //enable write
	NOP();
			i = 0xff;
			while(i--);
    watchDOG();
   #ifdef   VOLTAGE
    I2C_Read(FM24C16addr2,0,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
     {
		m_byBuf[0] = 0xdc;//0xbc;
		m_byBuf[1] = 0x28;//0x9c;
		m_byBuf[2] = 0xf6;//0x7d;  	
      } 
    Calibrate_7022(Adrs_7022_UgainA,m_byBuf);
			i = 0xff;
			while(i--);
    Read_7022(Adrs_7022_ChkSum1,m_byBuf);  
    I2C_Read(FM24C16addr2,4,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
     {
	    m_byBuf[0] = 0xdb;//0xbc;
	    m_byBuf[1] = 0xb9;//0x9c;
	    m_byBuf[2] = 0x8d;//0x7d
      } 
     Calibrate_7022(Adrs_7022_UgainB,m_byBuf);
     			i = 0xff;
			while(i--);
     Read_7022(Adrs_7022_ChkSum1,m_byBuf);  
     I2C_Read(FM24C16addr2,8,4,m_byBuf);  
    i = (m_byBuf[0] + m_byBuf[1] + m_byBuf[2]);
    if(m_byBuf[3]!=i)
     {
		m_byBuf[0] = 0xe7;//0xbc;
		m_byBuf[1] = 0x24;//0x9c;
		m_byBuf[2] = 0x75;//0x7d;    

⌨️ 快捷键说明

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