📄 spc3dps2.h
字号:
#define DDB_OUT_B 0x80 /* reserved */
#define NEW_GC_COMMAND_B 0x01 /* Global Control; DPS2 */
#define NEW_SSA_DATA_B 0x02 /* Set Slave Address; DPS2 */
#define NEW_CFG_DATA_B 0x04 /* Config Data; DPS2 */
#define NEW_PRM_DATA_B 0x08 /* Param. Data; DPS2 */
#define DIAG_BUFFER_CHANGED_B 0x10 /* Diagnostic-Buffer changed; DPS2 */
#define DX_OUT_B 0x20 /* new output-data; DPS2 */
#define POLL_END_IND_B 0x40 /* reserved */
#define REQ_PDU_IND_B 0x80 /* reserved */
/*-- indications as words --*/
#define MAC_RESET (SWAP_W(((UWORD)MAC_RESET_B)))
#define GO_LEAVE_DATA_EX (SWAP_W(((UWORD)GO_LEAVE_DATA_EX_B)))
#define BAUDRATE_DETECT (SWAP_W(((UWORD)BAUDRATE_DETECT_B)))
#define WD_DP_MODE_TIMEOUT (SWAP_W(((UWORD)WD_DP_MODE_TIMEOUT_B)))
#define USER_TIMER_CLOCK (SWAP_W(((UWORD)USER_TIMER_CLOCK_B)))
#define DDB_SCORE_ERROR (SWAP_W(((UWORD)DDB_SCORE_ERROR_B)))
#define NEW_DDB_PRM_DATA (SWAP_W(((UWORD)NEW_DDB_PRM_DATA_B)))
#define DDB_OUT (SWAP_W(((UWORD)DDB_OUT_B)))
#define NEW_GC_COMMAND (SWAP_W((((UWORD)NEW_GC_COMMAND_B) << 8)))
#define NEW_SSA_DATA (SWAP_W((((UWORD)NEW_SSA_DATA_B) << 8)))
#define NEW_CFG_DATA (SWAP_W((((UWORD)NEW_CFG_DATA_B) << 8)))
#define NEW_PRM_DATA (SWAP_W((((UWORD)NEW_PRM_DATA_B) << 8)))
#define DIAG_BUFFER_CHANGED (SWAP_W((((UWORD)DIAG_BUFFER_CHANGED_B) << 8)))
#define DX_OUT (SWAP_W((((UWORD)DX_OUT_B) << 8)))
#define POLL_END_IND (SWAP_W((((UWORD)POLL_END_IND_B) << 8)))
#define REQ_PDU_IND (SWAP_W((((UWORD)REQ_PDU_IND_B) << 8)))
/*-- indications as bit numbers --*/
#define MAC_RESET_NR 0
#define GO_LEAVE_DATA_EX_NR 1
#define BAUDRATE_DETECT_NR 2
#define WD_DP_MODE_TIMEOUT_NR 3
#define USER_TIMER_CLOCK_NR 4
#define DDB_SCORE_ERROR_NR 5
#define NEW_DDB_PRM_DATA_NR 6
#define DDB_OUT_NR 7
#define NEW_GC_COMMAND_NR 8
#define NEW_SSA_DATA_NR 9
#define NEW_CFG_DATA_NR 10
#define NEW_PRM_DATA_NR 11
#define DIAG_BUFFER_CHANGED_NR 12
#define DX_OUT_NR 13
#define POLL_END_IND_NR 14
#define REQ_PDU_IND_NR 15
/*-------------- Returncodes of DPS2_SET_CFG_DATA.. ---------------*/
#define DPS2_CFG_FINISHED 0x00
#define DPS2_CFG_CONFLICT 0x01
#define DPS2_CFG_NOT_ALLOWED 0x03
/*--------------- Returncodes of DPS2_SET_PRM_DATA.. ---------------*/
#define DPS2_PRM_FINISHED 0x00
#define DPS2_PRM_CONFLICT 0x01
#define DPS2_PRM_NOT_ALLOWED 0x03
/*---------------------- states of the DP-Statemachine ----------------------*/
#define DPS2_DP_STATE_WAIT_PRM 0x00
#define DPS2_DP_STATE_WAIT_CFG 0x01
#define DPS2_DP_STATE_DATA_EX 0x02
#define DPS2_DP_STATE_ERROR 0x03
/*---------------------- states of the WD-Statemachine ----------------------*/
#define SPC3_WD_STATE_BAUD_SEARCH 0x00
#define SPC3_WD_STATE_BAUD_CONTROL 0x01
#define SPC3_WD_STATE_DP_MODE 0x02
#define SPC3_WD_STATE_ERROR 0x03
/*------------------------ Codes for Baud-Rate -----------------------*/
#define BD_12M 0 /* 12 MBd */
#define BD_6M 1 /* 6 MBd */
#define BD_3M 2 /* 3 MBd */
#define BD_1_5M 3 /* 1.5 MBd */
#define BD_500k 4 /* 500 kBd */
#define BD_187_5k 5 /* 187.5 kBd */
#define BD_93_75k 6 /* 93.75 kBd */
#define BD_45_45k 7 /* 45.45 kBd */
#define BD_19_2k 8 /* 19.2 kBd */
#define BD_9_6k 9 /* 9.6 kBd */
/*-------------------- States of outputdata-buffer ---------------------*/
#define NEW_DOUT_BUF 0x04
#define DOUT_BUF_CLEARED 0x08
/*+-------------------------------------------------------------------------+
| M a c r o s |
+-------------------------------------------------------------------------+*/
/************ initializations and hardware-dependent settings **************/
#ifdef DPS2_USE_SPEC_PRM_BUF /* with spec_prm_buf */
#define SPC3_SET_HW_MODE(MODE)\
spc3.mode_reg0 = SWAP_W((MODE) | DP_MODE | SPEC_PRM_BUF & (~EN_FDL_DDB));
#else /* without spec_prm_buf */
#define SPC3_SET_HW_MODE(MODE)\
spc3.mode_reg0 = SWAP_W((MODE) | DP_MODE & (~EN_FDL_DDB));
#endif
#define SPC3_SET_IND(INDS) spc3.is_reg.mask = ~(INDS);
#define SPC3_SET_STATION_ADDRESS(ADDRESS) spc3.r_ts_adr = ADDRESS;
#define SPC3_SET_MINTSDR(MINTSDR) spc3.x1.w.mintsdr_val = MINTSDR;
#define SPC3_START() spc3.x1.w.mode_reg1_s = START_SPC3;
#define SPC3_GO_OFFLINE() spc3.x1.w.mode_reg1_s = GO_OFFLINE_SPC3;
#define SPC3_INIT(DPS2_IBUF_PTR)\
dps2_buf_init(&spc3.user, DPS2_IBUF_PTR, TRUE, _USE_SPEC_PRM_BUF__)
#define DPS2_SET_IDENT_NUMBER_LOW(NR) spc3.r_ident_low = NR;
#define DPS2_SET_IDENT_NUMBER_HIGH(NR) spc3.r_ident_high = NR;
#define DPS2_SET_ADD_CHG_DISABLE() spc3.r_real_no_add_change = 0xff;
#define DPS2_SET_ADD_CHG_ENABLE() spc3.r_real_no_add_change = 0x0;
#define DPS2_USER_LEAVE_MASTER() spc3.x1.w.mode_reg1_s = USER_LEAVE_MASTER;
/***************** macros for Indications *******************/
#define SPC3_GET_INDICATION() spc3.int_reg.com.w
#define SPC3_GET_IND_MAC_RESET() (spc3.int_reg.com.b[_IML] & MAC_RESET_EX_B)
#define SPC3_GET_IND_BAUDRATE_DETECT() (spc3.int_reg.com.b[_IML] & BAUDRATE_DETECT_B)
#define SPC3_GET_IND_USER_TIMER_CLOCK() (spc3.int_reg.com.b[_IML] & USER_TIMER_CLOCK_B)
#define DPS2_GET_IND_GO_LEAVE_DATA_EX() (spc3.int_reg.com.b[_IML] & GO_LEAVE_DATA_EX_B)
#define DPS2_GET_IND_WD_DP_MODE_TIMEOUT() (spc3.int_reg.com.b[_IML] & WD_DP_MODE_TIMEOUT_B)
#define DPS2_GET_IND_NEW_GC_COMMAND() (spc3.int_reg.com.b[_IMH] & NEW_GC_COMMAND_B)
#define DPS2_GET_IND_NEW_SSA_DATA() (spc3.int_reg.com.b[_IMH] & NEW_SSA_DATA_B)
#define DPS2_GET_IND_NEW_CFG_DATA() (spc3.int_reg.com.b[_IMH] & NEW_CFG_DATA_B)
#define DPS2_GET_IND_NEW_PRM_DATA() (spc3.int_reg.com.b[_IMH] & NEW_PRM_DATA_B)
#define DPS2_GET_IND_DIAG_BUFFER_CHANGED() (spc3.int_reg.com.b[_IMH] & DIAG_BUFFER_CHANGED_B)
#define DPS2_GET_IND_DX_OUT() (spc3.int_reg.com.b[_IMH] & DX_OUT_B)
#define SPC3_IND_CONFIRM(CON) spc3.int_reg.ack.w = (CON);
#define SPC3_CON_IND_MAC_RESET() spc3.int_reg.ack.b[_IML] = (UBYTE)MAC_RESET_B;
#define SPC3_CON_IND_BAUDRATE_DETECT() spc3.int_reg.ack.b[_IML] = (UBYTE)BAUDRATE_DETECT_B;
#define SPC3_CON_IND_USER_TIMER_CLOCK() spc3.int_reg.ack.b[_IML] = (UBYTE)USER_TIMER_CLOCK_B;
#define DPS2_CON_IND_GO_LEAVE_DATA_EX() spc3.int_reg.ack.b[_IML] = (UBYTE)GO_LEAVE_DATA_EX_B;
#define DPS2_CON_IND_WD_DP_MODE_TIMEOUT() spc3.int_reg.ack.b[_IML] = (UBYTE)WD_DP_MODE_TIMEOUT_B;
#define DPS2_CON_IND_NEW_GC_COMMAND() spc3.int_reg.ack.b[_IMH] = (UBYTE)NEW_GC_COMMAND_B;
#define DPS2_CON_IND_NEW_SSA_DATA() spc3.int_reg.ack.b[_IMH] = (UBYTE)NEW_SSA_DATA_B;
#define DPS2_CON_IND_DIAG_BUFFER_CHANGED() spc3.int_reg.ack.b[_IMH] = (UBYTE)DIAG_BUFFER_CHANGED_B;
#define DPS2_CON_IND_DX_OUT() spc3.int_reg.ack.b[_IMH] = (UBYTE)DX_OUT_B;
#define SPC3_SET_EOI() spc3.x1.w.mode_reg1_s = EOI_SPC3;
#define SPC3_POLL_INDICATION() spc3.int_req.w
#define SPC3_POLL_IND_MAC_RESET() (spc3.int_req.b[_IML] & MAC_RESET_B)
#define SPC3_POLL_IND_BAUDRATE_DETECT() (spc3.int_req.b[_IML] & BAUDRATE_DETECT_B)
#define SPC3_POLL_IND_USER_TIMER_CLOCK() (spc3.int_req.b[_IML] & USER_TIMER_CLOCK_B)
#define DPS2_POLL_IND_GO_LEAVE_DATA_EX() (spc3.int_req.b[_IML] & GO_LEAVE_DATA_EX_B)
#define DPS2_POLL_IND_WD_DP_MODE_TIMEOUT() (spc3.int_req.b[_IML] & WD_DP_MODE_TIMEOUT_B)
#define DPS2_POLL_IND_NEW_GC_COMMAND() (spc3.int_req.b[_IMH] & NEW_GC_COMMAND_B)
#define DPS2_POLL_IND_NEW_SSA_DATA() (spc3.int_req.b[_IMH] & NEW_SSA_DATA_B)
#define DPS2_POLL_IND_NEW_CFG_DATA() (spc3.int_req.b[_IMH] & NEW_CFG_DATA_B)
#define DPS2_POLL_IND_NEW_PRM_DATA() (spc3.int_req.b[_IMH] & NEW_PRM_DATA_B)
#define DPS2_POLL_IND_DIAG_BUFFER_CHANGED() (spc3.int_req.b[_IMH] & DIAG_BUFFER_CHANGED_B)
#define DPS2_POLL_IND_DX_OUT() (spc3.int_req.b[_IMH] & DX_OUT_B)
/*=============== DPS2-specific services for datahandling ================*/
/********************** configuration services *********************/
#define DPS2_GET_CFG_LEN() spc3.r_len_cfg_buf
#define DPS2_GET_CFG_BUF_PTR()\
( (void SPC3_PTR_ATTR*)((SPC3_PTR) &spc3 +\
(SPC3_OFFS)((((UWORD)spc3.r_cfg_buf_ptr)<<3))))
#define DPS2_SET_CFG_DATA_OK() dps2_cfg_data_ok()
#define DPS2_SET_CFG_DATA_UPDATE() dps2_cfg_data_update()
#define DPS2_SET_CFG_DATA_NOT_OK() dps2_cfg_data_not_ok()
#define DPS2_SET_READ_CFG_LEN(LEN) spc3.r_len_read_cfg_buf = LEN;
#define DPS2_GET_READ_CFG_BUF_PTR()\
( (void SPC3_PTR_ATTR*)((SPC3_OFFS)((((UWORD)spc3.r_read_cfg_buf_ptr)<<3))\
+ (SPC3_PTR) &spc3) )
/********************** parametrization services **************************/
#define DPS2_GET_PRM_LEN() spc3.r_len_prm_buf
#define DPS2_GET_PRM_BUF_PTR()\
( (void SPC3_PTR_ATTR*) ((SPC3_OFFS)((((UWORD)spc3.r_prm_buf_ptr)<<3))\
+ (SPC3_PTR) &spc3) )
#define DPS2_SET_PRM_DATA_OK() spc3.user_prm_data_ok
#define DPS2_SET_PRM_DATA_NOT_OK() spc3.user_prm_data_nok
/********************** diagnosis servives ***************************/
#define DPS2_GET_DIAG_BUF_PTR()\
( ((spc3.diag_buffer_sm & 0x03) == 0x01) ? \
(void SPC3_PTR_ATTR*)((SPC3_OFFS)(((UWORD)spc3.r_diag_buf_ptr[0])<<3) +(SPC3_PTR)&spc3)\
:(((spc3.diag_buffer_sm & 0x0c) == 0x04) ? \
(void SPC3_PTR_ATTR*)((SPC3_OFFS)(((UWORD)spc3.r_diag_buf_ptr[1])<<3) +(SPC3_PTR)&spc3)\
: SPC3_NIL) )
#define DPS2_SET_DIAG_LEN(LEN)\
( ((spc3.diag_buffer_sm & 0x03) == 0x01) ? \
(spc3.r_len_diag_buf[0] = LEN) \
: (((spc3.diag_buffer_sm & 0x0c) == 0x04) ? \
(spc3.r_len_diag_buf[1] = LEN) \
: 0xff) )
#define DPS2_SET_DIAG_STATE(STATE)\
( ((spc3.diag_buffer_sm & 0x03) == 0x01) ? \
(*((UBYTE SPC3_PTR_ATTR*)((SPC3_OFFS)(((UWORD)spc3.r_diag_buf_ptr[0])<<3) +(SPC3_PTR)&spc3)) = (UBYTE)STATE) \
:(((spc3.diag_buffer_sm & 0x0c) == 0x04) ? \
(*((UBYTE SPC3_PTR_ATTR*)((SPC3_OFFS)(((UWORD)spc3.r_diag_buf_ptr[1])<<3) +(SPC3_PTR)&spc3)) = (UBYTE)STATE) \
: ~((UBYTE)STATE)) )
#define DPS2_DIAG_UPDATE() dps2_diag_update()
#define DPS2_GET_DIAG_FLAG() (spc3.is_reg.status[_IML] & DPS2_DIAG_FLAG)
/********************** Set-Slave-Address services ***********************/
#define DPS2_GET_SSA_LEN() spc3.r_len_ssa_buf
#define DPS2_GET_SSA_BUF_PTR()\
( (void SPC3_PTR_ATTR*) ((SPC3_OFFS)((((UWORD)spc3.r_ssa_buf_ptr)<<3))\
+ (SPC3_PTR) &spc3) )
#define DPS2_FREE_SSA_BUF() _dps2_x = spc3.ssa_buffer_free_cmd;
/************** IO services ***************/
#define DPS2_SET_IO_DATA_LEN(LEN_PTR) dps2_set_io_data_len(LEN_PTR)
/************************ outputdata services *************************/
#define DPS2_OUTPUT_UPDATE_STATE(STATE) dps2_output_update_state(STATE)
#ifdef _MSC_VER
INLINE SPC3_PTR DPS2_OUTPUT_UPDATE()
{
UWORD uwIndex;
uwIndex=(spc3.x1.r.next_dout_buf_cmd & 0x03)-1;
return (void SPC3_PTR_ATTR*)
((SPC3_OFFS)
(((UWORD)(spc3.r_dout_buf_ptr[uwIndex]))<<3)
+ (SPC3_PTR)&spc3);
}
#else
#define DPS2_OUTPUT_UPDATE()\
( (void SPC3_PTR_ATTR*) ((SPC3_OFFS)\
(((UWORD)(spc3.r_dout_buf_ptr[(spc3.x1.r.next_dout_buf_cmd & 0x03)-1]))<<3)\
+ (SPC3_ADTYP)(SPC3_PTR)&spc3) )
#endif
/************************ inputdata services *************************/
#ifdef _MSC_VER
INLINE SPC3_PTR DPS2_GET_DIN_BUF_PTR(void)
{
UWORD uwIndex;
uwIndex=(spc3.x1.r.din_buffer_sm >> 4) & 0x03;
if(uwIndex)
{
return (void SPC3_PTR_ATTR*)
((SPC3_OFFS)(((UWORD)(spc3.r_din_buf_ptr[uwIndex-1]))<<3)
+ (SPC3_PTR)&spc3);
}
else
{
return SPC3_NIL;
}
}
#else
#define DPS2_GET_DIN_BUF_PTR()\
( ((spc3.x1.r.din_buffer_sm >> 4) & 0x03) ?\
((void SPC3_PTR_ATTR*)((SPC3_OFFS)\
(((UWORD)(spc3.r_din_buf_ptr[((spc3.x1.r.din_buffer_sm>>4) & 0x03)-1]))<<3)\
+ (SPC3_ADTYP)(SPC3_PTR)&spc3))\
: SPC3_NIL)
#endif
#ifdef _MSC_VER
INLINE SPC3_PTR DPS2_INPUT_UPDATE(void)
{
UWORD uwIndex;
uwIndex=(spc3.x1.r.new_din_buf_cmd & 0x03)-1;
return (void SPC3_PTR_ATTR*)
((SPC3_OFFS)(((UWORD)(spc3.r_din_buf_ptr[uwIndex]))<<3)
+ (SPC3_PTR)&spc3);
}
#else
#define DPS2_INPUT_UPDATE()\
( (void SPC3_PTR_ATTR*) ((SPC3_OFFS)\
(((UWORD)(spc3.r_din_buf_ptr[(spc3.x1.r.new_din_buf_cmd & 0x03)-1]))<<3)\
+ (SPC3_PTR)&spc3) )
#endif
/************************** Global-Control-command **************************/
#define DPS2_GET_GC_COMMAND() spc3.r_gc_command
/******************************* User-Watchdog *******************************/
#define DPS2_SET_USER_WD_VALUE(VALUE) spc3.r_user_wd_value = SWAP_W(VALUE);
#define DPS2_RESET_USER_WD() spc3.x1.w.mode_reg1_s = RES_USER_WD;
/***************************** general macros *****************************/
#define SPC3_GET_WD_STATE() ((spc3.is_reg.status[_IML] >> 6) & 0x03)
#define SPC3_GET_BAUD() (spc3.is_reg.status[_IMH] & 0x0f)
#define SPC3_GET_OFF_PASS() (spc3.is_reg.status[_IML] & SPC3_OFFLINE_PASS)
#define SPC3_GET_ACCESS_VIOLATION() (spc3.is_reg.status[_IML] & ACCESS_VIOLATION)
#define SPC3_SET_BAUD_CNTRL(VAL) spc3.x1.w.wd_baud_ctrl_val = VAL;
#define SPC3_GET_FREE_MEM(FREE_MEM) dps2_get_free_mem(FREE_MEM)
#define DPS2_GET_DP_STATE() ((spc3.is_reg.status[_IML] >> 4) & 0x03)
/*+-------------------------------------------------------------------------+
| f u n c t i o n p r o t o t y p e s |
+-------------------------------------------------------------------------+*/
/* functions of module dps2spc3.c */
extern enum SPC3_INIT_RET dps2_buf_init(UBYTE SPC3_PTR_ATTR *b_ptr,\
DPS2_BUFINIT SPC3_DATA_ATTR *dps2_bptr, UBYTE fdl_init, UBYTE spec_prm);
extern UBYTE SPC3_PTR_ATTR *dps2_get_free_mem(WORD SPC3_DATA_ATTR *buf_len);
extern DPS2_IO_DATA_LEN SPC3_DATA_ATTR *dps2_calculate_inp_outp_len\
(UBYTE SPC3_PTR_ATTR *cfg_ptr, UWORD cfg_len);
extern UBYTE dps2_set_io_data_len(DPS2_IO_DATA_LEN SPC3_DATA_ATTR *len_ptr);
extern UBYTE dps2_cfg_data_ok(void);
extern UBYTE dps2_cfg_data_update(void);
extern UBYTE dps2_cfg_data_not_ok(void);
extern void SPC3_PTR_ATTR *dps2_output_update_state(UBYTE SPC3_DATA_ATTR *state_ptr);
extern void SPC3_PTR_ATTR *dps2_diag_update(void);
/*+-------------------------------------------------------------------------+
| e x t e r n a l v a r i a b l e s |
+-------------------------------------------------------------------------+*/
/*-- dummybyte for DPS2 --*/
extern UBYTE _dps2_x;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -