📄 spi.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 + -