General example for CAN Bus protocol
main.cpp@0:cd34ef43f00e, 2018-05-10 (annotated)
- Committer:
- open4416
- Date:
- Thu May 10 18:34:47 2018 +0000
- Revision:
- 0:cd34ef43f00e
V1.00
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| open4416 | 0:cd34ef43f00e | 1 | /* |
| open4416 | 0:cd34ef43f00e | 2 | This is a example program for using CAN Bus protocol. |
| open4416 | 0:cd34ef43f00e | 3 | Feel free to modified to your own usage. |
| open4416 | 0:cd34ef43f00e | 4 | The function include: |
| open4416 | 0:cd34ef43f00e | 5 | |
| open4416 | 0:cd34ef43f00e | 6 | 1. Interrupt-type recieving program |
| open4416 | 0:cd34ef43f00e | 7 | A better method to cover the small mailbox size limited by hardware ( = 3 ) |
| open4416 | 0:cd34ef43f00e | 8 | Might overload the CPU when Bus jammed ( >50% Bus load ) |
| open4416 | 0:cd34ef43f00e | 9 | Might occur during any part of main function, so a proper buffering should apply |
| open4416 | 0:cd34ef43f00e | 10 | ( Avoid any varible directly change by intterupt, use a buffer and/or flags instead ) |
| open4416 | 0:cd34ef43f00e | 11 | |
| open4416 | 0:cd34ef43f00e | 12 | 2. A TX flag which decide whether a message is broadcast on the CAN Bus |
| open4416 | 0:cd34ef43f00e | 13 | "Charge OK" signal (Sent on CAN Bus frequently, if a charging manager is online, it will start charging the cells.) |
| open4416 | 0:cd34ef43f00e | 14 | |
| open4416 | 0:cd34ef43f00e | 15 | 3. A "Heart-Beat" flag which can stop specific action if specified message absence from CAN Bus |
| open4416 | 0:cd34ef43f00e | 16 | "Balance OK" signal (Sent from charging manager, dedicate the charging condition. In driving condition, no balance is allowed.) |
| open4416 | 0:cd34ef43f00e | 17 | */ |
| open4416 | 0:cd34ef43f00e | 18 | |
| open4416 | 0:cd34ef43f00e | 19 | |
| open4416 | 0:cd34ef43f00e | 20 | #include "mbed.h" |
| open4416 | 0:cd34ef43f00e | 21 | |
| open4416 | 0:cd34ef43f00e | 22 | CAN can1(PB_5, PB_13, 1000000); //Declare a CAN object |
| open4416 | 0:cd34ef43f00e | 23 | |
| open4416 | 0:cd34ef43f00e | 24 | CANMessage can_msg_1; //Use as general beffer |
| open4416 | 0:cd34ef43f00e | 25 | CANMessage can_msg_send; //Use as general buffer (Sent out) |
| open4416 | 0:cd34ef43f00e | 26 | |
| open4416 | 0:cd34ef43f00e | 27 | uint8_t CAN_flag_TX = 0; //Flag for sending out shit |
| open4416 | 0:cd34ef43f00e | 28 | |
| open4416 | 0:cd34ef43f00e | 29 | uint8_t CAN_flag_RX = 0; //Flag when recieving shit |
| open4416 | 0:cd34ef43f00e | 30 | |
| open4416 | 0:cd34ef43f00e | 31 | uint8_t CAN_flag_HeartBeat = 0; //Flag if a heart beat signal is require for certain action |
| open4416 | 0:cd34ef43f00e | 32 | |
| open4416 | 0:cd34ef43f00e | 33 | uint8_t Buffer_RX = 0; //Genral buffer, can derictly change by interrupt, might change during mian() |
| open4416 | 0:cd34ef43f00e | 34 | uint8_t Data_RX = 0; //Genral buffer, only change if condition met, keep as a constant threw whole main() |
| open4416 | 0:cd34ef43f00e | 35 | |
| open4416 | 0:cd34ef43f00e | 36 | char data_msg[8] = {0,0,0,0,0,0,0,0}; //Example varible which might change by CAN message |
| open4416 | 0:cd34ef43f00e | 37 | |
| open4416 | 0:cd34ef43f00e | 38 | void CAN1_RX(void); //Interrupt type recieving program |
| open4416 | 0:cd34ef43f00e | 39 | |
| open4416 | 0:cd34ef43f00e | 40 | |
| open4416 | 0:cd34ef43f00e | 41 | |
| open4416 | 0:cd34ef43f00e | 42 | int main() |
| open4416 | 0:cd34ef43f00e | 43 | { |
| open4416 | 0:cd34ef43f00e | 44 | CAN_flag_TX = 0; //Reset flags |
| open4416 | 0:cd34ef43f00e | 45 | CAN_flag_RX = 0; |
| open4416 | 0:cd34ef43f00e | 46 | |
| open4416 | 0:cd34ef43f00e | 47 | can1.attach(&CAN1_RX, CAN::RxIrq); //Start CAN1 Recieve Irq |
| open4416 | 0:cd34ef43f00e | 48 | |
| open4416 | 0:cd34ef43f00e | 49 | while(1) { |
| open4416 | 0:cd34ef43f00e | 50 | //Transfer data from voltile varible to normal varible ( avoid change during main() ) |
| open4416 | 0:cd34ef43f00e | 51 | while(CAN_flag_RX == 1) { //Check if varible updated (Recieve new) |
| open4416 | 0:cd34ef43f00e | 52 | Data_RX = Buffer_RX; //Transfering |
| open4416 | 0:cd34ef43f00e | 53 | CAN_flag_RX = 0; //Reset flag |
| open4416 | 0:cd34ef43f00e | 54 | } |
| open4416 | 0:cd34ef43f00e | 55 | |
| open4416 | 0:cd34ef43f00e | 56 | /* |
| open4416 | 0:cd34ef43f00e | 57 | *General Program |
| open4416 | 0:cd34ef43f00e | 58 | * |
| open4416 | 0:cd34ef43f00e | 59 | *data_msg[i] = something; //General calculation |
| open4416 | 0:cd34ef43f00e | 60 | * |
| open4416 | 0:cd34ef43f00e | 61 | *if(CAN_flag_HeartBeat == 1){ |
| open4416 | 0:cd34ef43f00e | 62 | * Do something when heart beat signal arrive |
| open4416 | 0:cd34ef43f00e | 63 | * CAN_flag_HeartBeat = 0; //Reset flag |
| open4416 | 0:cd34ef43f00e | 64 | * } |
| open4416 | 0:cd34ef43f00e | 65 | * |
| open4416 | 0:cd34ef43f00e | 66 | *CAN_flag_TX = 1; //If some condition met or need to sned out some message |
| open4416 | 0:cd34ef43f00e | 67 | */ |
| open4416 | 0:cd34ef43f00e | 68 | |
| open4416 | 0:cd34ef43f00e | 69 | while(CAN_flag_TX == 1) { |
| open4416 | 0:cd34ef43f00e | 70 | can_msg_send = CANMessage(0xFA,data_msg,8,CANData,CANStandard); //Send out data_msg with ID = 0xFA |
| open4416 | 0:cd34ef43f00e | 71 | can1.write(can_msg_send); |
| open4416 | 0:cd34ef43f00e | 72 | CAN_flag_TX = 0; //Reset flag |
| open4416 | 0:cd34ef43f00e | 73 | } |
| open4416 | 0:cd34ef43f00e | 74 | } |
| open4416 | 0:cd34ef43f00e | 75 | } |
| open4416 | 0:cd34ef43f00e | 76 | |
| open4416 | 0:cd34ef43f00e | 77 | void CAN1_RX(void) |
| open4416 | 0:cd34ef43f00e | 78 | { |
| open4416 | 0:cd34ef43f00e | 79 | if(can1.read(can_msg_1)) { //If a false interrupt then do nothing |
| open4416 | 0:cd34ef43f00e | 80 | switch(can_msg.id) { //Filtered the input message and do corresponding action |
| open4416 | 0:cd34ef43f00e | 81 | case 0xA2 : //Just an arbitary ID |
| open4416 | 0:cd34ef43f00e | 82 | Buffer_RX = can_msg_1.data[5] << 8 | can_msg_1.data[4]; //Transfer data from can_msg_1 to target varible |
| open4416 | 0:cd34ef43f00e | 83 | CAN_flag_RX = 1; //Flag if needed, in this case indicate a new varible arrived |
| open4416 | 0:cd34ef43f00e | 84 | /* |
| open4416 | 0:cd34ef43f00e | 85 | if(some bits or similar == shit) { |
| open4416 | 0:cd34ef43f00e | 86 | CAN_flag_HeartBeat = 1; //Set up a heart beat flag |
| open4416 | 0:cd34ef43f00e | 87 | } |
| open4416 | 0:cd34ef43f00e | 88 | */ |
| open4416 | 0:cd34ef43f00e | 89 | break; |
| open4416 | 0:cd34ef43f00e | 90 | |
| open4416 | 0:cd34ef43f00e | 91 | // case 0xAB : //Add more if needed |
| open4416 | 0:cd34ef43f00e | 92 | // for(int i=0; i<8; i++) { |
| open4416 | 0:cd34ef43f00e | 93 | // Fault[i] = can_msg.data[i]; |
| open4416 | 0:cd34ef43f00e | 94 | // } |
| open4416 | 0:cd34ef43f00e | 95 | // Fault_M = Fault[0] | Fault[1] | Fault[2] | Fault[3] | Fault[4] | Fault[5] | Fault[6] | Fault[7]; |
| open4416 | 0:cd34ef43f00e | 96 | // printflag = 1; |
| open4416 | 0:cd34ef43f00e | 97 | // break; |
| open4416 | 0:cd34ef43f00e | 98 | } |
| open4416 | 0:cd34ef43f00e | 99 | } |
| open4416 | 0:cd34ef43f00e | 100 | } |
SHENG-HEN HSIEH