📄 can_drv.h
字号:
#define MOB_CRC_ERROR (1<<CERR) // 0x04
#define MOB_STUFF_ERROR (1<<SERR) // 0x08
#define MOB_BIT_ERROR (1<<BERR) // 0x10
#define MOB_PENDING ((1<<RXOK)|(1<<TXOK)) // 0x60
#define MOB_NOT_REACHED ((1<<AERR)|(1<<FERR)|(1<<CERR)|(1<<SERR)|(1<<BERR)) // 0x1F
#define MOB_DISABLE 0xFF // 0xFF
// ----------
#define MOB_Tx_ENA 1
#define MOB_Rx_ENA 2
#define MOB_Rx_BENA 3
// ----------
//_____ M A C R O S ____________________________________________________________
// ----------
#define Can_reset() ( CANGCON = (1<<SWRES) )
#define Can_enable() ( CANGCON |= (1<<ENASTB))
#define Can_disable() ( CANGCON &= ~(1<<ENASTB))
// ----------
#define Can_full_abort() { CANGCON |= (1<<ABRQ); CANGCON &= ~(1<<ABRQ); }
// ----------
#define Can_conf_bt() { CANBT1=CONF_CANBT1; CANBT2=CONF_CANBT2; CANBT3=CONF_CANBT3; }
// ----------
#define Can_set_mob(mob) { CANPAGE = ((mob) << 4);}
#define Can_set_mask_mob() { CANIDM4=0xFF; CANIDM3=0xFF; CANIDM2=0xFF; CANIDM1=0xFF; }
#define Can_clear_mask_mob() { CANIDM4=0x00; CANIDM3=0x00; CANIDM2=0x00; CANIDM1=0x00; }
#define Can_clear_status_mob() { CANSTMOB=0x00; }
#define Can_clear_mob() { U8 volatile *__i_; for (__i_=&CANSTMOB; __i_<&CANSTML; __i_++) { *__i_=0x00 ;}}
// ----------
#define Can_mob_abort() ( DISABLE_MOB )
// ----------
#define Can_set_dlc(dlc) ( CANCDMOB |= (dlc) )
#define Can_set_ide() ( CANCDMOB |= (1<<IDE) )
#define Can_set_rtr() ( CANIDT4 |= (1<<RTRTAG) )
#define Can_set_rplv() ( CANCDMOB |= (1<<RPLV) )
// ----------
#define Can_clear_dlc() ( CANCDMOB &= ~DLC_MSK )
#define Can_clear_ide() ( CANCDMOB &= ~(1<<IDE) )
#define Can_clear_rtr() ( CANIDT4 &= ~(1<<RTRTAG) )
#define Can_clear_rplv() ( CANCDMOB &= ~(1<<RPLV) )
// ----------
#define DISABLE_MOB ( CANCDMOB &= (~CONMOB_MSK) )
#define Can_config_tx() { DISABLE_MOB; CANCDMOB |= (MOB_Tx_ENA << CONMOB); }
#define Can_config_rx() { DISABLE_MOB; CANCDMOB |= (MOB_Rx_ENA << CONMOB); }
#define Can_config_rx_buffer() { CANCDMOB |= (MOB_Rx_BENA << CONMOB); }
// ----------
#define Can_get_dlc() ((CANCDMOB & DLC_MSK) >> DLC )
#define Can_get_ide() ((CANCDMOB & (1<<IDE)) >> IDE )
#define Can_get_rtr() ((CANIDT4 & (1<<RTRTAG)) >> RTRTAG)
// ----------
#define Can_set_rtrmsk() ( CANIDM4 |= (1<<RTRMSK) )
#define Can_set_idemsk() ( CANIDM4 |= (1<<IDEMSK) )
// ----------
#define Can_clear_rtrmsk() ( CANIDM4 &= ~(1<<RTRMSK) )
#define Can_clear_idemsk() ( CANIDM4 &= ~(1<<IDEMSK) )
// ----------
//!< STD ID TAG Reading
#define Can_get_std_id(identifier) { *((U8 *)(&(identifier))+1) = CANIDT1>>5 ; \
*((U8 *)(&(identifier)) ) = (CANIDT2>>5)+(CANIDT1<<3); }
// ----------
//!< EXT ID TAG Reading
#define Can_get_ext_id(identifier) { *((U8 *)(&(identifier))+3) = CANIDT1>>3 ; \
*((U8 *)(&(identifier))+2) = (CANIDT2>>3)+(CANIDT1<<5); \
*((U8 *)(&(identifier))+1) = (CANIDT3>>3)+(CANIDT2<<5); \
*((U8 *)(&(identifier)) ) = (CANIDT4>>3)+(CANIDT3<<5); }
// ----------
//!< STD ID Construction
#define CAN_SET_STD_ID_10_4(identifier) (((*((U8 *)(&(identifier))+1))<<5)+((* (U8 *)(&(identifier)))>>3))
#define CAN_SET_STD_ID_3_0( identifier) (( * (U8 *)(&(identifier)) )<<5)
// ----------
//!< STD ID TAG writing
#define Can_set_std_id(identifier) { CANIDT1 = CAN_SET_STD_ID_10_4(identifier); \
CANIDT2 = CAN_SET_STD_ID_3_0( identifier); \
CANCDMOB &= (~(1<<IDE)) ; }
// ----------
//!< STD ID MASK writing
#define Can_set_std_msk(mask) { CANIDM1 = CAN_SET_STD_ID_10_4(mask); \
CANIDM2 = CAN_SET_STD_ID_3_0( mask); }
// ----------
//!< EXT ID Construction
#define CAN_SET_EXT_ID_28_21(identifier) (((*((U8 *)(&(identifier))+3))<<3)+((*((U8 *)(&(identifier))+2))>>5))
#define CAN_SET_EXT_ID_20_13(identifier) (((*((U8 *)(&(identifier))+2))<<3)+((*((U8 *)(&(identifier))+1))>>5))
#define CAN_SET_EXT_ID_12_5( identifier) (((*((U8 *)(&(identifier))+1))<<3)+((* (U8 *)(&(identifier)) )>>5))
#define CAN_SET_EXT_ID_4_0( identifier) ((* (U8 *)(&(identifier)) )<<3)
// ----------
//!< EXT ID TAG writing
#define Can_set_ext_id(identifier) { CANIDT1 = CAN_SET_EXT_ID_28_21(identifier); \
CANIDT2 = CAN_SET_EXT_ID_20_13(identifier); \
CANIDT3 = CAN_SET_EXT_ID_12_5( identifier); \
CANIDT4 = CAN_SET_EXT_ID_4_0( identifier); \
CANCDMOB |= (1<<IDE); }
// ----------
//!< EXT ID MASK writing
#define Can_set_ext_msk(mask) { CANIDM1 = CAN_SET_EXT_ID_28_21(mask); \
CANIDM2 = CAN_SET_EXT_ID_20_13(mask); \
CANIDM3 = CAN_SET_EXT_ID_12_5( mask); \
CANIDM4 = CAN_SET_EXT_ID_4_0( mask); }
// ----------
//_____ D E C L A R A T I O N S ________________________________________________
//------------------------------------------------------------------------------
// @fn can_clear_all_mob
//!
//! This function clears the Mailbox content.
//! It uses Can_clear_mob() macro and clears data FIFO o MOb[0] upto
//! MOb[LAST_MOB_NB].
//!
//! @warning none.
//!
//! @param none.
//!
//! @return none.
//!
extern void can_clear_all_mob(void);
//------------------------------------------------------------------------------
// @fn can_get_mob_free
//!
//! This function returns the number of the first MOb available or 0xFF if
//! no MOb available.
//!
//! @warning none.
//!
//! @param none.
//!
//! @return Handle of MOb.
//! - MOb[0] upto MOb[LAST_MOB_NB]
//! - 0xFF if no MOb
//!
extern U8 can_get_mob_free(void);
//------------------------------------------------------------------------------
// @fn can_get_mob_status
//!
//! This function returns information "MOB completed its job"
//! if one of the RXOK or TXOK Flag is set or "MOB not completed its job
//! if no RXOK and TXOK flags are set.
//! Previously, this function checks if the MOb is configured or not and in
//! case of the MOB not configured, the function returns "MOB_DISABLE".
//!
//! @warning none.
//!
//! @param none.
//!
//! @return MOb Status.
//! - MOB_NOT_COMPLETED
//! - MOB_TX_COMPLETED
//! - MOB_RX_COMPLETED
//! - MOB_RX_DLC_WARNING
//! - MOB_DISABLE
//! or should be a combination of the following errors
//! - MOB_ACK_ERROR
//! - MOB_FORM_ERROR
//! - MOB_CRC_ERROR
//! - MOB_STUFF_ERROR
//! - MOB_BIT_ERROR
//!
extern U8 can_get_mob_status(void);
//------------------------------------------------------------------------------
// @fn can_get_data
//!
//! This function copy the data from the selected MOb to the address
//! passed as parameter.
//!
//! @warning none.
//!
//! @param CAN message data address.
//!
//! @return none.
//!
extern void can_get_data(U8* p_can_message_data);
//------------------------------------------------------------------------------
// @fn can_auto_baudrate
//!
//! This function programs itself the CANBTx registers if there is some
//! communication (activity) on the CAN bus.
//!
//! @warning complex function not yet implemented
//!
//! @param Evaluation needed
//! ==0: start the evaluation from faster baudrate
//! ==1: (re)start an evaluation with CANBTx registers contents
//!
//! @return Baudrate Status
//! ==0: research of bit timing configuration failed
//! ==1: baudrate performed
//!
extern U8 can_auto_baudrate(U8 eval);
//------------------------------------------------------------------------------
// @fn can_fixed_baudrate
//!
//! This function programs the CANBTx registers with the predefined values
//! CONF_CANBT1, CONF_CANBT2, CONF_CANBT3.
//!
//! @warning
//!
//! @param (unused!)
//!
//! @return Baudrate Status
//! fixed = 1: baudrate performed
//!
extern U8 can_fixed_baudrate(U8 eval);
//______________________________________________________________________________
#endif // _CAN_DRV_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -