📄 can_drv.h
字号:
//******************************************************************************
//! @file $RCSfile: can_drv.h,v $
//!
//! Copyright (c) 2006 Atmel.
//!
//! Use of this program is subject to Atmel's End User License Agreement.
//! Please read file license.txt for copyright notice.
//!
//! @brief This file contains the prototypes and the macros of the
//! low level functions (drivers) of:
//! - CAN (Controller Array Network)
//! - for AT90CAN128/64/32.
//!
//! This file can be parsed by Doxygen for automatic documentation generation.
//! This file has been validated with AVRStudio-412462/WinAVR-20060125.
//!
//! @version $Revision: 3.10 $ $Name: jtellier $
//!
//! @todo
//! @bug
//******************************************************************************
#ifndef _CAN_DRV_H_
#define _CAN_DRV_H_
//_____ I N C L U D E S ________________________________________________________
//_____ D E F I N I T I O N S __________________________________________________
// ----------
#ifndef FOSC
# error You must define FOSC in "common.h" file
#endif
// ----------
#ifndef CAN_BAUDRATE
# error You must define CAN_BAUDRATE in "common.h" file
#endif
#define CAN_AUTOBAUD 0
// ----------
#if FOSC == 16000 //!< Fclkio = 16 MHz, Tclkio = 62.5 ns
# if CAN_BAUDRATE == 100 //!< -- 100Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x12 // Tscl = 10x Tclkio = 625 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 125 //!< -- 125Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x0E // Tscl = 8x Tclkio = 500 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 200 //!< -- 200Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x08 // Tscl = 5x Tclkio = 312.5 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 250 //!< -- 250Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x06 // Tscl = 4x Tclkio = 250 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 500 //!< -- 500Kb/s, 8x Tscl, sampling at 75%
# define CONF_CANBT1 0x06 // Tscl = 4x Tclkio = 250 ns
# define CONF_CANBT2 0x04 // Tsync = 1x Tscl, Tprs = 3x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x13 // Tpsh1 = 2x Tscl, Tpsh2 = 2x Tscl, 3 sample points
# elif CAN_BAUDRATE == 1000 //!< -- 1 Mb/s, 8x Tscl, sampling at 75%
# define CONF_CANBT1 0x02 // Tscl = 2x Tclkio = 125 ns
# define CONF_CANBT2 0x04 // Tsync = 1x Tscl, Tprs = 3x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x13 // Tpsh1 = 2x Tscl, Tpsh2 = 2x Tscl, 3 sample points
# elif CAN_BAUDRATE == CAN_AUTOBAUD // Treated later in the file
# define CONF_CANBT1 0x00 // Unused
# define CONF_CANBT2 0x00 // Unused
# define CONF_CANBT3 0x00 // Unused
# else
# error This CAN_BAUDRATE value is not in "can_drv.h" file
# endif
#elif FOSC == 12000 //!< Fclkio = 12 MHz, Tclkio = 83.333 ns
# if CAN_BAUDRATE == 100 //!< -- 100Kb/s, 20x Tscl, sampling at 75%
# define CONF_CANBT1 0x0A // Tscl = 6x Tclkio = 500 ns
# define CONF_CANBT2 0x0E // Tsync = 1x Tscl, Tprs = 8x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x4B // Tpsh1 = 6x Tscl, Tpsh2 = 5x Tscl, 3 sample points
# elif CAN_BAUDRATE == 125 //!< -- 125Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x0A // Tscl = 6x Tclkio = 500 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 200 //!< -- 200Kb/s, 20x Tscl, sampling at 75%
# define CONF_CANBT1 0x04 // Tscl = 3x Tclkio = 250 ns
# define CONF_CANBT2 0x0E // Tsync = 1x Tscl, Tprs = 8x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x4B // Tpsh1 = 6x Tscl, Tpsh2 = 5x Tscl, 3 sample points
# elif CAN_BAUDRATE == 250 //!< -- 250Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x04 // Tscl = 3x Tclkio = 250 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 500 //!< -- 500Kb/s, 12x Tscl, sampling at 75%
# define CONF_CANBT1 0x02 // Tscl = 2x Tclkio = 166.666 ns
# define CONF_CANBT2 0x08 // Tsync = 1x Tscl, Tprs = 5x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x25 // Tpsh1 = 3x Tscl, Tpsh2 = 3x Tscl, 3 sample points
# elif CAN_BAUDRATE == 1000 //!< -- 1 Mb/s, 12x Tscl, sampling at 75%
# define CONF_CANBT1 0x00 // Tscl = 1x Tclkio = 83.333 ns
# define CONF_CANBT2 0x08 // Tsync = 1x Tscl, Tprs = 5x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x25 // Tpsh1 = 3x Tscl, Tpsh2 = 3x Tscl, 3 sample points
# elif CAN_BAUDRATE == CAN_AUTOBAUD // Treated later in the file
# define CONF_CANBT1 0x00 // Unused
# define CONF_CANBT2 0x00 // Unused
# define CONF_CANBT3 0x00 // Unused
# else
# error This CAN_BAUDRATE value is not in "can_drv.h" file
# endif
#elif FOSC == 8000 //!< Fclkio = 8 MHz, Tclkio = 125 ns
# if CAN_BAUDRATE == 100 //!< -- 100Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x08 // Tscl = 5x Tclkio = 625 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 125 //!< -- 125Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x06 // Tscl = 4x Tclkio = 500 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 200 //!< -- 200Kb/s, 20x Tscl, sampling at 75%
# define CONF_CANBT1 0x02 // Tscl = 2x Tclkio = 250 ns
# define CONF_CANBT2 0x0E // Tsync = 1x Tscl, Tprs = 8x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x4B // Tpsh1 = 6x Tscl, Tpsh2 = 5x Tscl, 3 sample points
# elif CAN_BAUDRATE == 250 //!< -- 250Kb/s, 16x Tscl, sampling at 75%
# define CONF_CANBT1 0x02 // Tscl = 2x Tclkio = 250 ns
# define CONF_CANBT2 0x0C // Tsync = 1x Tscl, Tprs = 7x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x37 // Tpsh1 = 4x Tscl, Tpsh2 = 4x Tscl, 3 sample points
# elif CAN_BAUDRATE == 500 //!< -- 500Kb/s, 8x Tscl, sampling at 75%
# define CONF_CANBT1 0x02 // Tscl = 2x Tclkio = 250 ns
# define CONF_CANBT2 0x04 // Tsync = 1x Tscl, Tprs = 3x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x13 // Tpsh1 = 2x Tscl, Tpsh2 = 2x Tscl, 3 sample points
# elif CAN_BAUDRATE == 1000 //!< -- 1 Mb/s, 8x Tscl, sampling at 75%
# define CONF_CANBT1 0x00 // Tscl = 1x Tclkio = 125 ns
# define CONF_CANBT2 0x04 // Tsync = 1x Tscl, Tprs = 3x Tscl, Tsjw = 1x Tscl
# define CONF_CANBT3 0x13 // Tpsh1 = 2x Tscl, Tpsh2 = 2x Tscl, 3 sample points
# elif CAN_BAUDRATE == CAN_AUTOBAUD // Treated later in the file
# define CONF_CANBT1 0x00 // Unused
# define CONF_CANBT2 0x00 // Unused
# define CONF_CANBT3 0x00 // Unused
# else
# error This CAN_BAUDRATE value is not in "can_drv.h" file
# endif
#else
# error This FOSC value is not in "can_drv.h" file
#endif
// ----------
//! The first action of "can_bit_timing()" is to reset the CAN controller
//! "can_bit_timing()" lets the CAN controller disable
//! "can_bit_timing()" returns 1 if the setting of CANBTx registers is available
//! and returns 0 if the setting of CANBTx registers is wrong
#if CAN_BAUDRATE == CAN_AUTOBAUD
# define Can_bit_timing(mode) (can_auto_baudrate(mode) )
#else
# define Can_bit_timing(mode) (can_fixed_baudrate(mode))
#endif
// ----------
#define CAN_PORT_IN PIND
#define CAN_PORT_DIR DDRD
#define CAN_PORT_OUT PORTD
#define CAN_INPUT_PIN 6
#define CAN_OUTPUT_PIN 5
// ----------
#define ERR_GEN_MSK ((1<<SERG)|(1<<CERG)|(1<<FERG)|(1<<AERG)) //! MaSK for GENeral ERRors INTerrupts
#define INT_GEN_MSK ((1<<BOFFIT)|(1<<BXOK)|(ERR_GEN_MSK)) //! MaSK for GENeral INTerrupts
#define BRP_MSK ((1<<BRP5)|(1<<BRP4)|(1<<BRP3)|(1<<BRP2)|(1<<BRP1)|(1<<BRP0)) //! Mask for BRP in CANBT1
#define SJW_MSK ((1<<SJW1)|(1<<SJW0)) //! MaSK for SJW in CANBT2
#define PRS_MSK ((1<<PRS2)|(1<<PRS1)|(1<<PRS0)) //! MaSK for PRS in CANBT2
#define PHS2_MSK ((1<<PHS22)|(1<<PHS21)|(1<<PHS20)) //! MaSK for PHS2 in CANBT2
#define PHS1_MSK ((1<<PHS12)|(1<<PHS11)|(1<<PHS10)) //! MaSK for PHS1 in CANBT2
#define BRP (BRP0) //! BRP in CANBT1
#define SJW (SJW0) //! SJW in CANBT2
#define PRS (PRS0) //! PRS in CANBT2
#define PHS2 (PHS20) //! PHS2 in CANBT2
#define PHS1 (PHS10) //! PHS1 in CANBT2
#define HPMOB_MSK ((1<<HPMOB3)|(1<<HPMOB2)|(1<<HPMOB1)|(1<<HPMOB0)) //! MaSK for MOb in HPMOB
#define MOBNB_MSK ((1<<MOBNB3)|(1<<MOBNB2)|(1<<MOBNB1)|(1<<MOBNB0)) //! MaSK for MOb in CANPAGE
#define ERR_MOB_MSK ((1<<BERR)|(1<<SERR)|(1<<CERR)|(1<<FERR)|(1<<AERR)) //! MaSK for MOb ERRors
#define INT_MOB_MSK ((1<<TXOK)|(1<<RXOK)|(1<<BERR)|(1<<SERR)|(1<<CERR)|(1<<FERR)|(1<<AERR)) //! MaSK for MOb INTerrupts
#define CONMOB_MSK ((1<<CONMOB1)|(1<<CONMOB0)) //! MaSK for CONfiguration MOb
#define DLC_MSK ((1<<DLC3)|(1<<DLC2)|(1<<DLC1)|(1<<DLC0)) //! MaSK for Data Length Coding
#define CONMOB (CONMOB0) //! CONfiguration MOb
#define DLC (DLC0) //! Data Length Coding
// ----------
#define BRP_MIN 1 //! Prescaler of FOSC (TQ generation)
#define BRP_MAX 64
#define NTQ_MIN 8 //! Number of TQ in one CAN bit
#define NTQ_MAX 25
//! True segment values in TQ
#define PRS_MIN 1 //! Propagation segment
#define PRS_MAX 8
#define PHS1_MIN 2 //! Phase segment 1
#define PHS1_MAX 8
#define PHS2_MIN 2 //! Phase segment 2
#define PHS2_MAX 8
#define SJW_MIN 1 //! Synchro jump width
#define SJW_MAX 4
// ----------
#define NB_MOB 15
#define NB_DATA_MAX 8
#define LAST_MOB_NB (NB_MOB-1)
#define NO_MOB 0xFF
// ----------
typedef enum {
MOB_0, MOB_1, MOB_2, MOB_3, MOB_4, MOB_5, MOB_6, MOB_7,
MOB_8, MOB_9, MOB_10, MOB_11, MOB_12, MOB_13, MOB_14 } can_mob_t;
// ----------
#define STATUS_CLEARED 0x00
// ----------
#define MOB_NOT_COMPLETED 0x00 // 0x00
#define MOB_TX_COMPLETED (1<<TXOK) // 0x40
#define MOB_RX_COMPLETED (1<<RXOK) // 0x20
#define MOB_RX_COMPLETED_DLCW ((1<<RXOK)|(1<<DLCW)) // 0xA0
#define MOB_ACK_ERROR (1<<AERR) // 0x01
#define MOB_FORM_ERROR (1<<FERR) // 0x02
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -