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

📄 spi.c

📁 msp430和nrf905的例子,联系qqliuyong007@163.com
💻 C
字号:
 //unsigned short c,k;
// unsigned long  sum[3],huat;
// unsigned short b[3][15];
//unsigned long sumreapwr[3],rea[3][15];

UDWORD spi_read_parameter(UBYTE Addr)
{
    UDWORD tmpData=0;
    UBYTE i;
    
    SPI_PDIR |=( SPI_CS + SPI_CLK + SPI_DO);    // 3引角输出
    SPI_PDIR &=~ SPI_DI;                        //1引角输入
	
    SPI_POUT |= SPI_CS;                       //片选信号从高电平到低电平,spi操作开始
    _NOP();
    _NOP();
    _NOP();
    SPI_POUT &=~SPI_CS;
    _NOP();
	
    // write address to SPI device.
	for(i=1;i<=8;i++)
	{
		SPI_POUT |= SPI_CLK;          //时钟引角变化产生读或写数据                           
		_NOP();
		_NOP();
		if ((Addr&0x80)==0x80) SPI_POUT |= SPI_DO;     //高位写入
		else SPI_POUT &=~SPI_DO;
		Addr <<= 1;
		_NOP();
		_NOP();
		SPI_POUT &=~SPI_CLK;
		_NOP();
		_NOP();
	}
	
    // read data from SPI device.
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    
	tmpData = 0;
	for(i=1;i<=24;i++)
	{
		SPI_POUT |= SPI_CLK;
		_NOP();
		tmpData <<= 1;
		if ((SPI_PIN&SPI_DI)==SPI_DI) tmpData |= 0x000001;   // 从spi读出数据
		else tmpData &=~0x000001;
		_NOP();
		_NOP();
		SPI_POUT &=~SPI_CLK;
	}
	
    SPI_POUT |= SPI_CS;
    _NOP();
    _NOP();
    _NOP();
    SPI_POUT &=~SPI_CS;
    return tmpData;
}

void spi_write_parameter(UBYTE Addr,UDWORD Data)
{
    UBYTE i;
    
    SPI_PDIR |=( SPI_CS + SPI_CLK + SPI_DO);
    
    
    SPI_PDIR &=~ SPI_DI;
    
    SPI_POUT |= SPI_CS;
    _NOP();
    _NOP();
    _NOP();
    SPI_POUT &=~SPI_CS;
    _NOP();
    
    // write address to SPI device.
    Addr |= 0x80;
	for(i=1;i<=8;i++)
	{
		SPI_POUT |= SPI_CLK;
		_NOP();
		_NOP();
		if ((Addr&0x80)==0x80) SPI_POUT |= SPI_DO;
		else SPI_POUT &=~SPI_DO;
		Addr <<= 1;
		_NOP();
		_NOP();
		SPI_POUT &=~SPI_CLK;
		_NOP();
		_NOP();
	}
	
    // write data to SPI device.
    _NOP();
    _NOP();
    _NOP();
    _NOP();
	
	for(i=1;i<=24;i++)
	{
		SPI_POUT |= SPI_CLK;
		_NOP();
		_NOP();
		if ((Data&0x800000)==0x800000) SPI_POUT |= SPI_DO;
		else SPI_POUT &=~SPI_DO;
		Data <<=1;
		_NOP();
		_NOP();
		SPI_POUT &=~SPI_CLK;
		_NOP();
	}
    SPI_POUT |= SPI_CS;
    _NOP();
    _NOP();
    _NOP();
    SPI_POUT&=~SPI_CS;
}
/*
void getTC(int Temp)           //得到温度校正值TC        
{ unsigned long TEMP;
  int tm,tmm;
  TEMP=spi_read_parameter(0x20);
  tm=TEMP;
  if(tm>128)  tmm=tm-256;
  else       tmm=tm;
  TC=tmm+Temp;
}
*/
void Readtemp(void)                  //读出温度值
 { 
  unsigned long TEMP;
   int tm,tmm;
   TEMP=spi_read_parameter(0x20);
   tm=TEMP;
   if(tm>128)  tmm=tm-256;
   else       tmm=tm;
   SPI.temp=TC-tmm;  
 }
 
 /*
void ATT7022Reset(void)
{
	SPI_POUT |= SPI_AREST;
	SPI_PDIR |= SPI_AREST;
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	_NOP();
	SPI_POUT &=~SPI_AREST;
	
	spi_write_parameter(0xD3,0);
	spi_write_parameter(0xC3,0);
}
*/
//读三相有功功率
void ReadACTPwr(unsigned char ch)         
{   float iii;
    unsigned long ACT;
    ACT=spi_read_parameter(ch+0x01);
    if(ACT<=_23_bit)
      { if(ch==3) iii=((float)ACT*_17_bit)/_23_bit;
        else      iii=((float)ACT*_15_bit)/_23_bit;
      }
      
    else 
     {  if(ch==3) iii=(((float)ACT-_24_bit)*_15_bit)/_23_bit;
        else      iii=(((float)ACT-_24_bit)*_15_bit)/_23_bit;
      }
      SPI.ActPwr[ch]=(long)iii; 
}


