Example how we use hardware CAN Acceptance Mask capability on LPC1768. Documentation is not clear !!!!! Polytech PAris SUd Orsay France

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }