Skip to content

Instantly share code, notes, and snippets.

@pilotak
Created September 29, 2021 13:23
Show Gist options
  • Save pilotak/a53df3b937a728970da9d7a25ce285a6 to your computer and use it in GitHub Desktop.
Save pilotak/a53df3b937a728970da9d7a25ce285a6 to your computer and use it in GitHub Desktop.
Mbed OS6 CAN bus error handling
#include <mbed.h>
RawCAN can(CAN_RXD_pin, CAN_TXD_pin);
DigitalOut can_sleep(CAN_STANDBY_pin, 0);
int main() {
can.frequency(250000);
can.mode(CAN::Normal);
uint8_t tderr_prev = 0;
bool bus_state = true;
while (1) {
CANMessage msg;
msg.id = 0;
msg.id |= 6 << 26; // priority
msg.id |= 0xFF00 << 8; // SPN
msg.id |= 0xA0; // SA
msg.len = 8;
msg.type = CANData;
msg.format = CANExtended;
memset(msg.data, 0, 8);
int test = can.write(msg);
uint8_t tderr = can.tderror();
printf("prev:%u, now: %u, stat: %i\n", tderr_prev, tderr, test);
if (tderr > 127) {
// 255 - 8 (maximum tderror count) - (each error is + 8 for counter)
if (tderr > 247) {
if (tderr == tderr_prev) {
printf("Bus Off\n");
can.reset();
can.frequency(250000);
can.mode(CAN::Normal);
}
} else {
if (tderr >= tderr_prev) {
if (bus_state) {
bus_state = false;
printf("Error Passive\n");
}
} else {
if (!bus_state) {
bus_state = true;
printf("Bus recovered\n");
}
}
}
} else if (!bus_state) {
bus_state = true;
printf("Bus Active\n");
}
tderr_prev = tderr;
ThisThread::sleep_for(1000ms);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment