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

Dependencies:   mbed

Committer:
bouaziz
Date:
Wed Apr 20 08:48:44 2016 +0000
Revision:
1:168415f9f4f0
Parent:
0:01ac4cd13c69
prise en compte du filtrage CAN;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bouaziz 0:01ac4cd13c69 1 #include "mbed.h"
bouaziz 0:01ac4cd13c69 2
bouaziz 0:01ac4cd13c69 3 // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD).
bouaziz 0:01ac4cd13c69 4 CAN can2(p30, p29);
bouaziz 0:01ac4cd13c69 5 Serial pc(USBTX, USBRX); // tx, rx
bouaziz 0:01ac4cd13c69 6
bouaziz 1:168415f9f4f0 7
bouaziz 1:168415f9f4f0 8 // chaque mot 16 bits : (CANnum << 13)| (ID );
bouaziz 1:168415f9f4f0 9 // CANnum : CAN1 ou CAN2
bouaziz 1:168415f9f4f0 10 // ID sur 11 bits
bouaziz 1:168415f9f4f0 11 #define CANNUM_1 0
bouaziz 1:168415f9f4f0 12 #define CANNUM_2 1
bouaziz 1:168415f9f4f0 13 //********* MAcro pour insertion d'ientifiant à accepter ********************************
bouaziz 1:168415f9f4f0 14 #define MCANSET(NUMCAN,IDCAN) (((unsigned)NUMCAN << 13)| ((unsigned)IDCAN&0x7FF ) | (1<<11))
bouaziz 0:01ac4cd13c69 15
bouaziz 1:168415f9f4f0 16 // ident par ordre croissant
bouaziz 1:168415f9f4f0 17 // ************** Exemple de table d'identifiants à trier par ordre croissant ***********
bouaziz 1:168415f9f4f0 18 //***************************************************************************************
bouaziz 1:168415f9f4f0 19 unsigned short tableAM[]={MCANSET(CANNUM_2,0x2F0),
bouaziz 1:168415f9f4f0 20 MCANSET(CANNUM_2,0x2F8),
bouaziz 1:168415f9f4f0 21 MCANSET(CANNUM_2,0x300)};
bouaziz 1:168415f9f4f0 22 #define nb_AM 3
bouaziz 1:168415f9f4f0 23
bouaziz 1:168415f9f4f0 24 //***************************************************************************************
bouaziz 1:168415f9f4f0 25 //---- Fonction d'insertion d'une table d'identifiant à accepter dans le
bouaziz 1:168415f9f4f0 26 //---- filtrage matériel du CAN
bouaziz 1:168415f9f4f0 27 //***************************************************************************************
bouaziz 1:168415f9f4f0 28 void init_AF(unsigned short *t,unsigned n )
bouaziz 0:01ac4cd13c69 29 {
bouaziz 1:168415f9f4f0 30 uint32_t address = 0;//adresse debut table des mask sur le CAN
bouaziz 1:168415f9f4f0 31 unsigned i;
bouaziz 1:168415f9f4f0 32 long maskl;
bouaziz 0:01ac4cd13c69 33
bouaziz 0:01ac4cd13c69 34 //off mode
bouaziz 0:01ac4cd13c69 35 LPC_CANAF->AFMR = 0x00000001;
bouaziz 0:01ac4cd13c69 36 // Set explicit standard Frame
bouaziz 0:01ac4cd13c69 37 LPC_CANAF->SFF_sa = address;// word 1
bouaziz 1:168415f9f4f0 38
bouaziz 1:168415f9f4f0 39 for(i=0;i<n;i+=2){
bouaziz 1:168415f9f4f0 40 maskl=(unsigned)t[i]<<16;
bouaziz 1:168415f9f4f0 41 if(i+1<n) {
bouaziz 1:168415f9f4f0 42 maskl=maskl | (unsigned)t[i+1];
bouaziz 1:168415f9f4f0 43 }else{
bouaziz 1:168415f9f4f0 44 maskl=maskl | 0xFFFF ;
bouaziz 1:168415f9f4f0 45 }
bouaziz 1:168415f9f4f0 46 LPC_CANAF_RAM->mask[i/2]=maskl;
bouaziz 1:168415f9f4f0 47 address+=4;//add 4 bytes (1 long word) to point to none used word.
bouaziz 1:168415f9f4f0 48
bouaziz 1:168415f9f4f0 49 }
bouaziz 0:01ac4cd13c69 50 // Set group standard Frame
bouaziz 0:01ac4cd13c69 51 LPC_CANAF->SFF_GRP_sa = address;
bouaziz 1:168415f9f4f0 52
bouaziz 0:01ac4cd13c69 53 // Set explicit extended Frame
bouaziz 0:01ac4cd13c69 54 LPC_CANAF->EFF_sa = address;
bouaziz 0:01ac4cd13c69 55 // Set group extended Frame
bouaziz 0:01ac4cd13c69 56 LPC_CANAF->EFF_GRP_sa = address;
bouaziz 0:01ac4cd13c69 57 // Set End of Table
bouaziz 0:01ac4cd13c69 58 LPC_CANAF->ENDofTable = address;
bouaziz 0:01ac4cd13c69 59 // All have ENDofTable address means are not used.
bouaziz 0:01ac4cd13c69 60 //normal mode
bouaziz 0:01ac4cd13c69 61 LPC_CANAF->AFMR = 0x00000000;
bouaziz 0:01ac4cd13c69 62 return;
bouaziz 0:01ac4cd13c69 63 }
bouaziz 0:01ac4cd13c69 64
bouaziz 0:01ac4cd13c69 65 // ISR to read frame but don't work beacause no interrupts
bouaziz 0:01ac4cd13c69 66 CANMessage can_MsgRx;
bouaziz 0:01ac4cd13c69 67
bouaziz 0:01ac4cd13c69 68
bouaziz 0:01ac4cd13c69 69 // Main program
bouaziz 1:168415f9f4f0 70 //******************************* exemple utilisation filtrage CAN
bouaziz 0:01ac4cd13c69 71 int main() {
bouaziz 1:168415f9f4f0 72 can2.frequency(1000000);
bouaziz 0:01ac4cd13c69 73 // Prepare MASK
bouaziz 1:168415f9f4f0 74 init_AF(tableAM,3); // je filtre par rapport à la table donnée
bouaziz 0:01ac4cd13c69 75
bouaziz 0:01ac4cd13c69 76 while (1) {
bouaziz 1:168415f9f4f0 77
bouaziz 0:01ac4cd13c69 78 if(can2.read(can_MsgRx)){
bouaziz 0:01ac4cd13c69 79 pc.printf("REC %x\n\r",can_MsgRx.id);
bouaziz 0:01ac4cd13c69 80 }
bouaziz 0:01ac4cd13c69 81 }
bouaziz 0:01ac4cd13c69 82 }