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

📄 sharereg.c

📁 miceteck_MPC860_BSP源码,基于VXWORK
💻 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 + -