?? ca6002.c
字號:
/* 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 + -