#include <FlexCAN_T4.h>
#include <Snooze.h>
#define CAN1_STB 7 // Transceiver Standby Pin
#define CAN2_STB 12 // Transceiver Standby Pin
#define CAN3_STB 13 // Transceiver Standby Pin
#define CAN1_RX 23 // Transceiver RX Pin
#define CAN2_RX 0 // Transceiver RX Pin
#define CAN3_RX 30 // Transceiver RX Pin
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> CAN_1;
FlexCAN_T4<CAN2, RX_SIZE_256, TX_SIZE_16> CAN_2;
FlexCAN_T4<CAN3, RX_SIZE_256, TX_SIZE_16> CAN_3;
SnoozeDigital digital;
SnoozeUSBSerial usb;
SnoozeBlock config(usb, digital);
uint32_t keep_awake;
void CAN_INT(){
// Setup CAN_1
CAN_1.begin();
CAN_1.setClock(CLK_60MHz);
CAN_1.setBaudRate(500000);
CAN_1.enableFIFO();
CAN_1.enableFIFOInterrupt();
CAN_1.onReceive(CAN1_receive);
// Setup CAN_2
CAN_2.begin();
CAN_2.setClock(CLK_60MHz);
CAN_2.setBaudRate(500000);
CAN_2.enableFIFO();
CAN_2.enableFIFOInterrupt();
CAN_2.onReceive(CAN2_receive);
// Setup CAN_3
CAN_3.begin();
CAN_3.setClock(CLK_60MHz);
CAN_3.setBaudRate(500000);
CAN_3.enableFIFO();
CAN_3.enableFIFOInterrupt();
CAN_3.onReceive(CAN3_receive);
}
void setup(){
Serial.println("booting...");
if(CrashReport) Serial.print(CrashReport);
pinMode(CAN1_STB, OUTPUT);
pinMode(CAN2_STB, OUTPUT);
pinMode(CAN3_STB, OUTPUT);
digital.pinMode(CAN1_RX, INPUT, FALLING);
//digital.pinMode(CAN2_RX, INPUT, FALLING);
//digital.pinMode(CAN3_RX, INPUT, FALLING);
CAN_INT();
CrashReport.breadcrumb(1,0); // setup done
}
void CAN1_receive(const CAN_message_t &msg){
keep_awake = millis(); // Keep System Awake If CAN Traffic
Serial.println("CAN- 1");
}
void CAN2_receive(const CAN_message_t &msg){
keep_awake = millis(); // Keep System Awake If CAN Traffic
Serial.println("CAN- 2");
}
void CAN3_receive(const CAN_message_t &msg){
keep_awake = millis(); // Keep System Awake If CAN Traffic
Serial.println("CAN- 3");
}
uint32_t loopCount;
void loop(){
CrashReport.breadcrumb(2,loopCount++); // how many loops executed
CrashReport.breadcrumb(4,millis()); // time of last loop
if(millis() - keep_awake >= 5000){
Serial.println("sleeping...");
delay(5);
pinMode(CAN1_RX, INPUT); // Set Wake Up Pin
//pinMode(CAN2_RX, INPUT); // Set Wake Up Pin
//pinMode(CAN3_RX, INPUT); // Set Wake Up Pin
CrashReport.breadcrumb(1,1); // before sleep
CrashReport.breadcrumb(3,loopCount); // loop count at sleep
CrashReport.breadcrumb(5,millis()); // time at sleep
Snooze.deepSleep(config); // Put System To Sleep
NVIC_DISABLE_IRQ( IRQ_GPIO6789 ); // ***** add this *****
CrashReport.breadcrumb(1,2); // after sleep
keep_awake = millis(); // Reset Sleep Timer
CrashReport.breadcrumb(1,3); // keep_awake set
CAN_INT(); // Reinitialize CAN Driver
}
CAN_1.events();
CAN_2.events();
CAN_3.events();
}