Example how we use hardware CAN Acceptance Mask capability on LPC1768. Documentation is not clear !!!!! Polytech PAris SUd Orsay France
main.cpp@1:168415f9f4f0, 2016-04-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |