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

📄 ca6002.c

📁 miceteck_MPC860_BSP源码,基于VXWORK
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ca6002.c - ca6002 hardware access functions,called by main program */
/* ------- Copyright 2000-2003 AllOptic NetWorking Co.,Ltd  --------- */

/*************************************************** 
   DESCRIPTION:                
         GetCa6002State(): 读寄存器
         SetCa6002Cfsw(): 设光开关状态
         SetCa6002Laser(): 设激光器状态
         SetCa6002Switch(): 设交换端口状态
            
         2003/6/24 ESTABLISHED BY TANG.
 ***************************************************/ 

#include "ca6002.h"

unsigned ca6002_disa1=0,ca6002_disa2=0;
unsigned ca6002_sd1=0,ca6002_sd2=0,ca6002_sd3=0,ca6002_sd4=0;

unsigned CA6002_Pow1AlmLast=0,CA6002_Pow2AlmLast=0,CA6002_OsceAlmLast=0,CA6002_OscwAlmLast=0;
unsigned CA6002_AlosAlmLast1=0,CA6002_DlosAlmLast1=0,CA6002_AfauAlmLast1=0,CA6002_DfauAlmLast1=0;
unsigned CA6002_AlosAlmLast2=0,CA6002_DlosAlmLast2=0,CA6002_AfauAlmLast2=0,CA6002_DfauAlmLast2=0;

/* 读寄存器函数 */
unsigned GetCa6002State ( unsigned short RegNum )  /* RegNum为寄存器号 */
{
    unsigned Value=0,RetValue=0;             /* RetValue低8位为寄存器值 */
    if((RegNum>=0)&(RegNum<=12))
    {  
    	switch( RegNum )
        {
            case CA6002_REG_EQU_INF:	
                 RetValue = *CA6002_POI_EQU_INF >> 24;
                 break;
            case CA6002_REG_BOD_INF:	
                 RetValue = *CA6002_POI_BOD_INF >> 24;
                 break;  
            case CA6002_REG_OT1_TYP:	
                 RetValue = *CA6002_POI_OT1_TYP >> 24;
                 break; 
            case CA6002_REG_OT2_TYP:	
                 RetValue = *CA6002_POI_OT2_TYP >> 24;
                 break;
            case CA6002_REG_SYS_ALM:	
                 Value = *CA6002_POI_SYS_ALM >> 24;
                 RetValue = Value;
                 if(((Value&0x80)^CA6002_Pow1AlmLast)&CA6002_Pow1AlmLast) RetValue |= 0x40;
                 if(((Value&0x20)^CA6002_Pow2AlmLast)&CA6002_Pow2AlmLast) RetValue |= 0x10;
                 CA6002_Pow1AlmLast = (Value & 0x80); 
                 CA6002_Pow2AlmLast = (Value & 0x20);                     
                 break;
            case CA6002_REG_OT1_ALM:	
                 Value = *CA6002_POI_OT1_ALM >> 24;
                 RetValue = Value;                 
                 if(((Value&0x80)^CA6002_AlosAlmLast1)&CA6002_AlosAlmLast1) RetValue |= 0x08;
                 if(((Value&0x40)^CA6002_DlosAlmLast1)&CA6002_DlosAlmLast1) RetValue |= 0x04;
                 if(((Value&0x20)^CA6002_AfauAlmLast1)&CA6002_AfauAlmLast1) RetValue |= 0x02;
                 if(((Value&0x10)^CA6002_DfauAlmLast1)&CA6002_DfauAlmLast1) RetValue |= 0x01;
                 CA6002_AlosAlmLast1 = (Value & 0x80);
                 CA6002_DlosAlmLast1 = (Value & 0x40);
                 CA6002_AfauAlmLast1 = (Value & 0x20);
                 CA6002_DfauAlmLast1 = (Value & 0x10);                          
                 break;
            case CA6002_REG_OT2_ALM:	
                 Value = *CA6002_POI_OT2_ALM >> 24;
                 if(((Value&0x80)^CA6002_AlosAlmLast2)&CA6002_AlosAlmLast2) RetValue |= 0x08;
                 if(((Value&0x40)^CA6002_DlosAlmLast2)&CA6002_DlosAlmLast2) RetValue |= 0x04;
                 if(((Value&0x20)^CA6002_AfauAlmLast2)&CA6002_AfauAlmLast2) RetValue |= 0x02;
                 if(((Value&0x10)^CA6002_DfauAlmLast2)&CA6002_DfauAlmLast2) RetValue |= 0x01;
                 CA6002_AlosAlmLast2 = (Value & 0x80);
                 CA6002_DlosAlmLast2 = (Value & 0x40);
                 CA6002_AfauAlmLast2 = (Value & 0x20);
                 CA6002_DfauAlmLast2 = (Value & 0x10);                                 
                 break;
            case CA6002_REG_OSC_ALM:	
                 Value = *CA6002_POI_OSC_ALM >> 24;
                 RetValue = Value;
                 if(((Value&0x80)^CA6002_OsceAlmLast)&CA6002_OsceAlmLast) RetValue |= 0x40;
                 if(((Value&0x20)^CA6002_OscwAlmLast)&CA6002_OscwAlmLast) RetValue |= 0x10;
                 CA6002_OsceAlmLast = (Value & 0x80); 
                 CA6002_OscwAlmLast = (Value & 0x20);                       
                 break;
            case CA6002_REG_OSW_STA:	
                 RetValue = *CA6002_POI_OSW_STA >> 24;
                 break;
            case CA6002_REG_LAS_STA:
                 RetValue = *CA6002_POI_LAS_STA >> 24;
                 break;
            case CA6002_REG_SWI_STA:
                 RetValue = *CA6002_POI_SWI_STA >> 24;
                 break;
            case CA6002_REG_SYS_LED:
                 RetValue = *CA6002_POI_SYS_LED >> 24;
                 break;
            case CA6002_REG_OTU_LED:
                 RetValue = *CA6002_POI_OTU_LED >> 24;
                 break;
        }    
    }
    else RetValue = 0xFF;            /* 若出错,返回全1 */
    return ( RetValue );             
}