//读三相无功功率
void ReadREAPwr(unsigned char ch)
{   float iii;
    unsigned long REA;
    REA=spi_read_parameter(ch+0x05);
    if(REA<=_23_bit)
    { if(ch==3) iii=((float)REA*_17_bit)/_23_bit;
      else      iii=((float)REA*_15_bit)/_23_bit;
    }
         
    else 
     { if(ch==3) iii=(((float)REA-_24_bit)*_17_bit)/_23_bit;
       else      iii=(((float)REA-_24_bit)*_15_bit)/_23_bit;
     }
      SPI.ReaPwr[ch]=(long)iii; 
}




//读三相视在功率
void ReadAPPPwr(unsigned char ch)
{  float iii;
   unsigned long APP;
   APP=spi_read_parameter(ch+0x09);
   if(APP<=_23_bit)
     { if(ch==3) iii=((float)APP*_17_bit)/_23_bit;
       else      iii=((float)APP*_15_bit)/_23_bit;
     }
    else 
     { if(ch==3) iii=(((float)APP-_24_bit)*_17_bit)/_23_bit;
       else      iii=(((float)APP-_24_bit)*_15_bit)/_23_bit;
      }
      SPI.AppPwr[ch]=(long)iii; 
 }
 

 
 
//读三相电压

void ReadU( UBYTE ch )
{    
	float iii;
	unsigned long UU;	
	 UU=spi_read_parameter(ch+0x0D);
	
	if( UU<=_23_bit)
		iii=((float)UU*_10_bit)/_23_bit*KU;      // 有两位小数
	
	if(sel==0) 
	{ SPI.U[ch]=(unsigned int)iii;
	  SPI.XU[ch]=(unsigned int)iii*genhao3;
	}
	else if(sel==1)
	{ SPI.U[ch]=SPI.XU[ch]=(unsigned int)iii*1.26;
	
	} 
}
//读三相和中线电流
void ReadI( UBYTE ch )
{
	float iii;
	unsigned long II; 
	II=spi_read_parameter(ch+0x10);
	
	if( II<=_23_bit)
		iii=(((float)II*_10_bit)/_23_bit)*KI;
	else
		iii=(((float)_24_bit-II)*_10_bit)/_23_bit*KI;     
	
	  SPI.I[ch]=(unsigned int)iii;
}
//读功率因素
void ReadFct( UBYTE ch )     //功率因素
{
	float iii;
	unsigned long Fct;
	 Fct=spi_read_parameter(ch+0x14);
	
	if( Fct<=_23_bit)
		iii=((float) Fct/_23_bit)*1000;  
	else
		iii=((float)Fct-_24_bit)/_23_bit*1000;
	
	  SPI.Factor[ch]=(int)iii;
}

void ReadFreq(void)    //读线频率
{
	float iii;
	unsigned long Freq;
	Freq=spi_read_parameter(0x1C);
	
	iii=((float)Freq*_10_bit)/_23_bit*100;  
	
	  SPI.MainF=(unsigned int)iii;
}



