Example how we use hardware CAN Acceptance Mask capability on LPC1768. Documentation is not clear !!!!! Polytech PAris SUd Orsay France
main.cpp
00001 #include "mbed.h" 00002 00003 // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). 00004 CAN can2(p30, p29); 00005 Serial pc(USBTX, USBRX); // tx, rx 00006 00007 00008 // chaque mot 16 bits : (CANnum << 13)| (ID ); 00009 // CANnum : CAN1 ou CAN2 00010 // ID sur 11 bits 00011 #define CANNUM_1 0 00012 #define CANNUM_2 1 00013 //********* MAcro pour insertion d'ientifiant à accepter ******************************** 00014 #define MCANSET(NUMCAN,IDCAN) (((unsigned)NUMCAN << 13)| ((unsigned)IDCAN&0x7FF ) | (1<<11)) 00015 00016 // ident par ordre croissant 00017 // ************** Exemple de table d'identifiants à trier par ordre croissant *********** 00018 //*************************************************************************************** 00019 unsigned short tableAM[]={MCANSET(CANNUM_2,0x2F0), 00020 MCANSET(CANNUM_2,0x2F8), 00021 MCANSET(CANNUM_2,0x300)}; 00022 #define nb_AM 3 00023 00024 //*************************************************************************************** 00025 //---- Fonction d'insertion d'une table d'identifiant à accepter dans le 00026 //---- filtrage matériel du CAN 00027 //*************************************************************************************** 00028 void init_AF(unsigned short *t,unsigned n ) 00029 { 00030 uint32_t address = 0;//adresse debut table des mask sur le CAN 00031 unsigned i; 00032 long maskl; 00033 00034 //off mode 00035 LPC_CANAF->AFMR = 0x00000001; 00036 // Set explicit standard Frame 00037 LPC_CANAF->SFF_sa = address;// word 1 00038 00039 for(i=0;i<n;i+=2){ 00040 maskl=(unsigned)t[i]<<16; 00041 if(i+1<n) { 00042 maskl=maskl | (unsigned)t[i+1]; 00043 }else{ 00044 maskl=maskl | 0xFFFF ; 00045 } 00046 LPC_CANAF_RAM->mask[i/2]=maskl; 00047 address+=4;//add 4 bytes (1 long word) to point to none used word. 00048 00049 } 00050 // Set group standard Frame 00051 LPC_CANAF->SFF_GRP_sa = address; 00052 00053 // Set explicit extended Frame 00054 LPC_CANAF->EFF_sa = address; 00055 // Set group extended Frame 00056 LPC_CANAF->EFF_GRP_sa = address; 00057 // Set End of Table 00058 LPC_CANAF->ENDofTable = address; 00059 // All have ENDofTable address means are not used. 00060 //normal mode 00061 LPC_CANAF->AFMR = 0x00000000; 00062 return; 00063 } 00064 00065 // ISR to read frame but don't work beacause no interrupts 00066 CANMessage can_MsgRx; 00067 00068 00069 // Main program 00070 //******************************* exemple utilisation filtrage CAN 00071 int main() { 00072 can2.frequency(1000000); 00073 // Prepare MASK 00074 init_AF(tableAM,3); // je filtre par rapport à la table donnée 00075 00076 while (1) { 00077 00078 if(can2.read(can_MsgRx)){ 00079 pc.printf("REC %x\n\r",can_MsgRx.id); 00080 } 00081 } 00082 }
Generated on Sun Jul 24 2022 07:58:50 by
1.7.2