Files
RC/SwDriver.C
2025-10-21 20:34:06 +08:00

497 lines
24 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "MAIN.h"
//*****************************************************************************
//数据结构
//*****************************************************************************
//每个33993的开关命令状态由于掉电或者干扰导致33993内部复位时可以用该状态恢复。
struct StaMc33993CmdSet
{
unsigned char CmdSetting ;
unsigned char CmdInt_Sp ;
unsigned int CmdInt_Sg ;
unsigned char CmdMetallic_Sp ;
unsigned int CmdMetallic_Sg ;
unsigned char CmdWetCurr_Sp ;
unsigned int CmdWetCurr_Sg ;
unsigned char CmdTriState_Sp ;
unsigned int CmdTriState_Sg ;
unsigned char CmdAnalog ;
};
//33993的开关状态可以采用字节访问也可以按位访问//XC886不一样修改
union ByteBitAccess
{
struct
{
ubyte SoMc33993Byte1;
ubyte SoMc33993Byte0;
ubyte SoMc33993Byte3;
ubyte SoMc33993Byte2;
}ByteData;
struct
{
unsigned int FlgSg0 : 1;
unsigned int FlgSg1 : 1;
unsigned int FlgSg2 : 1;
unsigned int FlgSg3 : 1;
unsigned int FlgSg4 : 1;
unsigned int FlgSg5 : 1;
unsigned int FlgSg6 : 1;
unsigned int FlgSg7 : 1;
unsigned int FlgSg8 : 1;
unsigned int FlgSg9 : 1;
unsigned int FlgSg10 : 1;
unsigned int FlgSg11 : 1;
unsigned int FlgSg12 : 1;
unsigned int FlgSg13 : 1;
unsigned int FlgSp0 : 1;
unsigned int FlgSp1 : 1;
unsigned int FlgSp2 : 1;
unsigned int FlgSp3 : 1;
unsigned int FlgSp4 : 1;
unsigned int FlgSp5 : 1;
unsigned int FlgSp6 : 1;
unsigned int FlgSp7 : 1;
unsigned int FlgInt : 1;
unsigned int FlgThem : 1;
unsigned int : 8;
}BitData;
};
//33993的开关状态可以采用字节访问也可以按位访问
union WordByteBitAccess
{
uword StaSg;
struct
{
ubyte StaSgH;
ubyte StaSgL;
}ByteData;
struct
{
unsigned int FlgSg0_FlgSp0 : 1;
unsigned int FlgSg1_FlgSp1 : 1;
unsigned int FlgSg2_FlgSp2 : 1;
unsigned int FlgSg3_FlgSp3 : 1;
unsigned int FlgSg4_FlgSp4 : 1;
unsigned int FlgSg5_FlgSp5 : 1;
unsigned int FlgSg6_FlgSp6 : 1;
unsigned int FlgSg7_FlgSp7 : 1;
unsigned int FlgSg8 : 1;
unsigned int FlgSg9 : 1;
unsigned int FlgSg10 : 1;
unsigned int FlgSg11 : 1;
unsigned int FlgSg12 : 1;
unsigned int FlgSg13 : 1;
unsigned int : 1;
unsigned int : 1;
}BitData;
};
//*****************************************************************************
//全局变量
//*****************************************************************************
static struct StaMc33993CmdSet PntSta[2] = {0};
//*****************************************************************************
//本文件全局函数声明
//*****************************************************************************
bit Mc33993StaRcvOneBit(ubyte NumMc,ubyte Sp0ToSg13);
ubyte Mc33993CmdSendOneBit(ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13,bit Status);
void InitMc33993Sec(void);
void ToggleOneBit(ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13);
union ByteBitAccess *Mc33993CmdSend(ubyte NumMc,ubyte CmdBit,ubyte SetBitH,ubyte SetBitL);
////****************************************************************************
//// @Function ubyte Mc33993AnalogChSel(struct StaMc33993CmdSet *PntSta,ubyte NumMc,ubyte Mode,ubyte Channal)
////
////----------------------------------------------------------------------------
//// @Description 模拟通道选择、模式选择
////
////----------------------------------------------------------------------------
//// @Returnvalue 通道切换成功返回1
//// Mode,高阻2mA16mA
////----------------------------------------------------------------------------
//// @Parameters None
////
////----------------------------------------------------------------------------
//// @Date 2008-12-2
////
////****************************************************************************
//ubyte Mc33993AnalogChSel(ubyte NumMc,ubyte Mode,ubyte Channal)
//{
// union WordByteBitAccess RcvSoMc33993;
////----------------------------------------------------------------------------
// if(NumMc > (NumChipSw-1))NumMc = (NumChipSw-1); //多余NumChipSw片
// RcvSoMc33993.ByteData.StaSgL = 0;
// RcvSoMc33993.ByteData.StaSgL = (RcvSoMc33993.ByteData.StaSgL | Channal);
// switch(Mode)
// {
// case DF_AN_HIMP:
// RcvSoMc33993.BitData.FlgSg6_FlgSp6 = 0;//该两位决定选择哪种模式
// RcvSoMc33993.BitData.FlgSg5_FlgSp5 = 0;
// break;
// case DF_AN_2MA:
// RcvSoMc33993.BitData.FlgSg6_FlgSp6 = 0;
// RcvSoMc33993.BitData.FlgSg5_FlgSp5 = 1;
// break;
// case DF_AN_16MA:
// RcvSoMc33993.BitData.FlgSg6_FlgSp6 = 1;
// RcvSoMc33993.BitData.FlgSg5_FlgSp5 = 0;
// break;
// default:
// RcvSoMc33993.BitData.FlgSg6_FlgSp6 = 0;
// RcvSoMc33993.BitData.FlgSg5_FlgSp5 = 0;
// }
// Mc33993CmdSend(NumMc,DF_CMDANALOG,RcvSoMc33993.ByteData.StaSgH,RcvSoMc33993.ByteData.StaSgL);
//
// (*(PntSta+NumMc)).CmdAnalog = RcvSoMc33993.ByteData.StaSgL;//保存命令状态
//
// return 1;
//}
//---------------------------------------------------
//*****************************************************************************
//函数
//*****************************************************************************
////****************************************************************************
//// @Function void SwStaSample(UnSwSample *ptmp,ubyte NumSampleChip)
////
////----------------------------------------------------------------------------
//// @Description 采集33993的开关信号。
////
////----------------------------------------------------------------------------
//// @Returnvalue None
////
////----------------------------------------------------------------------------
//// @Parameters ptmp存放数据结构体指针NumSampleChip33993芯片数量
////
////----------------------------------------------------------------------------
//// @Date 2008-12-2
////
////****************************************************************************
void SwStaSample(UnSwSample *ptmp)
{
union ByteBitAccess *pStaSwIn;
uword i,k;
//----初始化------------------------------------------------------------------------
InitMc33993Sec();//一个大循环必须调用一次这样就算12V掉电或33993复位马上可以恢复。
//初始化用作采集的IO
for(i=0;i<DF_SwInNum;i++)
{
for(k=0;k<10;k++);
// Mc33993CmdSend(i,DF_CMDTRISTATE_SP,0,0); //0禁止三态输出24V 对于KGF模块直接采集不用改变开关状态
// Mc33993CmdSend(i,DF_CMDTRISTATE_SG,0,0); //0禁止三态输出24V 对于KGF模块直接采集不用改变开关状态
// Mc33993CmdSendOneBit(DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP0 ,D24V);
//开关采集
pStaSwIn = Mc33993CmdSend(i,DF_CMDSWSTATUS,0xff,0xff);
(*ptmp).ArrData.Arr[i][0] = (*pStaSwIn).ByteData.SoMc33993Byte1;
(*ptmp).ArrData.Arr[i][1] = (*pStaSwIn).ByteData.SoMc33993Byte0;
(*ptmp).ArrData.Arr[i][2] = 0x0;//20130706修改否则容易出现没有开关变化也会发送的问题。
(*ptmp).ArrData.Arr[i][3] = (*pStaSwIn).ByteData.SoMc33993Byte2;
}
}
//****************************************************************************
// @Function void LedLight(UnSwOut *tmpUn)
//
//----------------------------------------------------------------------------
// @Description 根据缓存内容点亮响应LED。
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters tmpUn存放LED的状态1表示需要点亮
//
//----------------------------------------------------------------------------
// @Date 2008-12-2
//
////****************************************************************************
void LedLight(UnSwOut *tmpUn)
{
ubyte i,j;
//----------------------------------------------------------------------------
// InitMc33993Sec();
for(i=0;i<DF_SwOutNum;i++)
{
for(j=0;j<22;j++)
{
switch(j)
{
case 0 :if(((((*tmpUn).ArrData.Arr[i][1])>>0 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP0 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP0 ,Gnd);break;
case 1 :if(((((*tmpUn).ArrData.Arr[i][1])>>1 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP1 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP1 ,Gnd);break;
case 2 :if(((((*tmpUn).ArrData.Arr[i][1])>>2 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP2 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP2 ,Gnd);break;
case 3 :if(((((*tmpUn).ArrData.Arr[i][1])>>3 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP3 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP3 ,Gnd);break;
case 4 :if(((((*tmpUn).ArrData.Arr[i][1])>>4 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP4 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP4 ,Gnd);break;
case 5 :if(((((*tmpUn).ArrData.Arr[i][1])>>5 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP5 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP5 ,Gnd);break;
case 6 :if(((((*tmpUn).ArrData.Arr[i][1])>>6 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP6 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP6 ,Gnd);break;
case 7 :if(((((*tmpUn).ArrData.Arr[i][1])>>7 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP7 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SP,DF_FLGSP7 ,Gnd);break;
case 8 :if(((((*tmpUn).ArrData.Arr[i][0])>>0 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG0 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG0 ,Gnd);break;
case 9 :if(((((*tmpUn).ArrData.Arr[i][0])>>1 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG1 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG1 ,Gnd);break;
case 10:if(((((*tmpUn).ArrData.Arr[i][0])>>2 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG2 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG2 ,Gnd);break;
case 11:if(((((*tmpUn).ArrData.Arr[i][0])>>3 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG3 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG3 ,Gnd);break;
case 12:if(((((*tmpUn).ArrData.Arr[i][0])>>4 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG4 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG4 ,Gnd);break;
case 13:if(((((*tmpUn).ArrData.Arr[i][0])>>5 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG5 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG5 ,Gnd);break;
case 14:if(((((*tmpUn).ArrData.Arr[i][0])>>6 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG6 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG6 ,Gnd);break;
case 15:if(((((*tmpUn).ArrData.Arr[i][0])>>7 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG7 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG7 ,Gnd);break;
case 16:if(((((*tmpUn).ArrData.Arr[i][3])>>0 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG8 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG8 ,Gnd);break;
case 17:if(((((*tmpUn).ArrData.Arr[i][3])>>1 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG9 ,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG9 ,Gnd);break;
case 18:if(((((*tmpUn).ArrData.Arr[i][3])>>2 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG10,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG10,Gnd);break;
case 19:if(((((*tmpUn).ArrData.Arr[i][3])>>3 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG11,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG11,Gnd);break;
case 20:if(((((*tmpUn).ArrData.Arr[i][3])>>4 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG12,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG12,Gnd);break;
case 21:if(((((*tmpUn).ArrData.Arr[i][3])>>5 )&0x01) == 1)Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG13,D24V);else Mc33993CmdSendOneBit(i+DF_SwInNum,DF_CMDTRISTATE_SG,DF_FLGSG13,Gnd);break;
default:;
}
}
}
}
//****************************************************************************
// @Function void InitMc33993Sec(struct StaMc33993CmdSet *PntSta)
//
//----------------------------------------------------------------------------
// @Description 所有MC33993二次初始化也就是每次操作33993时都用之前的状态初始化
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters MC33993状态存储结构体指针PntSta
//
//----------------------------------------------------------------------------
// @Date 2008-12-2
//
//****************************************************************************
void InitMc33993Sec(void)
{
ubyte i;
for(i=DF_SwInNum;i<NumChipSw;i++)
{
Mc33993CmdSend(i,DF_CMDSETTING, 0, (*(PntSta+i)).CmdSetting); //1开关到电源
Mc33993CmdSend(i,DF_CMDINT_SP, 0, (*(PntSta+i)).CmdInt_Sp ); //1关闭中断
Mc33993CmdSend(i,DF_CMDINT_SG, (ubyte)((((*(PntSta+i)).CmdInt_Sg) >>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdInt_Sg)&0x00ff)); //1关闭中断
Mc33993CmdSend(i,DF_CMDMETALLIC_SP, 0, (*(PntSta+i)).CmdMetallic_Sp); //02mA
Mc33993CmdSend(i,DF_CMDMETALLIC_SG, (ubyte)((((*(PntSta+i)).CmdMetallic_Sg)>>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdMetallic_Sg)&0x00ff)); //02mA
Mc33993CmdSend(i,DF_CMDANALOG, 0, (*(PntSta+i)).CmdAnalog); //0不选择任何通道
Mc33993CmdSend(i,DF_CMDWETCURR_SP, 0, (*(PntSta+i)).CmdWetCurr_Sp); //0湿电流定时器关闭
Mc33993CmdSend(i,DF_CMDWETCURR_SG, (ubyte)((((*(PntSta+i)).CmdWetCurr_Sg) >>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdWetCurr_Sg)&0x00ff)); //0湿电流定时器关闭
Mc33993CmdSend(i,DF_CMDTRISTATE_SP, 0, (*(PntSta+i)).CmdTriState_Sp); //0禁止三态
Mc33993CmdSend(i,DF_CMDTRISTATE_SG, (ubyte)((((*(PntSta+i)).CmdTriState_Sg)>>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdTriState_Sg)&0x00ff)); //0使能三态
}
}
//****************************************************************************
// @Function void InitMc33993(struct StaMc33993CmdSet *PntSta)
//
//----------------------------------------------------------------------------
// @Description 所有MC33993在单片机上电时初始化
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2008-12-2
//
//****************************************************************************
void InitSW(void)
{
ubyte i;
for(i=0;i<NumChipSw;i++)
{
Mc33993CmdSend(i,DF_CMDSETTING,0,0); //0开关到地
Mc33993CmdSend(i,DF_CMDINT_SP,0,0xff); //1关闭中断
Mc33993CmdSend(i,DF_CMDINT_SG,0x3f,0xff); //1关闭中断
Mc33993CmdSend(i,DF_CMDMETALLIC_SP,0,0); //02mA
Mc33993CmdSend(i,DF_CMDMETALLIC_SG,0,0); //02mA
Mc33993CmdSend(i,DF_CMDANALOG,0,0); //0不选择任何通道
Mc33993CmdSend(i,DF_CMDWETCURR_SP,0,0); //0湿电流定时器关闭
Mc33993CmdSend(i,DF_CMDWETCURR_SG,0,0); //0湿电流定时器关闭
Mc33993CmdSend(i,DF_CMDTRISTATE_SP,0xff,0xff); //0禁止三态
Mc33993CmdSend(i,DF_CMDTRISTATE_SG,0xff,0xff); //0禁止三态
}
}
//****************************************************************************
// @Function ubyte Mc33993CmdSendOneBit(struct StaMc33993CmdSet *PntSta,ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13,bit Status)
//
//----------------------------------------------------------------------------
// @Description 写MC33993任意位调用Mc33993CmdSend(NumMc,CmdBit,RcvSoMc33993.ByteData.StaSgH,RcvSoMc33993.ByteData.StaSgL);
//
//----------------------------------------------------------------------------
// @Returnvalue 成功返回1
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2008-12-2
//
//****************************************************************************
ubyte Mc33993CmdSendOneBit(ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13,bit Status)
{
union WordByteBitAccess RcvSoMc33993;
//----------------------------------------------------------------------------
if(NumMc > (NumChipSw-1))NumMc = (NumChipSw-1);
switch(CmdBit)
{
//DF_CMDTRISTATE_SP
case DF_CMDTRISTATE_SP:
RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdTriState_Sp;
if(Sp0ToSg13 == DF_FLGSP7)RcvSoMc33993.BitData.FlgSg7_FlgSp7 = Status;
else if(Sp0ToSg13 == DF_FLGSP6)RcvSoMc33993.BitData.FlgSg6_FlgSp6 = Status;
else if(Sp0ToSg13 == DF_FLGSP5)RcvSoMc33993.BitData.FlgSg5_FlgSp5 = Status;
else if(Sp0ToSg13 == DF_FLGSP4)RcvSoMc33993.BitData.FlgSg4_FlgSp4 = Status;
else if(Sp0ToSg13 == DF_FLGSP3)RcvSoMc33993.BitData.FlgSg3_FlgSp3 = Status;
else if(Sp0ToSg13 == DF_FLGSP2)RcvSoMc33993.BitData.FlgSg2_FlgSp2 = Status;
else if(Sp0ToSg13 == DF_FLGSP1)RcvSoMc33993.BitData.FlgSg1_FlgSp1 = Status;
else if(Sp0ToSg13 == DF_FLGSP0)RcvSoMc33993.BitData.FlgSg0_FlgSp0 = Status;
else ;
Mc33993CmdSend(NumMc,CmdBit,RcvSoMc33993.ByteData.StaSgH,RcvSoMc33993.ByteData.StaSgL);
//(*(PntSta+NumMc)).CmdTriState_Sp = RcvSoMc33993.ByteData.StaSgL;
break;
//DF_CMDTRISTATE_SG
case DF_CMDTRISTATE_SG:
RcvSoMc33993.StaSg = (*(PntSta+NumMc)).CmdTriState_Sg;
if(Sp0ToSg13 == DF_FLGSG13) RcvSoMc33993.BitData.FlgSg13 = Status;
else if(Sp0ToSg13 == DF_FLGSG12) RcvSoMc33993.BitData.FlgSg12 = Status;
else if(Sp0ToSg13 == DF_FLGSG11) RcvSoMc33993.BitData.FlgSg11 = Status;
else if(Sp0ToSg13 == DF_FLGSG10) RcvSoMc33993.BitData.FlgSg10 = Status;
else if(Sp0ToSg13 == DF_FLGSG9 ) RcvSoMc33993.BitData.FlgSg9 = Status;
else if(Sp0ToSg13 == DF_FLGSG8 ) RcvSoMc33993.BitData.FlgSg8 = Status;
else if(Sp0ToSg13 == DF_FLGSG7 ) RcvSoMc33993.BitData.FlgSg7_FlgSp7 = Status;
else if(Sp0ToSg13 == DF_FLGSG6 ) RcvSoMc33993.BitData.FlgSg6_FlgSp6 = Status;
else if(Sp0ToSg13 == DF_FLGSG5 ) RcvSoMc33993.BitData.FlgSg5_FlgSp5 = Status;
else if(Sp0ToSg13 == DF_FLGSG4 ) RcvSoMc33993.BitData.FlgSg4_FlgSp4 = Status;
else if(Sp0ToSg13 == DF_FLGSG3 ) RcvSoMc33993.BitData.FlgSg3_FlgSp3 = Status;
else if(Sp0ToSg13 == DF_FLGSG2 ) RcvSoMc33993.BitData.FlgSg2_FlgSp2 = Status;
else if(Sp0ToSg13 == DF_FLGSG1 ) RcvSoMc33993.BitData.FlgSg1_FlgSp1 = Status;
else if(Sp0ToSg13 == DF_FLGSG0 ) RcvSoMc33993.BitData.FlgSg0_FlgSp0 = Status;
else ;
Mc33993CmdSend(NumMc,CmdBit,RcvSoMc33993.ByteData.StaSgH,RcvSoMc33993.ByteData.StaSgL);
//(*(PntSta+NumMc)).CmdTriState_Sg = RcvSoMc33993.StaSg;
break;
default:;
}
return 1;
}
//片选产生
//多余20片需要增加
void ChangeCsMc33993(ubyte NumMc,bit HorL)
{
switch(NumMc)
{
case Mc33993_0 : CS_SwChip_0 = HorL;break;
case Mc33993_1 : CS_SwChip_1 = HorL;break;
default:;
}
}
//****************************************************************************
// @Function ubyte Mc33993DataSendRcv(ubyte Data)
//
//----------------------------------------------------------------------------
// @Description 发送数据,返回接收数据
// 此函数与CPU平台相关,不同CPU需要修改。
// 此函数适用于XC2765SSC采用查询方式
//----------------------------------------------------------------------------
// @Returnvalue 返回接收的数据
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2011-3-4 10:28:27
//
//****************************************************************************
ubyte Mc33993DataSendRcv(ubyte Data)
{
uword i;
SSC_vSendData(Data);
for(i=0;(i<6000)&&(!(IRCON1&0x02));i++);
IRCON1 &= 0xFD;
for(i=0;(i<6000)&&(!(IRCON1&0x04));i++);
IRCON1 &= 0xFB;
return((ubyte)(SSC_vGetData()));
}
//****************************************************************************
// @Function union ByteBitAccess *Mc33993CmdSend(ubyte NumMc,ubyte CmdBit,ubyte SetBitH,ubyte SetBitL)
//
//----------------------------------------------------------------------------
// @Description 发送33993的操作命令,返回开关状态
//
//----------------------------------------------------------------------------
// @Returnvalue 返回接收的3个字节的开关状态
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2011-3-4 10:36:27
//
//****************************************************************************
union ByteBitAccess *Mc33993CmdSend(ubyte NumMc,ubyte CmdBit,ubyte SetBitH,ubyte SetBitL)
{
union ByteBitAccess RcvSoMc,*Pnt;
union WordByteBitAccess RcvSoMc33993W;
// uword i;
//----------------------------------------------------------------------------
RcvSoMc33993W.ByteData.StaSgH = SetBitH;
RcvSoMc33993W.ByteData.StaSgL = SetBitL;
switch(CmdBit)//保存命令状态
{
case DF_CMDSETTING :(*(PntSta+NumMc)).CmdSetting = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDINT_SP :(*(PntSta+NumMc)).CmdInt_Sp = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDINT_SG :(*(PntSta+NumMc)).CmdInt_Sg = RcvSoMc33993W.StaSg;break;
case DF_CMDMETALLIC_SP:(*(PntSta+NumMc)).CmdMetallic_Sp = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDMETALLIC_SG:(*(PntSta+NumMc)).CmdMetallic_Sg = RcvSoMc33993W.StaSg;break;
case DF_CMDANALOG :(*(PntSta+NumMc)).CmdAnalog = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDWETCURR_SP :(*(PntSta+NumMc)).CmdWetCurr_Sp = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDWETCURR_SG :(*(PntSta+NumMc)).CmdWetCurr_Sg = RcvSoMc33993W.StaSg;break;
case DF_CMDTRISTATE_SP:(*(PntSta+NumMc)).CmdTriState_Sp = RcvSoMc33993W.ByteData.StaSgL;break;
case DF_CMDTRISTATE_SG:(*(PntSta+NumMc)).CmdTriState_Sg = RcvSoMc33993W.StaSg;break;
default:;
}
if(NumMc > (NumChipSw-1))NumMc = (NumChipSw-1);
ChangeCsMc33993(NumMc,0);
//----------------------------
_nop_();
_nop_();
_nop_();
_nop_();
//-------------------------------
RcvSoMc.ByteData.SoMc33993Byte2 = Mc33993DataSendRcv(CmdBit);
RcvSoMc.ByteData.SoMc33993Byte1 = Mc33993DataSendRcv(SetBitH);
RcvSoMc.ByteData.SoMc33993Byte0 = Mc33993DataSendRcv(SetBitL);
ChangeCsMc33993(NumMc,1);
//----------------------------
_nop_();
_nop_();
_nop_();
_nop_();
//-------------------------------
Pnt = &RcvSoMc;
return (Pnt);
}