void ReadReal(void)
{   int i;
    Readtemp();
   //读有功功率最大最小值及其时间
   for(i=0;i<4;i++)
      {ReadACTPwr(i);
       if((i<3)&&(x>0))
         { g[i]++;
              if(g[i]<2) myNeed.NEEDACTPWR[i]=SPI.ActPwr[i];
               else    myNeed.NEEDACTPWR[i]=(myNeed.NEEDACTPWR[i]*(x-1)+SPI.ActPwr[i])/x;
             if (myNeed.NEEDACTPWR[i]>myNeed.MAXNEEDACTPWR[i]) myNeed.MAXNEEDACTPWR[i]=myNeed.NEEDACTPWR[i];
             if(g[i]>x){myNeed.NEEDACTPWR[i]=0;myNeed.MAXNEEDACTPWR[i]=0;g[i]=0;}
          }
        if(SPI.ActPwr[i]>myMAXMIN.actpwrmaxmin[i][0])
           {  myMAXMIN.actpwrmaxmin[i][0]=SPI.ActPwr[i];
              mytime.tmactpwrmaxmin[i][0]=unixtime2;
            }
        else if(SPI.ActPwr[i]<myMAXMIN.actpwrmaxmin[i][1])
           {  myMAXMIN.actpwrmaxmin[i][1]=SPI.ActPwr[i];
                mytime.tmactpwrmaxmin[i][1]=unixtime2;
           }
      }
     
     
     //读无功功率最大最小值及其时间
     for(i=0;i<4;i++)
      {ReadREAPwr(i);
        if((i<3)&&(x>0))
         { e[i]++;
              if(e[i]<2) myNeed.NEEDREAPWR[i]=SPI.ReaPwr[i];
                else    myNeed.NEEDREAPWR[i]=(myNeed.NEEDREAPWR[i]*(x-1)+SPI.ReaPwr[i])/x;
              if (myNeed.NEEDREAPWR[i]>myNeed.MAXNEEDREAPWR[i]) myNeed.MAXNEEDREAPWR[i]=myNeed.NEEDREAPWR[i];
              if(e[i]>x){myNeed.NEEDREAPWR[i]=0;myNeed.MAXNEEDREAPWR[i]=0;e[i]=0;}
         }
        if(SPI.ReaPwr[i]>myMAXMIN.reapwrmaxmin[i][0])
           {  myMAXMIN.reapwrmaxmin[i][0]=SPI.ReaPwr[i];
                 mytime.tmreapwrmaxmin[i][0]=unixtime2;     
           }
        else if(SPI.ReaPwr[i]<myMAXMIN.reapwrmaxmin[i][1])
           {  myMAXMIN.reapwrmaxmin[i][1]=SPI.ReaPwr[i];
                mytime.tmreapwrmaxmin[i][1]=unixtime2;
           }
      }
      
      //读视在功率最大最小值及其时间
      for(i=0;i<4;i++)
      {  ReadAPPPwr(i);
          if((i<3)&&(x>0))
         { f[i]++;
              if(f[i]<2) myNeed.NEEDAPPPWR[i]=SPI.AppPwr[i];
                else    myNeed.NEEDAPPPWR[i]=(myNeed.NEEDAPPPWR[i]*(x-1)+SPI.AppPwr[i])/x;
              if (myNeed.NEEDAPPPWR[i]>myNeed.MAXNEEDAPPPWR[i]) myNeed.MAXNEEDAPPPWR[i]=myNeed.NEEDAPPPWR[i];
              if(f[i]>x) {myNeed.NEEDAPPPWR[i]=0;myNeed.MAXNEEDAPPPWR[i]=0;f[i]=0;}
         } 
        if(SPI.AppPwr[i]>myMAXMIN.apppwrmaxmin[i][0])
           {  myMAXMIN.apppwrmaxmin[i][0]=SPI.AppPwr[i];
                 mytime.tmapppwrmaxmin[i][0]=unixtime2;                
            }
        else if(SPI.AppPwr[i]<myMAXMIN.apppwrmaxmin[i][1])
           {  myMAXMIN.apppwrmaxmin[i][1]=SPI.AppPwr[i];
                mytime.tmapppwrmaxmin[i][1]=unixtime2;
           }
       }
       
       
     //读电流最大最小值及其时间
     for(i=0;i<4;i++)
        {   ReadI(i);
            if((i==3)&&(sel==1)) SPI.I[3]=0;
            if((i<3)&&(x>0))
              { c[i]++;
               if(c[i]<2) myNeed.NEEDI[i]=SPI.I[i];
               else    myNeed.NEEDI[i]=(myNeed.NEEDI[i]*(x-1)+SPI.I[i])/x;
               if (myNeed.NEEDI[i]>myNeed.MAXNEEDI[i]) myNeed.MAXNEEDI[i]=myNeed.NEEDI[i];
                if (c[i]>x)
                 {myNeed.NEEDI[i]=0;myNeed.MAXNEEDI[i]=0;c[i]=0;}
              }
              
           
               
          if(SPI.I[i]>myMAXMIN.imaxmin[i][0])
             { myMAXMIN.imaxmin[i][0]=SPI.I[i];
               mytime.tmimaxmin[i][0]=unixtime2;
             }
          else if(SPI.I[i]<myMAXMIN.imaxmin[i][1])
             {  myMAXMIN.imaxmin[i][1]=SPI.I[i];
                mytime.tmimaxmin[i][1]=unixtime2;
             }
           
         }
      //读相电压和线电压的最大最小值及时间
      for(i=0;i<3;i++)
        {  ReadU(i);
               if(SPI.U[i]>myMAXMIN.umaxmin[i][0])
               { myMAXMIN.umaxmin[i][0]=SPI.U[i];
                
                 mytime.tmumaxmin[i][0]=unixtime2;
               
               }
               
               else if(SPI.U[i]<myMAXMIN.umaxmin[i][1])
               {  myMAXMIN.umaxmin[i][1]=SPI.U[i];
               
                  mytime.tmumaxmin[i][1]=unixtime2;
               
               }
            if(SPI.XU[i]>myMAXMIN.xumaxmin[i][0])
               { myMAXMIN.xumaxmin[i][0]=SPI.XU[i];
                
                 mytime.tmxumaxmin[i][0]=unixtime2;
               }
               
               else if(SPI.XU[i]<myMAXMIN.xumaxmin[i][1])
               {  myMAXMIN.xumaxmin[i][1]=SPI.XU[i];
              
                  mytime.tmxumaxmin[i][1]=unixtime2;
               }
        }
        //功率因数
        for(i=0;i<4;i++)
        {   ReadFct(i);
                 if(SPI.Factor[i]>myMAXMIN.fctmaxmin[i][0])
                     {  myMAXMIN.fctmaxmin[i][0]=SPI.Factor[i];
                         mytime.tmfctmaxmin[i][0]=unixtime2;
                     }
                 else if(SPI.Factor[i]<myMAXMIN.fctmaxmin[i][1])
                     {  myMAXMIN.fctmaxmin[i][1]=SPI.Factor[i];
                         mytime.tmfctmaxmin[i][1]=unixtime2;
                     }
        }
        ReadFreq();
        if(SPI.MainF>myMAXMIN.fmaxmin[0])
            {  myMAXMIN.fmaxmin[0]=SPI.MainF;
              mytime.tmfmaxmin[0]=unixtime2;
            }
        else if(SPI.MainF<myMAXMIN.fmaxmin[1])
            {   myMAXMIN.fmaxmin[1]=SPI.MainF;
              mytime.tmfmaxmin[1]=unixtime2;
            }
     
  }
           
       
   
  void ProcEC(void)
 { 	
		  //读输入输出有功无功电能
       SPI.r_PosEpt=spi_read_parameter(0x43)*10/3200;
       SPI.r_NegEpt=spi_read_parameter(0x47)*10/3200;
       SPI.r_AddEpt= SPI.r_PosEpt+ SPI.r_NegEpt;
       SPI.r_AddEpt= SPI.r_PosEpt- SPI.r_NegEpt;
       SPI.r_PosEqt=spi_read_parameter(0x4B)*10/3200;
       SPI.r_NegEqt=spi_read_parameter(0x4F)*10/3200;
       SPI.r_AddEqt= SPI.r_PosEqt+ SPI.r_NegEqt;
       SPI.r_DecEqt= SPI.r_PosEqt- SPI.r_NegEqt;
	    //视在电度总和
       SPI.r_Set=sqrt(SPI.r_AddEpt*SPI.r_AddEpt+SPI.r_AddEqt*SPI.r_AddEqt);
 }

⌨️ 快捷键说明

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