00001
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef _CANIF_H_
00050 #define _CANIF_H_
00051
00052
00053 #include "avr32/io.h"
00054 #include "compiler.h"
00055 #include "preprocessor.h"
00056 #include "conf_can.h"
00057
00058
00059
00060 typedef struct
00061 {
00062 union{
00063 struct{
00064 U32 id : 32;
00065 U32 id_mask : 32;
00066 };
00067 struct{
00068 U32 : 1;
00069 U32 rtr_bit : 1;
00070 U32 ide_bit : 1;
00071 U32 id_bit : 29;
00072 U32 : 1;
00073 U32 rtr_mask_bit : 1;
00074 U32 ide_mask_bit : 1;
00075 U32 id_mask_bit : 29;
00076 };
00077 };
00078 Union64 data;
00079 } can_msg_t;
00080
00081
00082 #if (CAN_AUTOBAUD == TRUE)
00083 #define CANIF_bit_timing(ch) (canif_auto_baudrate(ch) )
00084 #else
00085 #define CANIF_bit_timing(ch) (canif_fixed_baudrate(ch))
00086 #endif
00087
00088
00089 #define BRP_MIN 1
00090 #define BRP_MAX 64
00091 #define NTQ_MIN 8
00092 #define NTQ_MAX 25
00093 #define PRS_MIN 1
00094 #define PRS_MAX 8
00095 #define PHS1_MIN 2
00096 #define PHS1_MAX 8
00097 #define PHS2_MIN 2
00098 #define PHS2_MAX 8
00099 #define SJW_MIN 1
00100 #define SJW_MAX 4
00101
00102 #define STATUS_CLEARED 0x00
00103 #define MOB_NOT_COMPLETED 0x00
00104 #define MOB_TX_COMPLETED (AVR32_CANIF_MOBSR_TXOK_MASK)
00105 #define MOB_RX_COMPLETED (AVR32_CANIF_MOBSR_RXOK_MASK)
00106 #define MOB_RX_COMPLETED_DLCW ((AVR32_CANIF_MOBSR_RXOK_MASK)|(AVR32_CANIF_MOBSR_DLCW_MASK))
00107 #define MOB_ACK_ERROR (AVR32_CANIF_AERR_MASK)
00108 #define MOB_FORM_ERROR (AVR32_CANIF_FERR_MASK)
00109 #define MOB_CRC_ERROR (AVR32_CANIF_CERR_MASK)
00110 #define MOB_STUFF_ERROR (AVR32_CANIF_SERR_MASK)
00111 #define MOB_BIT_ERROR (AVR32_CANIF_BERR_MASK)
00112 #define MOB_NOT_REACHED ((AVR32_CANIF_AERR_MASK)| \
00113 (AVR32_CANIF_FERR_MASK)| \
00114 (AVR32_CANIF_CERR_MASK)| \
00115 (AVR32_CANIF_SERR_MASK)| \
00116 (AVR32_CANIF_BERR_MASK))
00117 #define MOB_DISABLE 0xFF
00118 #define NO_MOB 0xff
00119 #define DATA 0
00120 #define REMOTE 1
00121 #define STD 0
00122 #define EXTD 1
00123 #define RTR_BIT 30
00124 #define IDE_BIT 29
00125
00126
00127
00128
00129
00130
00132 #define CANIF_get_ram_add(ch) ( AVR32_CANIF.channel[ch].canramb )
00133 #define CANIF_set_ram_add(ch,add) { AVR32_CANIF.channel[ch].canramb = add; }
00134
00136 #define CANIF_set_reset(ch) { AVR32_CANIF.channel[ch].canctrl = (1<<AVR32_CANIF_CANCTRL_INIT_OFFSET); }
00137 #define CANIF_clr_reset(ch) { AVR32_CANIF.channel[ch].canctrl = (0<<AVR32_CANIF_CANCTRL_INIT_OFFSET); }
00138 #define CANIF_enable(ch) { AVR32_CANIF.channel[ch].canctrl |= (1<<AVR32_CANIF_CANCTRL_CEN_OFFSET);}
00139 #define CANIF_disable(ch) { AVR32_CANIF.channel[ch].canctrl &= ~(1<<AVR32_CANIF_CANCTRL_CEN_OFFSET);}
00140 #define CANIF_full_abort(ch) { CANIF_disable(ch) }
00141 #define CANIF_send_overload(ch) { AVR32_CANIF.channel[ch].canctrl |= (1<<AVR32_CANIF_CANCTRL_OVRQ_OFFSET); }
00142 #define CANIF_enable_wakeup(ch) { AVR32_CANIF.channel[ch].canctrl |= (1<<AVR32_CANIF_CANCTRL_WKEN_OFFSET); }
00143 #define CANIF_disable_wakeup(ch) { AVR32_CANIF.channel[ch].canctrl &= ~(1<<AVR32_CANIF_CANCTRL_WKEN_OFFSET); }
00144
00146 #define CANIF_channel_enable_status(ch) ( (AVR32_CANIF.channel[ch].cansr&AVR32_CANIF_CANSR_CES_MASK) >> AVR32_CANIF_CANSR_CES_OFFSET )
00147 #define CANIF_channel_overload_status(ch) ( (AVR32_CANIF.channel[ch].cansr&AVR32_CANIF_CANSR_OVS_MASK) >> AVR32_CANIF_CANSR_OVS_OFFSET )
00148 #define CANIF_channel_receive_status(ch) ( (AVR32_CANIF.channel[ch].cansr&AVR32_CANIF_CANSR_RS_MASK) >> AVR32_CANIF_CANSR_RS_OFFSET )
00149 #define CANIF_channel_transmit_status(ch) ( (AVR32_CANIF.channel[ch].cansr&AVR32_CANIF_CANSR_TS_MASK) >> AVR32_CANIF_CANSR_TS_OFFSET )
00150
00152 #define CANIF_CHANNEL_MODE_NORMAL 0
00153 #define CANIF_CHANNEL_MODE_LISTENING 1
00154 #define CANIF_CHANNEL_MODE_LOOPBACK 2
00155 #define CANIF_get_channel_mode(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_CMODE_MASK)>> AVR32_CANIF_CANCFG_CMODE_OFFSET) )
00156 #define CANIF_set_channel_mode(ch,mode) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_CMODE_MASK); \
00157 AVR32_CANIF.channel[ch].cancfg |= (mode<<AVR32_CANIF_CANCFG_CMODE_OFFSET); }
00158 #define CANIF_get_overrun_mode(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_OVRM_MASK)>> AVR32_CANIF_CANCFG_OVRM_OFFSET) )
00159 #define CANIF_set_overrun_mode(ch) { AVR32_CANIF.channel[ch].cancfg |= (1<<AVR32_CANIF_CANCFG_OVRM_OFFSET); }
00160 #define CANIF_clr_overrun_mode(ch) { AVR32_CANIF.channel[ch].cancfg &= ~(1<<AVR32_CANIF_CANCFG_OVRM_OFFSET); }
00161 #define CANIF_get_phs1(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_PHS1_MASK)>> AVR32_CANIF_CANCFG_PHS1_OFFSET) )
00162 #define CANIF_set_phs1(ch,phs1) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_PHS1_MASK); \
00163 AVR32_CANIF.channel[ch].cancfg |= (phs1<<AVR32_CANIF_CANCFG_PHS1_OFFSET); }
00164 #define CANIF_get_phs2(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_PHS2_MASK)>> AVR32_CANIF_CANCFG_PHS2_OFFSET) )
00165 #define CANIF_set_phs2(ch,phs2) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_PHS2_MASK); \
00166 AVR32_CANIF.channel[ch].cancfg |= (phs2<<AVR32_CANIF_CANCFG_PHS2_OFFSET); }
00167 #define CANIF_get_pres(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_PRES_MASK)>> AVR32_CANIF_CANCFG_PRES_OFFSET) )
00168 #define CANIF_set_pres(ch,pres) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_PRES_MASK); \
00169 AVR32_CANIF.channel[ch].cancfg |= (pres<<AVR32_CANIF_CANCFG_PRES_OFFSET); }
00170 #define CANIF_get_prs(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_PRS_MASK)>> AVR32_CANIF_CANCFG_PRS_OFFSET) )
00171 #define CANIF_set_prs(ch,prs) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_PRS_MASK); \
00172 AVR32_CANIF.channel[ch].cancfg |= (prs<<AVR32_CANIF_CANCFG_PRS_OFFSET); }
00173 #define CANIF_get_sjw(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_SJW_MASK)>> AVR32_CANIF_CANCFG_SJW_OFFSET) )
00174 #define CANIF_set_sjw(ch,sjw) { AVR32_CANIF.channel[ch].cancfg &= ~(AVR32_CANIF_CANCFG_SJW_MASK); \
00175 AVR32_CANIF.channel[ch].cancfg |= (sjw<<AVR32_CANIF_CANCFG_SJW_OFFSET); }
00176 #define CANIF_get_sm(ch) ( ((AVR32_CANIF.channel[ch].cancfg & AVR32_CANIF_CANCFG_SM_MASK)>> AVR32_CANIF_CANCFG_SM_OFFSET) )
00177 #define CANIF_set_sm(ch,sm) { AVR32_CANIF.channel[ch].cancfg |= (sm<<AVR32_CANIF_CANCFG_SM_OFFSET); }
00178 #define CANIF_conf_bt(ch) { CANIF_set_sjw(ch,BAUDRATE##_SJW); \
00179 CANIF_set_prs(ch,BAUDRATE##_PRS); \
00180 CANIF_set_pres(ch,BAUDRATE##_PRES); \
00181 CANIF_set_phs2(ch,BAUDRATE##_PHS2); \
00182 CANIF_set_phs1(ch,BAUDRATE##_PHS1); }
00183
00185 #define CANIF_get_error_mode(ch) { ((AVR32_CANIF.channel[ch].canfc & AVR32_CANIF_CANFC_EMODE_MASK)>> AVR32_CANIF_CANFC_EMODE_OFFSET) }
00186 #define CANIF_get_tec(ch) { ((AVR32_CANIF.channel[ch].canfc & AVR32_CANIF_CANFC_TEC_MASK)>> AVR32_CANIF_CANFC_TEC_OFFSET) }
00187 #define CANIF_get_rec(ch) { ((AVR32_CANIF.channel[ch].canfc & AVR32_CANIF_CANFC_REC_MASK)>> AVR32_CANIF_CANFC_REC_OFFSET) }
00188
00190 #define CANIF_enable_interrupt(ch) { AVR32_CANIF.channel[ch].canier = 0x00000189 ; }
00191
00193 #define CANIF_disable_interrupt(ch) { AVR32_CANIF.channel[ch].canidr = 0x00000189 ; }
00194
00196 #define CANIF_get_interrupt_status(ch) ( AVR32_CANIF.channel[ch].canisr)
00197 #define CANIF_get_interrupt_error_status(ch) ( AVR32_CANIF.channel[ch].canisr & 0x3F)
00198 #define CANIF_get_interrupt_lastmob_selected(ch)( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_LSMOB_MASK)>> AVR32_CANIF_CANISR_LSMOB_OFFSET ))
00199 #define CANIF_get_interrupt_wakeup_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_WKUP_MASK)>> AVR32_CANIF_CANISR_WKUP_OFFSET ))
00200 #define CANIF_get_interrupt_berr_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_BERR_MASK)>> AVR32_CANIF_CANISR_BERR_OFFSET ))
00201 #define CANIF_get_interrupt_serr_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_SERR_MASK)>> AVR32_CANIF_CANISR_SERR_OFFSET ))
00202 #define CANIF_get_interrupt_cerr_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_cERR_MASK)>> AVR32_CANIF_CANISR_CERR_OFFSET ))
00203 #define CANIF_get_interrupt_ferr_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_FERR_MASK)>> AVR32_CANIF_CANISR_FERR_OFFSET ))
00204 #define CANIF_get_interrupt_aerr_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_AERR_MASK)>> AVR32_CANIF_CANISR_AERR_OFFSET ))
00205 #define CANIF_get_interrupt_boff_status(ch) ( ((AVR32_CANIF.channel[ch].canisr & AVR32_CANIF_CANISR_BOFF_MASK)>> AVR32_CANIF_CANISR_BOFF_OFFSET ))
00206 #define CANIF_clr_interrupt_status(ch) { AVR32_CANIF.channel[ch].caniscr = CANIF_get_interrupt_status(ch); }
00207
00209 #define CANIF_get_mobctrl(ch,mob) (((unsigned volatile long*)&(AVR32_CANIF.channel[ch].mobctrl))[mob*3])
00210 #define CANIF_set_mobctrl(ch,mob,val) (((unsigned volatile long*)&(AVR32_CANIF.channel[ch].mobctrl))[mob*3]=val)
00211 #define CANIF_mobctrl(ch,mob) (((unsigned volatile long*)&(AVR32_CANIF.channel[ch].mobctrl))[mob*3])
00212 #define CANIF_mob_clr_automode(ch,mob) { CANIF_set_mobctrl(ch,mob,CANIF_get_mobctrl(ch,mob)&~(1<<AVR32_CANIF_AM_OFFSET));}
00213 #define CANIF_mob_set_automode(ch,mob) { CANIF_set_mobctrl(ch,mob,CANIF_get_mobctrl(ch,mob)| (1<<AVR32_CANIF_AM_OFFSET));}
00214 #define CANIF_mob_clr_dlc(ch,mob) { CANIF_set_mobctrl(ch,mob,CANIF_get_mobctrl(ch,mob)&~(0x0F<<AVR32_CANIF_DLC_OFFSET));}
00215 #define CANIF_mob_set_dlc(ch,mob,dlc) { CANIF_set_mobctrl(ch,mob,(CANIF_get_mobctrl(ch,mob)| (dlc<<AVR32_CANIF_DLC_OFFSET))); }
00216 #define CANIF_mob_get_dlc(ch,mob) ( (CANIF_get_mobctrl(ch,mob)&AVR32_CANIF_DLC_MASK)>>AVR32_CANIF_DLC_OFFSET )
00217 #define CANIF_mob_clr_dir(ch,mob) { CANIF_set_mobctrl(ch,mob,CANIF_get_mobctrl(ch,mob)&~(1<<AVR32_CANIF_DIR_OFFSET));}
00218 #define CANIF_mob_set_dir(ch,mob) { CANIF_set_mobctrl(ch,mob,CANIF_get_mobctrl(ch,mob)| (1<<AVR32_CANIF_DIR_OFFSET));}
00219 #define CANIF_mob_get_dir(ch,mob) ( (CANIF_get_mobctrl(ch,mob)&AVR32_CANIF_CANDIR_MASK) >> AVR32_CANIF_DIR_OFFSET )
00220
00222 #define CANIF_mob_get_status(ch,mob) (((unsigned volatile long*) &(AVR32_CANIF.channel[ch].mobsr))[mob*3])
00223 #define CANIF_mob_set_status(ch,mob,val) {((unsigned volatile long*) &(AVR32_CANIF.channel[ch].mobscr))[mob*3]=val;}
00224 #define CANIF_mob_clear_status(ch,mob) {CANIF_mob_set_status(ch,mob,0x0F)}
00225
00227 #define CANIF_mob_get_mob_free(ch) ((AVR32_CANIF.channel[ch].mobsch&AVR32_CANIF_MOBSCH_MAV_MASK)>>AVR32_CANIF_MOBSCH_MAV_OFFSET)
00228 #define CANIF_mob_get_mob_rxok(ch) ((AVR32_CANIF.channel[ch].mobsch&AVR32_CANIF_MOBSCH_MRXOK_MASK)>>AVR32_CANIF_MOBSCH_MRXOK_OFFSET)
00229 #define CANIF_mob_get_mob_txok(ch) ((AVR32_CANIF.channel[ch].mobsch&AVR32_CANIF_MOBSCH_MTXOK_MASK)>>AVR32_CANIF_MOBSCH_MTXOK_OFFSET)
00230
00232 #define CANIF_mob_enable(ch,mob) {AVR32_CANIF.channel[ch].mober = 1<<mob;}
00233
00235 #define CANIF_mob_disable(ch,mob) {AVR32_CANIF.channel[ch].mobdr = 1<<mob;}
00236
00238 #define CANIF_mob_enable_status(ch,mob) ((AVR32_CANIF.channel[ch].mobesr >> mob)&1)
00239
00241 #define CANIF_mob_enable_interrupt(ch,mob) {AVR32_CANIF.channel[ch].mobier = 1<<mob;}
00242
00244 #define CANIF_mob_disable_interrupt(ch,mob) {AVR32_CANIF.channel[ch].mobidr = 1<<mob;}
00245
00247 #define CANIF_mob_clear_rxok_status(ch,mob) {AVR32_CANIF.channel[ch].mrxiscr = 1<<mob;}
00248
00250 #define CANIF_mob_get_rxok_status(ch,mob) ((AVR32_CANIF.channel[ch].mrxisr >> mob)& 1)
00251
00253 #define CANIF_mob_clear_txok_status(ch,mob) {AVR32_CANIF.channel[ch].mtxiscr = 1<<mob;}
00254
00256 #define CANIF_mob_get_txok_status(ch,mob) ((AVR32_CANIF.channel[ch].mtxisr >> mob)& 1)
00257
00258 #define CANIF_SIZE_OF_CANIF_MSG (sizeof(can_msg_t))
00259 #define CANIF_config_tx(ch,mob) {CANIF_mob_set_dir(ch,mob) }
00260 #define CANIF_config_rx(ch,mob) {CANIF_mob_clr_dir(ch,mob) }
00261
00262 #define CANIF_mob_allocate(ch) (CANIF_mob_get_mob_free(ch))
00263 #define CANIF_mob_free_get_addr_data(ch) (CANIF_SIZE_OF_CANIF_MSG*CANIF_mob_get_mob_free(ch)+CANIF_get_ram_add(ch))
00264 #define CANIF_mob_free_get_ptr_data(ch) ((can_msg_t *)(CANIF_SIZE_OF_CANIF_MSG*CANIF_mob_get_mob_free(ch)+CANIF_get_ram_add(ch)))
00265 #define CANIF_mob_free(ch,mob) {CANIF_mob_disable(ch,mob)}
00266 #define CANIF_mob_get_addr_data(ch,mob) ((CANIF_SIZE_OF_CANIF_MSG*mob+CANIF_get_ram_add(ch)))
00267 #define CANIF_mob_get_ptr_data(ch,mob) ((can_msg_t *)(CANIF_SIZE_OF_CANIF_MSG*mob+CANIF_get_ram_add(ch)))
00268
00269 #define CANIF_set_idemask(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->ide_mask_bit = 1;}
00270 #define CANIF_clr_idemask(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->ide_mask_bit = 0);}
00271 #define CANIF_get_idemask(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->ide_mask_bit)
00272 #define CANIF_set_rtrmask(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->rtr_mask_bit = 1;}
00273 #define CANIF_clr_rtrmask(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->rtr_mask_bit = 0;}
00274 #define CANIF_get_rtrmask(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->rtr_mask_bit)
00275 #define CANIF_set_ide(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->ide_bit = 1;}
00276 #define CANIF_clr_ide(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->ide_bit = 0;}
00277 #define CANIF_get_ide(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->ide_bit)
00278 #define CANIF_set_rtr(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->rtr_bit = 1;}
00279 #define CANIF_clr_rtr(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->rtr_bit = 0;}
00280 #define CANIF_get_rtr(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->rtr_bit )
00281
00282 #define CANIF_set_ext_id(ch,mob,_id) {(CANIF_mob_get_ptr_data(ch,mob))->id = (1<<IDE_BIT)|(_id);}
00283 #define CANIF_get_ext_id(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->id & 0x1FFFFFFF )
00284 #define CANIF_set_std_id(ch,mob,_id) {(CANIF_mob_get_ptr_data(ch,mob))->id = (_id);}
00285 #define CANIF_get_std_id(ch,mob) ((CANIF_mob_get_ptr_data(ch,mob))->id & 0x000007FF )
00286
00287 #define CANIF_set_ext_idmask(ch,mob,mask) {(CANIF_mob_get_ptr_data(ch,mob))->id_mask = mask;}
00288 #define CANIF_set_std_idmask(ch,mob,mask) {(CANIF_mob_get_ptr_data(ch,mob))->id_mask = mask;}
00289
00290 #define CANIF_clr_mob(ch,mob) {(CANIF_mob_get_ptr_data(ch,mob))->id = 0; \
00291 (CANIF_mob_get_ptr_data(ch,mob))->id_mask = 0; \
00292 (CANIF_mob_get_ptr_data(ch,mob))->data.u64 = 0;}
00293
00294 #define CANIF_set_data(ch,mob,_data) {(CANIF_mob_get_ptr_data(ch,mob))->data.u64 = _data;}
00295
00298 extern U8 canif_get_mob_status(unsigned char ch,unsigned char mob);
00299
00302 extern U8 canif_auto_baudrate (U8 ch);
00303
00306 extern U8 canif_fixed_baudrate(U8 ch);
00307
00310 extern void canif_clear_all_mob(U8 ch,
00311 U8 nb_mob);
00312
00313
00314 #endif // _CANIF_H_