include/AVR/can_drv.h
changeset 375 03fb0bfccc1f
equal deleted inserted replaced
374:b74f7ec412fc 375:03fb0bfccc1f
       
     1 //******************************************************************************
       
     2 //! @file $RCSfile$
       
     3 //!
       
     4 //! Copyright (c) 2007 Atmel.
       
     5 //!
       
     6 //! Use of this program is subject to Atmel's End User License Agreement.
       
     7 //! Please read file license.txt for copyright notice.
       
     8 //!
       
     9 //! @brief This file contains the prototypes and the macros of the
       
    10 //!        low level functions (drivers) of:
       
    11 //!             - CAN (Controller Array Network)
       
    12 //!             - for AT90CAN128/64/32.
       
    13 //!
       
    14 //! This file can be parsed by Doxygen for automatic documentation generation.
       
    15 //! This file has been validated with AVRStudio-413528/WinAVR-20070122.
       
    16 //!
       
    17 //! @version $Revision$ $Name$
       
    18 //!
       
    19 //! @todo
       
    20 //! @bug
       
    21 //******************************************************************************
       
    22 // Same stuff removed by Peter Christen
       
    23 
       
    24 #ifndef _CAN_DRV_H_
       
    25 #define _CAN_DRV_H_
       
    26 
       
    27 typedef unsigned char       U8 ;
       
    28 
       
    29 #define CAN_PORT_IN     PIND
       
    30 #define CAN_PORT_DIR    DDRD
       
    31 #define CAN_PORT_OUT    PORTD
       
    32 #define CAN_INPUT_PIN   6
       
    33 #define CAN_OUTPUT_PIN  5
       
    34     // ----------
       
    35 #define ERR_GEN_MSK ((1<<SERG)|(1<<CERG)|(1<<FERG)|(1<<AERG))            //! MaSK for GENeral ERRors INTerrupts
       
    36 #define INT_GEN_MSK ((1<<BOFFIT)|(1<<BXOK)|(ERR_GEN_MSK))                //! MaSK for GENeral INTerrupts
       
    37 
       
    38 #define BRP_MSK     ((1<<BRP5)|(1<<BRP4)|(1<<BRP3)|(1<<BRP2)|(1<<BRP1)|(1<<BRP0))  //! Mask for BRP in CANBT1
       
    39 #define SJW_MSK     ((1<<SJW1)|(1<<SJW0))                                //! MaSK for SJW  in CANBT2
       
    40 #define PRS_MSK     ((1<<PRS2)|(1<<PRS1)|(1<<PRS0))                      //! MaSK for PRS  in CANBT2
       
    41 #define PHS2_MSK    ((1<<PHS22)|(1<<PHS21)|(1<<PHS20))                   //! MaSK for PHS2 in CANBT2
       
    42 #define PHS1_MSK    ((1<<PHS12)|(1<<PHS11)|(1<<PHS10))                   //! MaSK for PHS1 in CANBT2
       
    43 #define BRP         (BRP0)                                               //! BRP  in CANBT1
       
    44 #define SJW         (SJW0)                                               //! SJW  in CANBT2
       
    45 #define PRS         (PRS0)                                               //! PRS  in CANBT2
       
    46 #define PHS2        (PHS20)                                              //! PHS2 in CANBT2
       
    47 #define PHS1        (PHS10)                                              //! PHS1 in CANBT2
       
    48 
       
    49 #define HPMOB_MSK   ((1<<HPMOB3)|(1<<HPMOB2)|(1<<HPMOB1)|(1<<HPMOB0))    //! MaSK for MOb in HPMOB
       
    50 #define MOBNB_MSK   ((1<<MOBNB3)|(1<<MOBNB2)|(1<<MOBNB1)|(1<<MOBNB0))    //! MaSK for MOb in CANPAGE
       
    51 
       
    52 #define ERR_MOB_MSK ((1<<BERR)|(1<<SERR)|(1<<CERR)|(1<<FERR)|(1<<AERR))  //! MaSK for MOb ERRors
       
    53 #define INT_MOB_MSK ((1<<TXOK)|(1<<RXOK)|(1<<BERR)|(1<<SERR)|(1<<CERR)|(1<<FERR)|(1<<AERR)) //! MaSK for MOb INTerrupts
       
    54 
       
    55 #define CONMOB_MSK  ((1<<CONMOB1)|(1<<CONMOB0))                          //! MaSK for CONfiguration MOb
       
    56 #define DLC_MSK     ((1<<DLC3)|(1<<DLC2)|(1<<DLC1)|(1<<DLC0))            //! MaSK for Data Length Coding
       
    57 #define CONMOB      (CONMOB0)                                            //! CONfiguration MOb
       
    58 #define DLC         (DLC0)                                               //! Data Length Coding
       
    59     // ----------
       
    60 #define BRP_MIN     1       //! Prescaler of FOSC (TQ generation)
       
    61 #define BRP_MAX     64
       
    62 #define NTQ_MIN     8       //! Number of TQ in one CAN bit
       
    63 #define NTQ_MAX     25
       
    64                             //! True segment values in TQ
       
    65 #define PRS_MIN     1       //! Propagation segment
       
    66 #define PRS_MAX     8
       
    67 #define PHS1_MIN    2       //! Phase segment 1
       
    68 #define PHS1_MAX    8
       
    69 #define PHS2_MIN    2       //! Phase segment 2
       
    70 #define PHS2_MAX    8
       
    71 #define SJW_MIN     1       //! Synchro jump width
       
    72 #define SJW_MAX     4
       
    73     // ----------
       
    74 #define NB_MOB       15
       
    75 #define NB_DATA_MAX  8
       
    76 #define LAST_MOB_NB  (NB_MOB-1)
       
    77 #define NO_MOB       0xFF
       
    78     // ----------
       
    79 typedef enum {
       
    80         MOB_0,  MOB_1, MOB_2,  MOB_3,  MOB_4,  MOB_5,  MOB_6, MOB_7,
       
    81         MOB_8,  MOB_9, MOB_10, MOB_11, MOB_12, MOB_13, MOB_14        } can_mob_t;
       
    82     // ----------
       
    83 #define STATUS_CLEARED            0x00
       
    84     // ----------
       
    85 #define MOB_NOT_COMPLETED         0x00                                              // 0x00
       
    86 #define MOB_TX_COMPLETED        (1<<TXOK)                                           // 0x40
       
    87 #define MOB_RX_COMPLETED        (1<<RXOK)                                           // 0x20
       
    88 #define MOB_RX_COMPLETED_DLCW  ((1<<RXOK)|(1<<DLCW))                                // 0xA0
       
    89 #define MOB_ACK_ERROR           (1<<AERR)                                           // 0x01
       
    90 #define MOB_FORM_ERROR          (1<<FERR)                                           // 0x02
       
    91 #define MOB_CRC_ERROR           (1<<CERR)                                           // 0x04
       
    92 #define MOB_STUFF_ERROR         (1<<SERR)                                           // 0x08
       
    93 #define MOB_BIT_ERROR           (1<<BERR)                                           // 0x10
       
    94 #define MOB_PENDING            ((1<<RXOK)|(1<<TXOK))                                // 0x60
       
    95 #define MOB_NOT_REACHED        ((1<<AERR)|(1<<FERR)|(1<<CERR)|(1<<SERR)|(1<<BERR))  // 0x1F
       
    96 #define MOB_DISABLE               0xFF                                              // 0xFF
       
    97     // ----------
       
    98 #define MOB_Tx_ENA  1
       
    99 #define MOB_Rx_ENA  2
       
   100 #define MOB_Rx_BENA 3
       
   101     // ----------
       
   102 
       
   103 //_____ M A C R O S ____________________________________________________________
       
   104 
       
   105     // ----------
       
   106 #define Can_reset()       ( CANGCON  =  (1<<SWRES) )
       
   107 #define Can_enable()      ( CANGCON |=  (1<<ENASTB))
       
   108 #define Can_disable()     ( CANGCON &= ~(1<<ENASTB))
       
   109     // ----------
       
   110 #define Can_full_abort()  { CANGCON |=  (1<<ABRQ); CANGCON &= ~(1<<ABRQ); }
       
   111     // ----------
       
   112 #define Can_conf_bt()     { CANBT1=CONF_CANBT1; CANBT2=CONF_CANBT2; CANBT3=CONF_CANBT3; }
       
   113     // ----------
       
   114 #define Can_set_mob(mob)       { CANPAGE = ((mob) << 4);}
       
   115 #define Can_set_mask_mob()     {  CANIDM4=0xFF; CANIDM3=0xFF; CANIDM2=0xFF; CANIDM1=0xFF; }
       
   116 #define Can_clear_mask_mob()   {  CANIDM4=0x00; CANIDM3=0x00; CANIDM2=0x00; CANIDM1=0x00; }
       
   117 #define Can_clear_status_mob() { CANSTMOB=0x00; }
       
   118 #define Can_clear_mob()        { U8  volatile *__i_; for (__i_=&CANSTMOB; __i_<&CANSTML; __i_++) { *__i_=0x00 ;}}
       
   119     // ----------
       
   120 #define Can_mob_abort()   ( DISABLE_MOB )
       
   121     // ----------
       
   122 #define Can_set_dlc(dlc)  ( CANCDMOB |= (dlc)        )
       
   123 #define Can_set_ide()     ( CANCDMOB |= (1<<IDE)     )
       
   124 #define Can_set_rtr()     ( CANIDT4  |= (1<<RTRTAG)  )
       
   125 #define Can_set_rplv()    ( CANCDMOB |= (1<<RPLV)    )
       
   126     // ----------
       
   127 #define Can_clear_dlc()   ( CANCDMOB &= ~DLC_MSK     )
       
   128 #define Can_clear_ide()   ( CANCDMOB &= ~(1<<IDE)    )
       
   129 #define Can_clear_rtr()   ( CANIDT4  &= ~(1<<RTRTAG) )
       
   130 #define Can_clear_rplv()  ( CANCDMOB &= ~(1<<RPLV)   )
       
   131     // ----------
       
   132 #define DISABLE_MOB       ( CANCDMOB &= (~CONMOB_MSK) )
       
   133 #define Can_config_tx()        { DISABLE_MOB; CANCDMOB |= (MOB_Tx_ENA  << CONMOB); }
       
   134 #define Can_config_rx()        { DISABLE_MOB; CANCDMOB |= (MOB_Rx_ENA  << CONMOB); }
       
   135 #define Can_config_rx_buffer() {              CANCDMOB |= (MOB_Rx_BENA << CONMOB); }
       
   136     // ----------
       
   137 #define Can_get_dlc()      ((CANCDMOB &  DLC_MSK)     >> DLC   )
       
   138 #define Can_get_ide()      ((CANCDMOB &  (1<<IDE))    >> IDE   )
       
   139 #define Can_get_rtr()      ((CANIDT4  &  (1<<RTRTAG)) >> RTRTAG)
       
   140     // ----------
       
   141 #define Can_set_rtrmsk()   ( CANIDM4 |= (1<<RTRMSK) )
       
   142 #define Can_set_idemsk()   ( CANIDM4 |= (1<<IDEMSK) )
       
   143     // ----------
       
   144 #define Can_clear_rtrmsk() ( CANIDM4 &= ~(1<<RTRMSK) )
       
   145 #define Can_clear_idemsk() ( CANIDM4 &= ~(1<<IDEMSK) )
       
   146     // ----------
       
   147                 //!< STD ID TAG Reading
       
   148 #define Can_get_std_id(identifier)  { *((U8 *)(&(identifier))+1) =  CANIDT1>>5              ; \
       
   149                                       *((U8 *)(&(identifier))  ) = (CANIDT2>>5)+(CANIDT1<<3); }
       
   150     // ----------
       
   151                 //!< EXT ID TAG Reading
       
   152 #define Can_get_ext_id(identifier)  { *((U8 *)(&(identifier))+3) =  CANIDT1>>3              ; \
       
   153                                       *((U8 *)(&(identifier))+2) = (CANIDT2>>3)+(CANIDT1<<5); \
       
   154                                       *((U8 *)(&(identifier))+1) = (CANIDT3>>3)+(CANIDT2<<5); \
       
   155                                       *((U8 *)(&(identifier))  ) = (CANIDT4>>3)+(CANIDT3<<5); }
       
   156     // ----------
       
   157                 //!< STD ID Construction
       
   158 #define CAN_SET_STD_ID_10_4(identifier)  (((*((U8 *)(&(identifier))+1))<<5)+((* (U8 *)(&(identifier)))>>3))
       
   159 #define CAN_SET_STD_ID_3_0( identifier)  (( * (U8 *)(&(identifier))   )<<5)
       
   160     // ----------
       
   161                 //!< STD ID TAG writing
       
   162 #define Can_set_std_id(identifier)  { CANIDT1   = CAN_SET_STD_ID_10_4(identifier); \
       
   163                                       CANIDT2   = CAN_SET_STD_ID_3_0( identifier); \
       
   164                                       CANCDMOB &= (~(1<<IDE))                    ; }
       
   165     // ----------
       
   166                 //!< STD ID MASK writing
       
   167 #define Can_set_std_msk(mask)       { CANIDM1   = CAN_SET_STD_ID_10_4(mask); \
       
   168                                       CANIDM2   = CAN_SET_STD_ID_3_0( mask); }
       
   169     // ----------
       
   170                 //!< EXT ID Construction
       
   171 #define CAN_SET_EXT_ID_28_21(identifier)  (((*((U8 *)(&(identifier))+3))<<3)+((*((U8 *)(&(identifier))+2))>>5))
       
   172 #define CAN_SET_EXT_ID_20_13(identifier)  (((*((U8 *)(&(identifier))+2))<<3)+((*((U8 *)(&(identifier))+1))>>5))
       
   173 #define CAN_SET_EXT_ID_12_5( identifier)  (((*((U8 *)(&(identifier))+1))<<3)+((* (U8 *)(&(identifier))   )>>5))
       
   174 #define CAN_SET_EXT_ID_4_0(  identifier)   ((* (U8 *)(&(identifier))   )<<3)
       
   175     // ----------
       
   176                 //!< EXT ID TAG writing
       
   177 #define Can_set_ext_id(identifier)  { CANIDT1   = CAN_SET_EXT_ID_28_21(identifier); \
       
   178                                       CANIDT2   = CAN_SET_EXT_ID_20_13(identifier); \
       
   179                                       CANIDT3   = CAN_SET_EXT_ID_12_5( identifier); \
       
   180                                       CANIDT4   = CAN_SET_EXT_ID_4_0(  identifier); \
       
   181                                       CANCDMOB |= (1<<IDE);                         }
       
   182     // ----------
       
   183                 //!< EXT ID MASK writing
       
   184 #define Can_set_ext_msk(mask)       { CANIDM1   = CAN_SET_EXT_ID_28_21(mask); \
       
   185                                       CANIDM2   = CAN_SET_EXT_ID_20_13(mask); \
       
   186                                       CANIDM3   = CAN_SET_EXT_ID_12_5( mask); \
       
   187                                       CANIDM4   = CAN_SET_EXT_ID_4_0(  mask); }
       
   188 #endif // _CAN_DRV_H_
       
   189 
       
   190 
       
   191