📄 sharereg.c
字号:
/* CA6004.c and CA6002.c share this file */
/***********AllOptic Networking***********/
/*
DESCRIPTION:
MPC860 parallel I/O application for OpticPower read,Eeprom read/write and GBIC read.
FUNCTIONS(these functions are shared by ca6004.c and ca6002.c):
I2CREAD() : 读KS8999'EERPROM
I2CWRITE() : 写KS8999'EERPROM
GbicRead() : 读GBIC'EEPROM
GetOptiPower() : 返回光功率A/D转换结果
GetGbicTemp() : 返回GBIC激光器工作温度
GetGbicCurrent() : 返回GBIC激光器偏置电流
GetGbicTxPower() : 返回GBIC激光器发送光功率
GetGbicRxPower() : 返回GBIC接收光功率
RST8999() : 复位KS8999
established by TANG in 6/25/2003
*/
#include <shareReg.h>
#include <math.h>
/*
Ks8999 eeprom read/write functions.
Read function:I2CREAD(),write function:I2CWRITE()
Hardware connection:I2CSDA -- PC8, I2CSCL -- PC7
*/
int immr,ack;
void I2Cinit(void)
{
immr = vxImmrGet();
*PCPAR(immr) &= 0xfe7f;
*PCDIR(immr) |= 0x0180;
*PCSO(immr) &= 0xfe7f;
*PCINT(immr) &= 0xfe7f;
*CIMR(immr) &= 0xfffff9ff;
/*
printf("Initial I2C line over.\n");
*/
}
void I2Cdisa(void)
{
immr = vxImmrGet();
*PCPAR(immr) &= 0xfe7f;
*PCDIR(immr) &= 0xfe7f;
*PCSO(immr) &= 0xfe7f;
*PCINT(immr) &= 0xfe7f;
*CIMR(immr) &= 0xfffff9ff;
/*
printf("Disable I2C line over.\n");
*/
}
void I2Cnop(cycle)
int cycle;
{
int i,j;
for(j=0;j<cycle;j++)
{
for(i=0;i<0x100;i++);
}
}
void I2Cstart(void)
{
DATHI;
CLKHI;
I2Cnop(1);
DATLO;
I2Cnop(3);
CLKLO;
I2Cnop(1);
}
void I2Cstop(void)
{
CLKHI;
I2Cnop(1);
DATLO;
I2Cnop(1);
DATHI;
I2Cnop(1);
}
void I2Cack(void)
{
int i;
*PCDIR(immr) &= 0xff7f;
CLKHI;
I2Cnop();
for(i=0;i<0x100;i++)
{
ack = (*PCDAT(immr) & 0x0080);
if(ack==0) break;
}
I2Cnop(4);
CLKLO;
*PCDIR(immr) |= 0x0080;
}
void I2Cclock(void)
{
I2Cnop(1);
CLKHI;
I2Cnop(1);
CLKLO;
}
unsigned char I2CREAD(unsigned short addr)
{
int i;
unsigned char data,dbuf;
I2Cinit();
I2Cstart();
data = WRITEADD;
for(i=0;i<8;i++)
{
if(data&0x80)
DATHI;
else
DATLO;
I2Cclock();
data = data << 1;
}
DATHI;
I2Cack();
data = addr;
for(i=0;i<8;i++)
{
if(data&0x80)
DATHI;
else
DATLO;
I2Cclock();
data = data << 1;
}
DATHI;
I2Cack();
I2Cstart();
data = READADD;
for(i=0;i<8;i++)
{
if(data&0x80)
DATHI;
else
DATLO;
I2Cclock();
data = data << 1;
}
DATHI;
I2Cack();
I2Cnop(1);
*PCDIR(immr) &= 0xff7f;
dbuf = 0;
for(i=0;i<8;i++)
{
I2Cnop();
CLKHI;
if(*PCDAT(immr) & 0x0080)
dbuf = (dbuf << 1) + 1;
else
dbuf = (dbuf << 1);
I2Cnop();
CLKLO;
}
data = dbuf;
*PCDIR(immr) |= 0x0080;
/*
printf("The data in addrss %d is: 0x%x\n",addr,data);
*/
I2Cdisa();
return(data);
}
void I2CWRITE(unsigned short addr,unsigned char data)
{
int i;
unsigned char tdata,data_buf,addr_buf;
data_buf = data;
addr_buf = addr;
I2Cinit();
I2Cstart();
tdata = WRITEADD;
for(i=0;i<8;i++)
{
if(tdata&0x80)
DATHI;
else
DATLO;
I2Cclock();
tdata = tdata << 1;
}
DATHI;
I2Cack();
tdata = addr;
for(i=0;i<8;i++)
{
if(tdata&0x80)
DATHI;
else
DATLO;
I2Cclock();
tdata = tdata << 1;
}
DATHI;
I2Cack();
tdata = data;
for(i=0;i<8;i++)
{
if(tdata&0x80)
DATHI;
else
DATLO;
I2Cclock();
tdata = tdata << 1;
}
DATHI;
I2Cack();
I2Cstop();
/*
if(data_buf == I2CREAD(addr_buf))
printf("Write data 0x%x to address %d success!\n",data_buf,addr_buf);
else
printf("Write data 0x%x to address %d error!\n",data_buf,addr_buf);
*/
I2Cdisa();
}
/*
Ks8999 reset function:RST8999().
Hardware connection:RST8999 -- PC9.
*/
void RST8999(void)
{
int i,j;
immr = vxImmrGet();
*PCPAR(immr) &= 0xffbf;
*PCDIR(immr) |= 0x0040;
*PCSO(immr) &= 0xffbf;
*PCINT(immr) &= 0xffbf;
*PCDAT(immr) |= 0x0040;
for(j=0;j<1;j++)
{
for(i=0;i<5000;i++);
}
*PCDAT(immr) &= 0xffbf;
for(j=0;j<10;j++)
{
for(i=0;i<5000;i++);
}
*PCDAT(immr) |= 0x0040;
/*
printf("Reset ks8999 over!\n");
*/
}
/*
OpticPower read function:GetOptiPower().
Hardware connection:
AD_D[7..1] -- PA[13..7],AD_D0 -- PA5,AD_CS -- PA0,
AD_WR -- PA1,AD_RD -- PA2,HBEN -- PA3
*/
int GetOptiPower( unsigned short PIN_NUM )
{
unsigned short Value=0,Buffer1=0,Buffer2=0,i;
int logValue=0;
immr = vxImmrGet();
if((PIN_NUM >= 1)&(PIN_NUM <= 8))
{
*PAPAR(immr) &= 0x0A03;
*PAODR(immr) &= 0x0002;
ADWRSTART;
ADCSLO;
ADWRLO;
ADNOP;
switch(PIN_NUM)
{
case 1:PIN1START;break;
case 2:PIN2START;break;
case 3:PIN3START;break;
case 4:PIN4START;break;
case 5:PIN5START;break;
case 6:PIN6START;break;
case 7:PIN7START;break;
case 8:PIN8START;break;
}
ADNOP;
ADWRHI;
ADCSHI;
ADNOP;
ADNOP;
ADRDSTART;
HBENLO;
ADCSLO;
ADRDLO;
ADNOP;
Buffer1 = *PADAT(immr);
ADNOP;
Buffer1 &= 0x05FC;
/*
printf("%d\n",Buffer1);
*/
HBENHI;
ADNOP;
Buffer2 = *PADAT(immr);
ADNOP;
Buffer2 &= 0x05FC;
/*
printf("%d\n",Buffer2);
*/
ADRDHI;
ADCSHI;
if(Buffer1&0x0400) Value|=0x0001;else Value&=~0x0001;
if(Buffer1&0x0100) Value|=0x0002;else Value&=~0x0002;
if(Buffer1&0x0080) Value|=0x0004;else Value&=~0x0004;
if(Buffer1&0x0040) Value|=0x0008;else Value&=~0x0008;
if(Buffer1&0x0020) Value|=0x0010;else Value&=~0x0010;
if(Buffer1&0x0010) Value|=0x0020;else Value&=~0x0020;
if(Buffer1&0x0008) Value|=0x0040;else Value&=~0x0040;
if(Buffer1&0x0004) Value|=0x0080;else Value&=~0x0080;
if(Buffer2&0x0400) Value|=0x0100;else Value&=~0x0100;
if(Buffer2&0x0100) Value|=0x0200;else Value&=~0x0200;
if(Buffer2&0x0080) Value|=0x0400;else Value&=~0x0400;
if(Buffer2&0x0040) Value|=0x0800;else Value&=~0x0800;
Value = Value & 0x0FFF;
logValue = (10*log10(Value)-54);
/*
if((logValue<=-32)&&(logValue>=-38)) logValue=logValue+1;
*/
if(logValue<=-40) logValue=-40;
if(logValue>=-18) logValue=-18;
logValue += 15;
}
else
Value = 0xFFFF;
/* printf("The OpticPower is %ddBm.\n",logValue);*/
return( logValue ); /* 返回光功率dBm值,返回值范围-3~-25dBm */
}
/*
GBIC I2C channel controled by PCA9518.
GBIC read function:GbicRead().
Hardware connection:
SCL0 -- PB15,SDA0 -- PB16,EN11 -- PB17,EN12 -- PB18,EN13 -- PB20,
EN14 -- PB21,EN21 -- PC12,EN22 -- PC13,EN23 -- PC14 EN24 -- PC15.
*/
int gbici2cack=1;
void GBICI2Cinit(void)
{
*PBPAR(immr) &= 0xfffe13ff;
*PCPAR(immr) &= 0xfff0;
*PBDIR(immr) |= 0x0001ec00;
*PCDIR(immr) |= 0x000f;
*PCSO(immr) &= 0xfff0;
*CIMR(immr) &= 0x7a7fffff;
}
void GBICI2Cnop(cycle)
int cycle;
{
int i,j;
for(j=0;j<cycle;j++)
{
for(i=0;i<0x100;i++);
}
}
void GBICI2Cstart(void)
{
GBICDATHI;
GBICCLKHI;
GBICI2Cnop(1);
GBICDATLO;
GBICI2Cnop(3);
GBICCLKLO;
GBICI2Cnop(1);
}
void GBICI2Cstop(void)
{
GBICCLKHI;
GBICI2Cnop(1);
GBICDATLO;
GBICI2Cnop(1);
GBICDATHI;
GBICI2Cnop(1);
}
void GBICI2Cack(void)
{
int i;
GBICDATIN;
GBICCLKHI;
GBICI2Cnop(1);
for(i=0;i<0x100;i++)
{
gbici2cack = (*PBDAT(immr) & 0x00008000);
if(gbici2cack==0) break;
}
GBICI2Cnop(4);
GBICCLKLO;
GBICDATOU;
gbici2cack=1;
}
void GBICI2Cclock(void)
{
GBICI2Cnop(1);
GBICCLKHI;
GBICI2Cnop(1);
GBICCLKLO;
}
void GBICsel(boardnum,gbicnum)
unsigned short boardnum,gbicnum;
{
switch( boardnum )
{
case 1:
if( gbicnum == 1 )
{
GBICDIS12;
GBICDIS13;
GBICDIS14;
GBICDIS21;
GBICDIS22;
GBICDIS23;
GBICDIS24;
GBICENA11;
}
if( gbicnum == 2 )
{
GBICDIS11;
GBICDIS12;
GBICDIS13;
GBICDIS14;
GBICDIS22;
GBICDIS23;
GBICDIS24;
GBICENA21;
}
break;
case 2:
if( gbicnum == 1 )
{
GBICDIS11;
GBICDIS13;
GBICDIS14;
GBICDIS21;
GBICDIS22;
GBICDIS23;
GBICDIS24;
GBICENA12;
}
if( gbicnum == 2 )
{
GBICDIS11;
GBICDIS12;
GBICDIS13;
GBICDIS14;
GBICDIS21;
GBICDIS23;
GBICDIS24;
GBICENA22;
}
break;
case 3:
if( gbicnum == 1 )
{
GBICDIS11;
GBICDIS12;
GBICDIS14;
GBICDIS21;
GBICDIS22;
GBICDIS23;
GBICDIS24;
GBICENA13;
}
if( gbicnum == 2 )
{
GBICDIS11;
GBICDIS12;
GBICDIS13;
GBICDIS14;
GBICDIS21;
GBICDIS22;
GBICDIS24;
GBICENA23;
}
break;
case 4:
if( gbicnum == 1 )
{
GBICDIS11;
GBICDIS12;
GBICDIS13;
GBICDIS21;
GBICDIS22;
GBICDIS23;
GBICDIS24;
GBICENA14;
}
if( gbicnum == 2 )
{
GBICDIS11;
GBICDIS12;
GBICDIS13;
GBICDIS14;
GBICDIS21;
GBICDIS22;
GBICDIS23;
GBICENA24;
}
break;
}
}
int GbicRead(unsigned short board,unsigned short gbic,unsigned short addr)
{
int i;
int data,dataL,dbuf;
immr = vxImmrGet();
GBICI2Cinit();
GBICsel(board,gbic);
GBICI2Cstart();
data = GBICWRITADD;
for(i=0;i<8;i++)
{
if(data&0x80)
GBICDATHI;
else
GBICDATLO;
GBICI2Cclock();
data = data << 1;
}
GBICDATHI;
GBICI2Cack();
data = addr;
for(i=0;i<8;i++)
{
if(data&0x80)
GBICDATHI;
else
GBICDATLO;
GBICI2Cclock();
data = data << 1;
}
GBICDATHI;
GBICI2Cack();
GBICI2Cstart();
data = GBICREADADD;
for(i=0;i<8;i++)
{
if(data&0x80)
GBICDATHI;
else
GBICDATLO;
GBICI2Cclock();
data = data << 1;
}
GBICDATHI;
GBICI2Cack();
GBICI2Cnop(1);
GBICDATIN;
dbuf = 0;
for(i=0;i<8;i++)
{
GBICI2Cnop(1);
GBICCLKHI;
if(*PBDAT(immr) & 0x00008000)
dbuf = (dbuf << 1) + 1;
else
dbuf = (dbuf << 1);
GBICI2Cnop(1);
GBICCLKLO;
}
data = dbuf;
if((addr<=154)&(addr>=140))
{
GBICI2Cnop(1);
GBICI2Cack();
GBICDATIN;
dbuf = 0;
for(i=0;i<8;i++)
{
GBICI2Cnop(1);
GBICCLKHI;
if(*PBDAT(immr) & 0x00008000)
dbuf = (dbuf << 1) + 1;
else
dbuf = (dbuf << 1);
GBICI2Cnop(1);
GBICCLKLO;
}
dataL = dbuf;
data = (data<<8)|dataL;
}
GBICDATOU;
/*
printf("The data in addrss %d is: 0x%x\n",addr,data);
*/
return(data);
}
/*
GBIC read functions for temperature,current and opticPower:
Temperature read function:GetGbicTemp();
Current read function:GetGbicCurrent();
TxPower read function:GetGbicTxPower();
RxPower read function:GetGbicRxPower();
*/
#include <temprature.c>
double GetGbicTemp(unsigned short board,unsigned short gbic)
{
int temp,ad2,ad3,ad1,cal1_H,cal1_L,cal2_H,cal2_L,temp1_H,temp1_L,temp2_H,temp2_L;
double tempbuf;
if((board<1)|(board>4)|(gbic<1)|(gbic>2)) return(FALS);
temp = GbicRead(board,gbic,GET_TEMP);
ad2 = GbicRead(board,gbic,GET_AD2);
ad3 = GbicRead(board,gbic,GET_AD3);
ad1 = GbicRead(board,gbic,GET_AD1);
cal1_H = GbicRead(board,gbic,GET_CAL1_HI);
cal1_L = GbicRead(board,gbic,GET_CAL1_LO);
cal2_H = GbicRead(board,gbic,GET_CAL2_HI);
cal2_L = GbicRead(board,gbic,GET_CAL2_LO);
temp1_H = GbicRead(board,gbic,GET_TEMP1_HI);
temp1_L = GbicRead(board,gbic,GET_TEMP1_LO);
temp2_H = GbicRead(board,gbic,GET_TEMP2_HI);
temp2_L = GbicRead(board,gbic,GET_TEMP2_LO);
/*
tempbuf = temprature(temp,ad2,ad3,ad1,cal1_H,cal1_L,cal2_H,cal2_L,temp1_H,temp1_L,temp2_H,temp2_L);
*/
tempbuf = temprature(184,189,25,191,49372,124,58335,6527,47925,3455,29198,29814);
/*
printf("The laser temprature is %f~C.\n",tempbuf);
*/
return(tempbuf);
}
double GetGbicCurrent(unsigned short board,unsigned short gbic)
{
}
double GetGbicTxPower(unsigned short board,unsigned short gbic)
{
}
double GetGbicRxPower(unsigned short board,unsigned short gbic)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -