General example for CAN Bus protocol

Dependencies:   mbed

Committer:
open4416
Date:
Thu May 10 18:34:47 2018 +0000
Revision:
0:cd34ef43f00e
V1.00

Who changed what in which revision?

UserRevisionLine numberNew 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 }