/* 延时函数 */
void SwitchTime( void )
{
    unsigned int i,j;
    for(j=0;j<1;j++)
    {
    	for(i=0;i<500;i++);
/*	
        for(i=0;i<10000;i++);
        for(i=0;i<10000;i++);
        for(i=0;i<10000;i++);
        for(i=0;i<10000;i++);                
*/
    }
}

/* 光开关控制函数 */
unsigned short SetCa6002Cfsw ( unsigned short Value )
/*
unsigned short RegNum;
*/
{

unsigned short reg;

#define SET_STA_OSW1 ( RegOswSta = RegOswSta|0x01 )
#define SET_SEL_OSW1 ( RegOswSta = RegOswSta|0x02 )
#define SET_STA_OSW2 ( RegOswSta = RegOswSta|0x04 )
#define SET_SEL_OSW2 ( RegOswSta = RegOswSta|0x08 )

#define CLR_STA_OSW1 ( RegOswSta = RegOswSta&0x0e )
#define CLR_SEL_OSW1 ( RegOswSta = RegOswSta&0x0d )
#define CLR_STA_OSW2 ( RegOswSta = RegOswSta&0x0b )
#define CLR_SEL_OSW2 ( RegOswSta = RegOswSta&0x07 )

unsigned short RegOswSta;

unsigned short WavSel;
unsigned short ModSel;
unsigned short ModSet;

if((Value>=0)&(Value<=7))
{
  /* 解析信息位 */  
  WavSel = ((Value & 0x04) >> 2);            /* 波长选择位 */
  ModSel = ((Value & 0x02) >> 1);            /* 模式选择位 */
  ModSet = (Value & 0x01);                   /* 模式设置位 */
/*
printf("%d,%d,%d\n",WavSel,ModSel,ModSet);
*/
  /* 得到当前光开关状态 */
  RegOswSta = GetCa6002State(CA6002_REG_OSW_STA);   
/*
printf("%d\n",RegOswSta);       
*/
  /* 逻辑处理 */
  if(WavSel==0)                                 /* 波长1 */
  {
      if(ModSel==0)                             /* 设置开关模式 */
          {

             if(ModSet==1)                      /* 手动 */
                 {               
                    SET_SEL_OSW1;
/*
printf("%d\n",RegOswSta); 
*/
                    *CA6002_POI_OSW_STA = RegOswSta<<8;
                    
                    SwitchTime();               /* 延时10us */
/*
reg=GetCa6002State(REG_OSW_STA);
printf("%d\n",reg);
*/                    
                    /* 设置成功返回TRUE,否则返回FALSE */ 
                    if((GetCa6002State(CA6002_REG_OSW_STA)&0x2)==0x2)
                        return(TRUE);
                    else 
                        return(FALS);
                 }
             else                               /* 自动 */
                 {
                    CLR_SEL_OSW1;
                    *CA6002_POI_OSW_STA = RegOswSta<<8;
                    
                    SwitchTime();               /* 延时10us */
                  
                    /* 设置成功返回TRUE,否则返回FALSE */ 
                    if((GetCa6002State(CA6002_REG_OSW_STA)&0x2)==0)
                        return(TRUE);
                    else 
                        return(FALS);                    
                 }
           }
       else                                     /* 设置接收通道 */
           {
             if((RegOswSta&0x2)==0x2)           /* 在开关模式已设为手动时才操作 */
             { 
               if(ModSet==1)                    /* 通道B */
                   {               
                      SET_STA_OSW1;
                      *CA6002_POI_OSW_STA = RegOswSta<<8;
                      
                      SwitchTime();             /* 延时10us */
                      
                      /* 设置成功返回TRUE,否则返回FALSE */ 
                      if((GetCa6002State(CA6002_REG_OSW_STA)&0x1)==0x1)
                          return(TRUE);
                      else 
                          return(FALS);                            
                   }
               else                             /* 通道A */
                   {
                      CLR_STA_OSW1;
                      *CA6002_POI_OSW_STA = RegOswSta<<8; 
                      
                      SwitchTime();             /* 延时10us */
                      
                      /* 设置成功返回TRUE,否则返回FALSE */ 
                      if((GetCa6002State(CA6002_REG_OSW_STA)&0x1)==0)
                          return(TRUE);
                      else 
                          return(FALS);                             
                   }           
             }
             else return(FALS);
           }  
  }
  else                                          /* 波长2 */
  {
      if(ModSel==0)                             /* 设置开关模式 */

⌨️ 快捷键说明

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