#include <FlexCAN_T4.h>
#include <Snooze.h>
//************************************
#define CAN1_STB 7 // Transceiver Standby (Enable) Pin
#define CAN2_STB 12 // Transceiver Standby (Enable) Pin
#define CAN3_STB 14 // Transceiver Standby (Enable) Pin
#define CAN1_RX 23 // CAN RX Pin
#define CAN2_RX 0 // CAN RX Pin
#define CAN3_RX 30 // CAN RX Pin
SnoozeDigital digital;
SnoozeUSBSerial usb;
SnoozeBlock config(usb, digital);
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> HS1_CAN;
FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16> HS2_CAN;
FlexCAN_T4<CAN3, RX_SIZE_256, TX_SIZE_16> HS3_CAN;
/***********Timers************/
elapsedMillis keep_awake;
/**********Variables**********/
// none at the moment
void CAN_INT(){
// Setup HS1_CAN (CAN1)
HS1_CAN.begin();
HS1_CAN.setClock(CLK_60MHz);
HS1_CAN.setBaudRate(500000);
HS1_CAN.enableFIFO();
HS1_CAN.enableFIFOInterrupt();
HS1_CAN.onReceive(HS1_Receive);
// Setup HS2_CAN (CAN2)
HS2_CAN.begin();
HS2_CAN.setClock(CLK_60MHz);
HS2_CAN.setBaudRate(500000);
HS2_CAN.enableFIFO();
HS2_CAN.enableFIFOInterrupt();
HS2_CAN.onReceive(HS2_Receive);
// Setup HS3_CAN (CAN3)
HS3_CAN.begin();
HS3_CAN.setClock(CLK_60MHz);
HS3_CAN.setBaudRate(500000);
HS3_CAN.enableFIFO();
HS3_CAN.enableFIFOInterrupt();
HS3_CAN.onReceive(HS3_Receive);
}
void TRX(uint8_t mode){
digitalWrite(CAN1_STB, mode);
digitalWrite(CAN2_STB, mode);
digitalWrite(CAN3_STB, mode);
}
void setup(){
pinMode(CAN1_STB, OUTPUT);
pinMode(CAN2_STB, OUTPUT);
pinMode(CAN3_STB, OUTPUT);
digital.pinMode(CAN1_RX, INPUT, FALLING); // Set wakeup pin
digital.pinMode(CAN2_RX, INPUT, FALLING); // Set wakeup pin
digital.pinMode(CAN3_RX, INPUT, FALLING); // Set wakeup pin
CAN_INT();
}
void HS1_Receive( const CAN_message_t &msg){
keep_awake = 0;
switch(msg.id){
case 0x123:
// Do something
break;
case 0x456:
// Do something
break;
}// End of switch statement
}// End of HS1-CAN Receive
void HS2_Receive(const CAN_message_t &msg){
keep_awake = 0;
switch(msg.id){
case 0x123:
// Do something
break;
case 0x456:
// Do something
break;
}// End of switch statement
}// End of HS2-CAN Receive
void HS3_Receive( const CAN_message_t &msg){
keep_awake = 0;
switch(msg.id){
case 0x123:
// Do something
break;
case 0x456:
// Do something
break;
}// End of switch statement
}// End of HS3-CAN Receive
void loop(){
if(keep_awake >= 60000){ // If 60s has elapsed with no CAN activity, go to sleep
TRX(HIGH); // Put Transceivers In Standby Mode
Snooze.deepSleep(config); // Put System To Sleep
keep_awake = 0; // Reset keep_awake on wake up
TRX(LOW); // Put Transceivers In Active Mode
CAN_INT(); // Re-initialize CAN modules
}
HS1_CAN.events();
HS2_CAN.events();
HS3_CAN.events();
}//End of Loop