diff --git a/SSC.C b/SSC.C new file mode 100644 index 0000000..d73aaef --- /dev/null +++ b/SSC.C @@ -0,0 +1,264 @@ +//**************************************************************************** +// @Module High Speed Synchronous Serial Interface(SSC) +// @Filename SSC.C +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.9 +// +// @Description: This file contains functions that use the SSC module. +// +//---------------------------------------------------------------------------- +// @Date 2013-11-11 12:29:47 +// +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,1) + +// USER CODE END + + + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +#include "MAIN.H" + +// USER CODE BEGIN (SSC_General,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,7) + +// USER CODE END + + +//**************************************************************************** +// @External Prototypes +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,8) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Local Functions +//**************************************************************************** + +// USER CODE BEGIN (SSC_General,9) + +// USER CODE END + + +//**************************************************************************** +// @Function void SSC_vInit(void) +// +//---------------------------------------------------------------------------- +// @Description This is the initialization function of the SSC function +// library. It is assumed that the SFRs used by this library +// are in their reset state. +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2013-11-11 +// +//**************************************************************************** + +// USER CODE BEGIN (Init,1) + +// USER CODE END + +void SSC_vInit(void) +{ + // USER CODE BEGIN (Init,2) + + // USER CODE END + + /// - Port Selection + SSC_PISEL = 0x01; // load SSC Port Input Select Register to + // Port A + + /// ----------------------------------------------------------------------- + /// Configuration of the used SSC Port Pins: + /// ----------------------------------------------------------------------- + /// Pin SCLK (P0.3) is selected for SCLK ouput + /// Pin MTSR_1 (P0.4) is selected for Master Transmit Output + /// Pin MRST_1 (P0.5) is selected for Master Receive Input + + SFR_PAGE(_pp2, noSST); // switch to page 2 without saving + P0_ALTSEL0 |= 0x18; // set AltSel0 + P0_ALTSEL1 &= ~(ubyte)0x18; // set AltSel1 + + SFR_PAGE(_pp0, noSST); // switch to page 0 without saving + P0_DIR |= 0x18; // set OutPut Direction + + + /// Pin SCLK (P1.2) is Not selected for SCLK ouput + /// Pin MTSR_0 (P1.3) is Not selected for Master Transmit Output + /// Pin MRST_0 (P1.4) Not is selected for Master Receive Input + + SSC_CONH_P &= ~(ubyte)0x80; // enable access to control bits + + /// ----------------------------------------------------------------------- + /// Configuration of the SSC Baud Rate Generator: + /// ----------------------------------------------------------------------- + /// - required baud rate = 2000.000 kbaud + /// - real baud rate = 2000.000 kbaud + /// - deviation = 0.000 % + + SSC_BRH = 0x00; // load SSC baud rate time reload register + // high + SSC_BRL = 0x05; // load SSC baud rate time reload register + // low + + /// ----------------------------------------------------------------------- + /// Configuration of the SSC Operation Mode: + /// ----------------------------------------------------------------------- + /// - this device is configured as SSC master + /// - transfer data width is 8 bit + /// - transfer/receive MSB first + /// - shift transmit data on the leading clock edge, latch on trailing edge + /// - idle clock line is low, leading clock edge is low-to-high transition + /// - ignore receive error + /// - ignore phase error + + + SSC_CONH_P = 0x40; // load SSC control register + + SSC_CONL_P = 0x17; // load SSC control register + + SSC_CONH_P |= 0x80; // disable access to control bits + + /// - SSC interrupt is disabled + + // USER CODE BEGIN (Init,3) + + // USER CODE END + +} // End of function SSC_vInit + + +//**************************************************************************** +// @Function void SSC_vSendData(ubyte Data) +// +//---------------------------------------------------------------------------- +// @Description The master device can initiate the first data transfer by +// writing the transmit data into transmit buffer. This value +// is copied into the shift register (which is assumed to be +// empty at this time), and the selected first bit of the +// transmit data is placed onto the MTSR line on the next +// clock from the baud rate generator. +// A slave device immediately outputs the selected first bit +// (MSB or LSB of the transfer data) at pin MRST, when the +// contents of the transmit buffer are copied into the slave's +// shift register. +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters Data: +// Data to be send +// +//---------------------------------------------------------------------------- +// @Date 2013-11-11 +// +//**************************************************************************** + +// USER CODE BEGIN (SendData,1) + +// USER CODE END + +void SSC_vSendData(ubyte Data) +{ + SSC_TBL = Data; // load transmit buffer register + +} // End of function SSC_vSendData + + +//**************************************************************************** +// @Function ubyte SSC_vGetData(void) +// +//---------------------------------------------------------------------------- +// @Description This function returns the contents of the receive buffer. +// When the receive interrupt request flag is set this implies +// that data is available for reading in the receive buffer. +// +//---------------------------------------------------------------------------- +// @Returnvalue Received data +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2013-11-11 +// +//**************************************************************************** + +// USER CODE BEGIN (GetData,1) + +// USER CODE END + +ubyte SSC_vGetData(void) +{ + return(SSC_RBL); // return receive buffer register + +} // End of function SSC_vGetData + + + +// USER CODE BEGIN (SSC_General,10) + +// USER CODE END + diff --git a/SSC.H b/SSC.H new file mode 100644 index 0000000..6d112f6 --- /dev/null +++ b/SSC.H @@ -0,0 +1,107 @@ +//**************************************************************************** +// @Module High Speed Synchronous Serial Interface(SSC) +// @Filename SSC.H +// @Project CL2.0.dav +//---------------------------------------------------------------------------- +// @Controller Infineon XC886CLM-8FF +// +// @Compiler Keil +// +// @Codegenerator 1.9 +// +// @Description: This file contains all function prototypes and macros for +// the SSC module. +// +//---------------------------------------------------------------------------- +// @Date 2013-11-11 12:29:47 +// +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,1) + +// USER CODE END + + + +#ifndef _SSC_H_ +#define _SSC_H_ + +//**************************************************************************** +// @Project Includes +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,2) + +// USER CODE END + + +//**************************************************************************** +// @Macros +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,3) + +// USER CODE END + + +//**************************************************************************** +// @Defines +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,4) + +// USER CODE END + + +//**************************************************************************** +// @Typedefs +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,5) + +// USER CODE END + + +//**************************************************************************** +// @Imported Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,6) + +// USER CODE END + + +//**************************************************************************** +// @Global Variables +//**************************************************************************** + +// USER CODE BEGIN (SSC_Header,7) + +// USER CODE END + + +//**************************************************************************** +// @Prototypes Of Global Functions +//**************************************************************************** + +void SSC_vInit(void); +void SSC_vSendData(ubyte Data); +ubyte SSC_vGetData(void); + + +// USER CODE BEGIN (SSC_Header,8) + +// USER CODE END + + +//**************************************************************************** +// @Interrupt Vectors +//**************************************************************************** + + +// USER CODE BEGIN (SSC_Header,9) + +// USER CODE END + + +#endif // ifndef _SSC_H_ diff --git a/START_XC.a51 b/START_XC.a51 new file mode 100644 index 0000000..d914b3b --- /dev/null +++ b/START_XC.a51 @@ -0,0 +1,505 @@ +$NOMOD51 +;------------------------------------------------------------------------------ +; This file is part of the C51 Compiler package +; Startup Code for the Infineon XC8xx devices +; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. +; Version 20100601 +; -------- Revision --------- +; - Previous version 20100405 +; - Added XC864 with option for LIN_BSL parameters +; - Renamed NDIV_XC866 to NDIV_XC86x +; +; *** <<< Use Configuration Wizard in Context Menu >>> *** +;------------------------------------------------------------------------------ +; STARTUP.A51: This code is executed after processor reset. +; +; To translate this file use A51 with the following invocation: +; +; A51 STARTUP.A51 +; +; To link the modified STARTUP.OBJ file to your application use the following +; Lx51 invocation: +; +; Lx51 your object file list, STARTUP.OBJ controls +; +;------------------------------------------------------------------------------ +; +; Use off-chip XTAL +; XC8xx series runs by default from on-chip osciallator. +; optionally you may use a off-chip XTAL +; +XTAL EQU 1 ; set to 0 On-chip oscillator/ not used for XC82x devices +; +; Device = " XC82x " +XC82x_CHIP EQU 0 ;applicable to XC83x +;--------------------------------------------------------------------- +;resulting in fsys = 80MHz for XC866/XC864 and fsys = 96MHz for XC88x unless otherwise mentioned +; +; Device = " XC866 " +XC866_CHIP EQU 0 +; Device = " XC864 " +XC864_CHIP EQU 0 +; +; PLL N-Divider +; PLL N-Divider must result in fsys = 80MHz +; <0=> N=14 +; <1=> N=15 +; <2=> N=16 (10 MHz XTAL) +; <3=> N=17 +; <4=> N=18 +; <5=> N=19 +; <6=> N=20 (8 MHz XTAL) +; <7=> N=21 +; <8=> N=24 +; <9=> N=28 +; <10=> N=30 +; <11=> N=32 (5 MHz XTAL) +; <12=> N=40 +; <13=> N=42 +; <14=> N=45 +; <15=> N=50 +; +NDIV_XC86x EQU 2 ; default 2 +; + +;--------------------------------------------------------------------- +; Device = " XC88x " +XC88x_CHIP EQU 1 +; +; PLL N-Divider for *NON-SAL* device fsys = 96 MHz +; <0=> N=10 +; <1=> N=12 +; <2=> N=13 +; <3=> N=14 +; <4=> N=15 +; <5=> N=16 (12 MHz XTAL) +; <6=> N=17 +; <7=> N=18 +; <8=> N=19 +; <9=> N=20 (9.6 MHz On-Chip XTAL) +; <10=> N=24 (8 MHz XTAL) +; <11=> N=30 +; <12=> N=32 (6 MHz XTAL) +; <13=> N=36 +; <14=> N=40 +; <15=> N=48 (4 MHz XTAL) +; +; PLL N-Divider for *SAL* device -> fsys = 80 MHz +; <0=> N=10 +; <1=> N=12 +; <2=> N=13 +; <3=> N=14 +; <4=> N=15 +; <5=> N=16 (10 MHz On-Chip XTAL) +; <6=> N=17 +; <7=> N=18 +; <8=> N=19 +; <9=> N=20 (8 MHz XTAL) +; <10=> N=24 +; <11=> N=30 +; <12=> N=32 (5 MHz XTAL) +; <13=> N=36 +; <14=> N=40 (4 MHz XTAL) +; <15=> N=48 +; + +NDIV_XC88x EQU 10 ; default 10 +; + +;--------------------------------------------------------------------- +; Device = " XC87x " +XC878_CHIP_16FF EQU 0 +XC878_CHIP_13FF EQU 0 +XC874_CHIP_16FF EQU 0 +XC874_CHIP_13FF EQU 0 + +;4 MHz +NDIV_XC87x_PLL_CON EQU 0x18 +NDIV_XC87x_PLL_CON1 EQU 0x20 +NR_XC87x EQU 0x00 +OD_XC87x EQU 0x00 + +;6 MHz +;NDIV_XC87x_PLL_CON EQU 0x18 +;NDIV_XC87x_PLL_CON1 EQU 0x20 +;NR_XC87x EQU 0x01 +;OD_XC87x EQU 0x00 + +;8 MHz default +;NDIV_XC87x_PLL_CON EQU 0x18 +;NDIV_XC87x_PLL_CON1 EQU 0x20 +;NR_XC87x EQU 0x02 +;OD_XC87x EQU 0x00 + +; + +; +;------------------------------------------------------------------------------ +; +; User-defined Power-On Initialization of Memory +; +; With the following EQU statements the initialization of memory +; at processor reset can be defined: +; +; IDATA memory length <0x0-0x100> +; Note: The absolute start-address of IDATA memory is always 0 +; The IDATA space overlaps physically the DATA and BIT areas. +IDATALEN EQU 0x100 +; +; XDATA memory start address <0x0-0xFFFF> +; absolute start-address of XDATA memory +XDATASTART EQU 0xF000 +; +; XDATA memory length <0x0-0xFFFF> +; length of XDATA memory in bytes. +IF (XC82x_CHIP) + XDATALEN EQU 0x100 +ELSEIF (XC866_CHIP || XC864_CHIP) + XDATALEN EQU 0x200 +ELSEIF (XC88x_CHIP) + XDATALEN EQU 0x600 +ELSEIF (XC878_CHIP_16FF || XC878_CHIP_13FF) + XDATALEN EQU 0xC00 +ELSEIF (XC874_CHIP_16FF || XC874_CHIP_13FF) + XDATALEN EQU 0xC00 + +ENDIF + +; +; PDATA memory start address <0x0-0xFFFF> +; absolute start-address of PDATA memory +PDATASTART EQU 0xF000 +; +; PDATA memory length <0x0-0xFF> +; length of PDATA memory in bytes. +PDATALEN EQU 0 +; +; +;------------------------------------------------------------------------------ +; +; Reentrant Stack Initilization +; +; The following EQU statements define the stack pointer for reentrant +; functions and initialized it: +; +; Stack Space for reentrant functions in the SMALL model. +; Activate reentrant Stack (SMALL model) +IBPSTACK EQU 0 ; set to 1 if small reentrant is used. +; top of stack <0x0-0xFF> +; set top of stack to highest location+1 +IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +; Stack Space for reentrant functions in the LARGE model. +; Activate reentrant Stack (LARGE model) +XBPSTACK EQU 0 ; set to 1 if large reentrant is used. +; top of stack <0x0-0xFFFF> +; set top of stack to highest location+1. +XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 +; +; +; Stack Space for reentrant functions in the COMPACT model. +; Activate reentrant Stack (COMPACT model) +PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. +; +; top of stack <0x0-0xFF> +; set top of stack to highest location+1. +PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 +; +; +;------------------------------------------------------------------------------ +; +; Set Memory Page for Using the Compact Model with 64 KByte xdata RAM +; +; Define the xdata page used for pdata variables. +; PPAGE must conform with the PPAGE set in the linker invocation. +; +; Enable pdata memory page initalization +PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. +; +; PPAGE number <0x0-0xFF> +; uppermost 256-byte address of the page used for pdata variables. +PPAGE EQU 0xF0 +; +; +;------------------------------------------------------------------------------ +; +; Parameters for LIN Boostrap Loader (XC864 only) +; When these values are not defined, an XC864 device stays in +; LIN-BSL mode and does not start the user application +; +; Enable LIN BSL parameter initialization +LIN_BSL EQU 1 ; set to 1 if LIN BSL parameters should be generated in flash table +; +; NAC: No. Activity Count <0x00-0xFF> +; specifies the delay (n * 5ms) before jumping to user mode. +; 0x01: 0 ms delay. Jump to User Mode immediately +; 0x02: 5 ms delay before jumping to User Mode +; 0x03: 10 ms delay before jumping to User Mode +; 0x04 - 0x0C: 15 - 55 ms delay before jumping to User Mode +; 0x0D - 0xFF, 0x00: Enter LIN BSL Mode (Invalid NAC) +LIN_NAC EQU 0x01 +; +; NAD: Node Address for Diagnostic <0x00-0xFF> +; specifies the address of the active slave node. +LIN_NAD EQU 0x01 +; +; +;------------------------------------------------------------------------------ + +;Check the chip selection +IF ((XC82x_CHIP + XC866_CHIP + XC864_CHIP + XC88x_CHIP + XC878_CHIP_16FF + XC878_CHIP_13FF + XC874_CHIP_16FF + XC874_CHIP_13FF) > 1) + __ERROR__ "Please select only one chip!" +ELSEIF ((XC82x_CHIP + XC866_CHIP + XC864_CHIP + XC88x_CHIP + XC878_CHIP_16FF + XC878_CHIP_13FF + XC874_CHIP_16FF + XC874_CHIP_13FF) == 0) + __ERROR__ "Please select a chip!" +ENDIF + +IF (XTAL <> 0) + IF (XC866_CHIP <> 0 || XC864_CHIP <> 0) + NDIV EQU NDIV_XC86x + ELSEIF (XC88x_CHIP <> 0) + NDIV EQU NDIV_XC88x + ELSEIF (XC878_CHIP_16FF <> 0 || XC878_CHIP_13FF <> 0) + ;nothing + ELSEIF (XC874_CHIP_16FF <> 0 || XC874_CHIP_13FF <> 0) + ;nothing + ELSEIF (XC82x_CHIP <> 0) + ;nothing + ELSE + __WARNING__ "Default NDIV selection is XC866" + NDIV EQU NDIV_XC86x ;Default + ENDIF + ENDIF ;End of XTAL selection + +; Standard SFR Symbols +ACC DATA 0E0H +B DATA 0F0H +SP DATA 81H +DPL DATA 82H +DPH DATA 83H + +; XC8xx specific SFR Symbols used in STARTUP code +IF (XC82x_CHIP == 0) +; Take note of different SFR addresses for XC82x. Currently not used. + sfr SCU_PAGE = 0xBF + sfr PLL_CON = 0xB7 + sfr PLL_CON1 = 0xEA;//SCU,RMAP=0,Page=1 + sfr CMCON = 0xBA + sfr OSC_CON = 0xB6 + sfr PASSWD = 0xBB + sfr XADDRH = 0xB3 + sfr MEX3 = 0x96 +ENDIF + +IF(XC874_CHIP_13FF == 1 || XC874_CHIP_16FF == 1) + sfr PORT_PAGE = 0xB2 + sfr P3_PUDEN = 0xB1 + sfr P4_PUDEN = 0xC9 +ENDIF + + NAME ?C_STARTUP + +?C_C51STARTUP SEGMENT CODE +?STACK SEGMENT IDATA + + RSEG ?STACK + DS 1 + + EXTRN CODE (?C_START) + PUBLIC ?C_STARTUP + + CSEG AT 0x2000 +?C_STARTUP: LJMP STARTUP1 + + RSEG ?C_C51STARTUP + +STARTUP1: + +IF (XTAL <> 0) + ; switch to external XTAL + IF(XC878_CHIP_16FF <> 0 || XC878_CHIP_13FF <> 0 || XC874_CHIP_16FF <> 0 || XC874_CHIP_13FF <> 0) + MOV SCU_PAGE,#1; + MOV PASSWD, #11000000B ;Disable Bit-Protection + ANL OSC_CON, #~(0x01 << 2) ;OSCSS = 0 + ORL OSC_CON, #(0x01 << 6) ;Bypass PLL Output ( PLLBYP = 1 ) + ORL OSC_CON, #(0x01 << 5) ;Set PLL Power Down Mode ( PLLPD = 1) + ANL OSC_CON, #~(0x01 << 3) ;XPD = 0, XTAL not powered down + + + WAIT_XTAL_STABLE: ; delay necssary for external clock to stablise + MOV R2,#0x1E ; wait about 1.5 ms ( varies with oscillator freq ) + LOOP: + MOV R3,#0x64 + DJNZ R3, $ + DJNZ R2, LOOP + OSC_WDT: + ORL OSC_CON, #(0x01 << 1) ;Restart external oscillator watchdog + MOV R0,#0x41 ;Wait for 65 cycles + DJNZ R0, $ + ;user may want to add an error counter for oscillator detection + CHECK_EXTOSCR: + MOV A, OSC_CON + JNB ACC.0, OSC_WDT + ORL OSC_CON, #(0x01 << 2) ;Select external oscillator + MOV PLL_CON, #NDIV_XC87x_PLL_CON ; NDIV value + MOV PLL_CON1, #NDIV_XC87x_PLL_CON1 ; NDIV Value + MOV A, #NR_XC87x ; PDIV Value + ORL PLL_CON1, A + MOV A, #OD_XC87x ; KDIV Value + ORL CMCON, A + ANL OSC_CON, #~(0x01 << 5) ;Change to PLL Normal Mode ( PLLPD = 0) + ORL OSC_CON, #(0x01 << 7) ;Restart the PLL watchdog ( PLLRDRES = 1) + + ;user may want to add an error counter for PLL lock detection + PLLNOTRUN: + MOV A, PLL_CON + JNB ACC.1, PLLNOTRUN ;PLL_Run Status + + PLLNOTLOCKED: + MOV A, PLL_CON + JNB ACC.0, PLLNOTLOCKED ;PLL_Lock Status + + ANL OSC_CON, #~(0x01 << 6) ;Disable bypass PLL output + MOV PASSWD, #11000011B ;Enable Bit-Protection + MOV SCU_PAGE,#0 + +ELSEIF(XC866_CHIP <> 0 || XC864_CHIP <> 0 || XC88x_CHIP <> 0) + MOV SCU_PAGE,#1 + ORL PLL_CON, #0x08 ; VCOBYP = 1 + ORL PLL_CON, #0x04 ; OSCDISC = 1 _ _ _ NDIV, VCOBYP, OSCDISC, RESLD, LOCK + ANL OSC_CON, #0xF7 ; XPD = 0 power xtal + ORL OSC_CON, #0x04 ; OSCSS = 1 0, 0, 0, OSCPD, XPD, OSCSS, ORDRES, OSCR + ;all calculations are based on no wait state + MOV R1,#0 +DelayXTAL0: + MOV R0,#10 ; delay necssary for external clock to stablise (amplitude >= 0.4 * VDDC - refer to product data sheet) +DelayXTAL: ; delay time should be adjusted according to different external osciallators + DJNZ R1,$ + DJNZ R0,DelayXTAL + + ; redetection of osc +OSCR_NOTSET: + MOV R0, #86 + ORL OSC_CON, #0x02 ; ORDRES = 1 ;restart oscillator run detection + ;assume no wait state, K = 2, + ;Apollo requires to wait for 256 clock cycles -> 2048 vco cycles + ;Elektra requires to wait for 342 clock cycles -> 2048 vco cycles + ;djnz = 4 cc + DJNZ R0, $ + MOV A,OSC_CON + JNB ACC.0, OSCR_NOTSET + + ;reprogram the NDIV factor to required value + ;ORL PLL_CON, #0x08 ; VCOBYP = 1 to change N-Divider + MOV PASSWD, #0x98 ; open access to writing protected bit + ANL PLL_CON, #0x0F + ORL PLL_CON, #NDIV*16 + ANL PLL_CON, #0xFB ; OSCDISC = 0, reconnect oscillator to the PLL + + ;PLL lock detection + ORL PLL_CON, #0x02 ; detect PLL lock + MOV R0, #100 ; LOCK flag should be set within 200us, user need to adapt accordingly + ; assume a 10MHz XTAL for XC866/XC864 device + ; device is in prescaler mode, k = 2 therefore fsys = 5MHz + ; ## 1cclk = 1/(5MHz/3) = 600 ns + ; DJNZ requires 4 x 600ns = 2.4 us therefore 100 DJNZ -> 240us + ; for XC88x, the factor 3 (##) is changed to 4 then the calculated value is + ; 320 us based on a 10MHz XTAL +WAIT_LOCK: + DJNZ R0, $ + MOV A, PLL_CON + JNB ACC.0, OSCR_NOTSET + ; reconnect to PLL + ANL PLL_CON, #0xF7 ; VCOBYP = 0 + MOV SCU_PAGE,#0 + ENDIF +ENDIF + +IF IDATALEN <> 0 + MOV R0,#IDATALEN - 1 + CLR A +IDATALOOP: MOV @R0,A + DJNZ R0,IDATALOOP +ENDIF + +IF (XC878_CHIP_16FF <> 0 || XC874_CHIP_16FF <> 0) + MOV MEX3, #0x1F +ENDIF + +IF (XC874_CHIP_13FF <> 0 || XC874_CHIP_16FF <> 0) + MOV PORT_PAGE, #0x01 + ORL P3_PUDEN, #0x80 + ORL P4_PUDEN, #0xF0 + MOV PORT_PAGE, #0x00 +ENDIF + + + +IF XDATALEN <> 0 + MOV DPTR,#XDATASTART + MOV R7,#LOW (XDATALEN) + IF (LOW (XDATALEN)) <> 0 + MOV R6,#(HIGH (XDATALEN)) +1 + ELSE + MOV R6,#HIGH (XDATALEN) + ENDIF + CLR A +XDATALOOP: MOVX @DPTR,A + INC DPTR + DJNZ R7,XDATALOOP + DJNZ R6,XDATALOOP +ENDIF + +IF PPAGEENABLE <> 0 + MOV SCU_PAGE,#3 + MOV XADDRH,#PPAGE + MOV SCU_PAGE,#0 +ENDIF + +IF PDATALEN <> 0 + MOV R0,#LOW (PDATASTART) + MOV R7,#LOW (PDATALEN) + CLR A +PDATALOOP: MOVX @R0,A + INC R0 + DJNZ R7,PDATALOOP +ENDIF + +IF IBPSTACK <> 0 +EXTRN DATA (?C_IBP) + + MOV ?C_IBP,#LOW IBPSTACKTOP +ENDIF + +IF XBPSTACK <> 0 +EXTRN DATA (?C_XBP) + + MOV ?C_XBP,#HIGH XBPSTACKTOP + MOV ?C_XBP+1,#LOW XBPSTACKTOP +ENDIF + +IF PBPSTACK <> 0 +EXTRN DATA (?C_PBP) + MOV ?C_PBP,#LOW PBPSTACKTOP +ENDIF + + MOV SP,#?STACK-1 + + LJMP ?C_START + +; Overwrite ?C?DPSEL address for XC866 Device +PUBLIC ?C?DPSEL +?C?DPSEL DATA 0A2H ; DPSEL address for Mentor M8051EW + +IF XC864_CHIP <> 0 + ; Optional ROM-table for XC864 LIN-BSL + IF LIN_BSL <> 0 + CSEG AT 0FFCH + DB LIN_NAC + DB NOT(LIN_NAC) + DB LIN_NAD + DB NOT(LIN_NAD) + ENDIF +ENDIF + + END diff --git a/SwDriver.C b/SwDriver.C new file mode 100644 index 0000000..2fda42b --- /dev/null +++ b/SwDriver.C @@ -0,0 +1,496 @@ +#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,高阻,2mA,16mA +////---------------------------------------------------------------------------- +//// @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,存放数据结构体指针,NumSampleChip,33993芯片数量 +//// +////---------------------------------------------------------------------------- +//// @Date 2008-12-2 +//// +////**************************************************************************** +void SwStaSample(UnSwSample *ptmp) +{ + union ByteBitAccess *pStaSwIn; + uword i,k; +//----初始化------------------------------------------------------------------------ + InitMc33993Sec();//一个大循环必须调用一次,这样就算12V掉电或33993复位,马上可以恢复。 +//初始化用作采集的IO + for(i=0;i>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>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdInt_Sg)&0x00ff)); //1,关闭中断 + Mc33993CmdSend(i,DF_CMDMETALLIC_SP, 0, (*(PntSta+i)).CmdMetallic_Sp); //0,2mA + Mc33993CmdSend(i,DF_CMDMETALLIC_SG, (ubyte)((((*(PntSta+i)).CmdMetallic_Sg)>>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdMetallic_Sg)&0x00ff)); //0,2mA + 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-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需要修改。 +// 此函数适用于XC2765,SSC采用查询方式 +//---------------------------------------------------------------------------- +// @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); +} diff --git a/SwDriver.C.bak b/SwDriver.C.bak new file mode 100644 index 0000000..d6ac035 --- /dev/null +++ b/SwDriver.C.bak @@ -0,0 +1,893 @@ +#include "MAIN.h" + +//***************************************************************************** +//宏定义 +//***************************************************************************** +//多余20片需要增加 +#define Mc33993_0 0 +#define Mc33993_1 1 +#define Mc33993_2 2 +#define Mc33993_3 3 +#define Mc33993_4 4 +#define Mc33993_5 5 +#define Mc33993_6 6 +#define Mc33993_7 7 +#define Mc33993_8 8 +#define Mc33993_9 9 +#define Mc33993_10 10 +#define Mc33993_11 11 +#define Mc33993_12 12 +#define Mc33993_13 13 +#define Mc33993_14 14 +#define Mc33993_15 15 +#define Mc33993_16 16 +#define Mc33993_17 17 +#define Mc33993_18 18 +#define Mc33993_19 19 +#define Mc33993_20 20 + + +#define D24V 0 +#define Gnd 1 + +#define TriOff 0 +#define TriOn 1 + +#define WetCur2mA 0 +#define WetCur16mA 1 + +#define SwToGnd 0 +#define SwToPwr 1 + +#define ALLTRI 0xff +#define ALLD24V 0x0 + +#define DF_CMDSWSTATUS 0x00 +#define DF_CMDSETTING 0x01 +#define DF_CMDINT_SP 0x02 +#define DF_CMDINT_SG 0x03 +#define DF_CMDMETALLIC_SP 0x04 +#define DF_CMDMETALLIC_SG 0x05 +#define DF_CMDANALOG 0x06 +#define DF_CMDWETCURR_SP 0x07 +#define DF_CMDWETCURR_SG 0x08 +#define DF_CMDTRISTATE_SP 0x09 +#define DF_CMDTRISTATE_SG 0x0A +#define DF_CMDCALIBRATION 0x0B +#define DF_CMDSLEEP 0x0C +#define DF_CMDRESET 0x7F + + +#define DF_FLGTHEM 10 +#define DF_FLGINT 11 +#define DF_FLGSP7 12 +#define DF_FLGSP6 13 +#define DF_FLGSP5 14 +#define DF_FLGSP4 15 +#define DF_FLGSP3 16 +#define DF_FLGSP2 17 +#define DF_FLGSP1 18 +#define DF_FLGSP0 19 +#define DF_FLGSG13 20 +#define DF_FLGSG12 21 +#define DF_FLGSG11 22 +#define DF_FLGSG10 23 +#define DF_FLGSG9 24 +#define DF_FLGSG8 25 +#define DF_FLGSG7 26 +#define DF_FLGSG6 27 +#define DF_FLGSG5 28 +#define DF_FLGSG4 29 +#define DF_FLGSG3 30 +#define DF_FLGSG2 31 +#define DF_FLGSG1 32 +#define DF_FLGSG0 33 + +//Analog +#define DF_AN_HIMP 1 +#define DF_AN_2MA 2 +#define DF_AN_16MA 3 + +#define DF_CH_SG0 1 +#define DF_CH_SG1 2 +#define DF_CH_SG2 3 +#define DF_CH_SG3 4 +#define DF_CH_SG4 5 +#define DF_CH_SG5 6 +#define DF_CH_SG6 7 +#define DF_CH_SG7 8 +#define DF_CH_SG8 9 +#define DF_CH_SG9 10 +#define DF_CH_SG10 11 +#define DF_CH_SG11 12 +#define DF_CH_SG12 13 +#define DF_CH_SG13 14 +#define DF_CH_SP0 15 +#define DF_CH_SP1 16 +#define DF_CH_SP2 17 +#define DF_CH_SP3 18 +#define DF_CH_SP4 19 +#define DF_CH_SP5 20 +#define DF_CH_SP6 21 +#define DF_CH_SP7 22 + +//***************************************************************************** +//数据结构 +//***************************************************************************** +//每个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); +ubyte Mc33993AnalogChSel(ubyte NumMc,ubyte Mode,ubyte Channal); +union ByteBitAccess *Mc33993CmdSend(ubyte NumMc,ubyte CmdBit,ubyte SetBitH,ubyte SetBitL); + + + + + + +//--------------------------------------------------- + +//***************************************************************************** +//函数 +//***************************************************************************** +void Swtest2(void) +{ + ulong i,j; + + UnSwOut_1.BitData.S21 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S22 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S23 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S24 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S25 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S26 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S27 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S28 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S29 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S30 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S31 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S32 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S33 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S34 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S35 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S36 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S37 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S38 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S39 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S40 = 1;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + + UnSwOut_1.BitData.S21 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S22 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S23 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S24 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S25 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S26 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S27 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S28 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S29 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S30 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S31 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S32 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S33 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S34 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S35 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S36 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S37 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S38 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S39 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + UnSwOut_1.BitData.S40 = 0;LedLight(&UnSwOut_1); for(j=0;j<200;j++){for(i=0;i<133;i++);} + + +} + +//**************************************************************************** +// @Function void SwStaSample(UnSwSample *ptmp,ubyte NumSampleChip) +// +//---------------------------------------------------------------------------- +// @Description 采集33993的开关信号。 +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters ptmp,存放数据结构体指针,NumSampleChip,33993芯片数量 +// +//---------------------------------------------------------------------------- +// @Date 2008-12-2 +// +//**************************************************************************** +void SwStaSample(UnSwSample *ptmp) +{ + union ByteBitAccess *pStaSwIn; + uword i,k; +//----初始化------------------------------------------------------------------------ + InitMc33993Sec();//一个大循环必须调用一次,这样就算12V掉电或33993复位,马上可以恢复。 +//初始化用作采集的IO + for(i=0;i>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 ToggleOneBit(ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13) +// +//---------------------------------------------------------------------------- +// @Description 取反给定芯片的给定位,需要提供命令位 +// +//---------------------------------------------------------------------------- +// @Returnvalue None +// +//---------------------------------------------------------------------------- +// @Parameters MC33993状态存储结构体指针PntSta +// +//---------------------------------------------------------------------------- +// @Date 2008-12-2 +// +//**************************************************************************** +// void ToggleOneBit(ubyte NumMc,ubyte CmdBit,ubyte Sp0ToSg13) +// { +// union WordByteBitAccess RcvSoMc33993; +// bit status; + +// if(CmdBit == DF_CMDTRISTATE_SG) +// { +// RcvSoMc33993.StaSg = (*(PntSta+NumMc)).CmdTriState_Sg; + +// switch(Sp0ToSg13) +// { +// case DF_FLGSG13: status = RcvSoMc33993.BitData.FlgSg13 ;break; +// case DF_FLGSG12: status = RcvSoMc33993.BitData.FlgSg12 ;break; +// case DF_FLGSG11: status = RcvSoMc33993.BitData.FlgSg11 ;break; +// case DF_FLGSG10: status = RcvSoMc33993.BitData.FlgSg10 ;break; +// case DF_FLGSG9 : status = RcvSoMc33993.BitData.FlgSg9 ;break; +// case DF_FLGSG8 : status = RcvSoMc33993.BitData.FlgSg8 ;break; +// case DF_FLGSG7 : status = RcvSoMc33993.BitData.FlgSg7_FlgSp7;break; +// case DF_FLGSG6 : status = RcvSoMc33993.BitData.FlgSg6_FlgSp6;break; +// case DF_FLGSG5 : status = RcvSoMc33993.BitData.FlgSg5_FlgSp5;break; +// case DF_FLGSG4 : status = RcvSoMc33993.BitData.FlgSg4_FlgSp4;break; +// case DF_FLGSG3 : status = RcvSoMc33993.BitData.FlgSg3_FlgSp3;break; +// case DF_FLGSG2 : status = RcvSoMc33993.BitData.FlgSg2_FlgSp2;break; +// case DF_FLGSG1 : status = RcvSoMc33993.BitData.FlgSg1_FlgSp1;break; +// case DF_FLGSG0 : status = RcvSoMc33993.BitData.FlgSg0_FlgSp0;break; +// default:; +// } +// if(status)Mc33993CmdSendOneBit(Mc33993_1,DF_CMDTRISTATE_SG,Sp0ToSg13,D24V); +// else Mc33993CmdSendOneBit(Mc33993_1,DF_CMDTRISTATE_SG,Sp0ToSg13,Gnd); +// } +// else if(CmdBit == DF_CMDTRISTATE_SP) +// { +// RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdTriState_Sp; + +// switch(Sp0ToSg13) +// { +// case DF_FLGSG7 : status = RcvSoMc33993.BitData.FlgSg7_FlgSp7;break; +// case DF_FLGSG6 : status = RcvSoMc33993.BitData.FlgSg6_FlgSp6;break; +// case DF_FLGSG5 : status = RcvSoMc33993.BitData.FlgSg5_FlgSp5;break; +// case DF_FLGSG4 : status = RcvSoMc33993.BitData.FlgSg4_FlgSp4;break; +// case DF_FLGSG3 : status = RcvSoMc33993.BitData.FlgSg3_FlgSp3;break; +// case DF_FLGSG2 : status = RcvSoMc33993.BitData.FlgSg2_FlgSp2;break; +// case DF_FLGSG1 : status = RcvSoMc33993.BitData.FlgSg1_FlgSp1;break; +// case DF_FLGSG0 : status = RcvSoMc33993.BitData.FlgSg0_FlgSp0;break; +// default:; +// } +// if(status)Mc33993CmdSendOneBit(Mc33993_1,DF_CMDTRISTATE_SP,Sp0ToSg13,D24V); +// else Mc33993CmdSendOneBit(Mc33993_1,DF_CMDTRISTATE_SP,Sp0ToSg13,Gnd); +// } +// } + +//**************************************************************************** +// @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=0;i>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdInt_Sg)&0x00ff)); //1,关闭中断 + Mc33993CmdSend(i,DF_CMDMETALLIC_SP, 0, (*(PntSta+i)).CmdMetallic_Sp); //0,2mA + Mc33993CmdSend(i,DF_CMDMETALLIC_SG, (ubyte)((((*(PntSta+i)).CmdMetallic_Sg)>>8)&0x00ff),(ubyte)(((*(PntSta+i)).CmdMetallic_Sg)&0x00ff)); //0,2mA + 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-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 bit Mc33993StaRcvOneBit(ubyte NumMc,ubyte Sp0ToSg13) +// +//---------------------------------------------------------------------------- +// @Description 读取任意一位的开关状态 +// +//---------------------------------------------------------------------------- +// @Returnvalue 返回位状态 +// +//---------------------------------------------------------------------------- +// @Parameters None +// +//---------------------------------------------------------------------------- +// @Date 2008-12-2 +// +//**************************************************************************** +// bit Mc33993StaRcvOneBit(ubyte NumMc,ubyte Sp0ToSg13) +// { +// union ByteBitAccess *Pnt; +// bit BitRcvOneBit; +// //----------------------------------------------------------------------------- +// if(NumMc > (NumChipSw-1))NumMc = (NumChipSw-1); +// Pnt = Mc33993CmdSend(NumMc,DF_CMDSWSTATUS,0xff,0xff); + +// if(Sp0ToSg13 == DF_FLGTHEM)BitRcvOneBit = (*Pnt).BitData.FlgThem; +// else if(Sp0ToSg13 == DF_FLGINT )BitRcvOneBit = (*Pnt).BitData.FlgInt; +// else if(Sp0ToSg13 == DF_FLGSP7 )BitRcvOneBit = (*Pnt).BitData.FlgSp7; +// else if(Sp0ToSg13 == DF_FLGSP6 )BitRcvOneBit = (*Pnt).BitData.FlgSp6; +// else if(Sp0ToSg13 == DF_FLGSP5 )BitRcvOneBit = (*Pnt).BitData.FlgSp5; +// else if(Sp0ToSg13 == DF_FLGSP4 )BitRcvOneBit = (*Pnt).BitData.FlgSp4; +// else if(Sp0ToSg13 == DF_FLGSP3 )BitRcvOneBit = (*Pnt).BitData.FlgSp3; +// else if(Sp0ToSg13 == DF_FLGSP2 )BitRcvOneBit = (*Pnt).BitData.FlgSp2; +// else if(Sp0ToSg13 == DF_FLGSP1 )BitRcvOneBit = (*Pnt).BitData.FlgSp1; +// else if(Sp0ToSg13 == DF_FLGSP0 )BitRcvOneBit = (*Pnt).BitData.FlgSp0; +// else if(Sp0ToSg13 == DF_FLGSG13)BitRcvOneBit = (*Pnt).BitData.FlgSg13; +// else if(Sp0ToSg13 == DF_FLGSG12)BitRcvOneBit = (*Pnt).BitData.FlgSg12; +// else if(Sp0ToSg13 == DF_FLGSG11)BitRcvOneBit = (*Pnt).BitData.FlgSg11; +// else if(Sp0ToSg13 == DF_FLGSG10)BitRcvOneBit = (*Pnt).BitData.FlgSg10; +// else if(Sp0ToSg13 == DF_FLGSG9 )BitRcvOneBit = (*Pnt).BitData.FlgSg9; +// else if(Sp0ToSg13 == DF_FLGSG8 )BitRcvOneBit = (*Pnt).BitData.FlgSg8; +// else if(Sp0ToSg13 == DF_FLGSG7 )BitRcvOneBit = (*Pnt).BitData.FlgSg7; +// else if(Sp0ToSg13 == DF_FLGSG6 )BitRcvOneBit = (*Pnt).BitData.FlgSg6; +// else if(Sp0ToSg13 == DF_FLGSG5 )BitRcvOneBit = (*Pnt).BitData.FlgSg5; +// else if(Sp0ToSg13 == DF_FLGSG4 )BitRcvOneBit = (*Pnt).BitData.FlgSg4; +// else if(Sp0ToSg13 == DF_FLGSG3 )BitRcvOneBit = (*Pnt).BitData.FlgSg3; +// else if(Sp0ToSg13 == DF_FLGSG2 )BitRcvOneBit = (*Pnt).BitData.FlgSg2; +// else if(Sp0ToSg13 == DF_FLGSG1 )BitRcvOneBit = (*Pnt).BitData.FlgSg1; +// else if(Sp0ToSg13 == DF_FLGSG0 )BitRcvOneBit = (*Pnt).BitData.FlgSg0; +// else ; +// return BitRcvOneBit; +// } + +//**************************************************************************** +// @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_CMDSETTING + case DF_CMDSETTING: + RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdSetting; //用之前的状态填充RcvSoMc33993低字节,也就是不改变其它位的状态 + 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)).CmdSetting = RcvSoMc33993.ByteData.StaSgL;//更新后的状态保存 + break; +//DF_CMDINT_SP + case DF_CMDINT_SP: + RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdInt_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)).CmdInt_Sp = RcvSoMc33993.ByteData.StaSgL; + break; +//DF_CMDMETALLIC_SP + case DF_CMDMETALLIC_SP: + RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdMetallic_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)).CmdMetallic_Sp = RcvSoMc33993.ByteData.StaSgL; + break; +//DF_CMDWETCURR_SP + case DF_CMDWETCURR_SP: + RcvSoMc33993.ByteData.StaSgL = (*(PntSta+NumMc)).CmdWetCurr_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)).CmdWetCurr_Sp = RcvSoMc33993.ByteData.StaSgL; + break; +//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_CMDINT_SG + case DF_CMDINT_SG: + RcvSoMc33993.StaSg = (*(PntSta+NumMc)).CmdInt_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)).CmdInt_Sg = RcvSoMc33993.StaSg; + break; +//DF_CMDMETALLIC_SG + case DF_CMDMETALLIC_SG: + RcvSoMc33993.StaSg = (*(PntSta+NumMc)).CmdMetallic_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)).CmdMetallic_Sg = RcvSoMc33993.StaSg; + break; +//DF_CMDWETCURR_SG + case DF_CMDWETCURR_SG: + RcvSoMc33993.StaSg = (*(PntSta+NumMc)).CmdWetCurr_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)).CmdWetCurr_Sg = RcvSoMc33993.StaSg; + 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需要修改。 +// 此函数适用于XC2765,SSC采用查询方式 +//---------------------------------------------------------------------------- +// @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 RcvSoMc33993,*Pnt; + union WordByteBitAccess RcvSoMc33993W; +// uword i; +//---------------------------------------------------------------------------- + RcvSoMc33993W.ByteData.StaSgH = SetBitH; + RcvSoMc33993W.ByteData.StaSgL = SetBitL; + switch(CmdBit)//保存命令状态 + { + case DF_CMDSETTING :(*(PntSta+NumMc)).CmdSetting = RcvSoMc33993W.StaSg;break; + case DF_CMDINT_SP :(*(PntSta+NumMc)).CmdInt_Sp = RcvSoMc33993W.StaSg;break; + case DF_CMDINT_SG :(*(PntSta+NumMc)).CmdInt_Sg = RcvSoMc33993W.StaSg;break; + case DF_CMDMETALLIC_SP:(*(PntSta+NumMc)).CmdMetallic_Sp = RcvSoMc33993W.StaSg;break; + case DF_CMDMETALLIC_SG:(*(PntSta+NumMc)).CmdMetallic_Sg = RcvSoMc33993W.StaSg;break; + case DF_CMDANALOG :(*(PntSta+NumMc)).CmdAnalog = RcvSoMc33993W.StaSg;break; + case DF_CMDWETCURR_SP :(*(PntSta+NumMc)).CmdWetCurr_Sp = RcvSoMc33993W.StaSg;break; + case DF_CMDWETCURR_SG :(*(PntSta+NumMc)).CmdWetCurr_Sg = RcvSoMc33993W.StaSg;break; + case DF_CMDTRISTATE_SP:(*(PntSta+NumMc)).CmdTriState_Sp = RcvSoMc33993W.StaSg;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_(); + +//------------------------------- + + RcvSoMc33993.ByteData.SoMc33993Byte2 = Mc33993DataSendRcv(CmdBit); + + RcvSoMc33993.ByteData.SoMc33993Byte1 = Mc33993DataSendRcv(SetBitH); + + RcvSoMc33993.ByteData.SoMc33993Byte0 = Mc33993DataSendRcv(SetBitL); + + ChangeCsMc33993(NumMc,1); +//---------------------------- + _nop_(); + _nop_(); + _nop_(); + _nop_(); +//------------------------------- + Pnt = &RcvSoMc33993; + return (Pnt); +}