Код
typedef enum { f100kbps, f125kbps, f200kbps, f250kbps, f500kbps, f1000kbps } baudrate_e;
bool can_bt_init ( baudrate_e br ) {
#ifdef F_CPU
#if F_CPU == 16000000ul
switch ( br ){
case f100kbps: { CANBT1 = 0x26; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f125kbps: { CANBT1 = 0x1E; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f200kbps: { CANBT1 = 0x12; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f250kbps: { CANBT1 = 0x0E; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f500kbps: { CANBT1 = 0x06; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f1000kbps: { CANBT1 = 0x02; CANBT2 = 0x04; CANBT3 = 0x13; break; }
default : return FALSE;
}
#elif F_CPU == 14745600ul
switch ( br ){
case f100kbps: { CANBT1 = 0x0C; CANBT2 = 0x0E; CANBT3 = 0x5A; break; } //100.3kbps
case f125kbps: { CANBT1 = 0x0C; CANBT2 = 0x0E; CANBT3 = 0x36; break; } //123.913kbps
case f200kbps: { CANBT1 = 0x06; CANBT2 = 0x0E; CANBT3 = 0x46; break; } //204.8kbps
case f250kbps: { CANBT1 = 0x04; CANBT2 = 0x0E; CANBT3 = 0x4A; break; } //245.760kbps
case f500kbps: { CANBT1 = 0x02; CANBT2 = 0x0E; CANBT3 = 0x24; break; } //491.52kbps
case f1000kbps: { CANBT1 = 0x00; CANBT2 = 0x0E; CANBT3 = 0x24; break; } //983kbps
default : return FALSE;
}
#elif F_CPU == 12000000ul
switch ( br ){
case f100kbps: { CANBT1 = 0x12; CANBT2 = 0x08; CANBT3 = 0x25; break; }
case f125kbps: { CANBT1 = 0x16; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f200kbps: { CANBT1 = 0x08; CANBT2 = 0x08; CANBT3 = 0x25; break; }
case f250kbps: { CANBT1 = 0x0A; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f500kbps: { CANBT1 = 0x04; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f1000kbps: { CANBT1 = 0x00; CANBT2 = 0x08; CANBT3 = 0x25; break; }
default : return FALSE;
}
#elif F_CPU == 8000000ul
switch ( br ){
case f100kbps: { CANBT1 = 0x12; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f125kbps: { CANBT1 = 0x0E; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f200kbps: { CANBT1 = 0x08; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f250kbps: { CANBT1 = 0x06; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f500kbps: { CANBT1 = 0x02; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f1000kbps: { CANBT1 = 0x00; CANBT2 = 0x04; CANBT3 = 0x13; break; }
default : return FALSE;
}
#elif F_CPU == 6000000ul
switch ( br ){
case f100kbps: { CANBT1 = 0x08; CANBT2 = 0x08; CANBT3 = 0x25; break; }
case f125kbps: { CANBT1 = 0x0A; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f200kbps: { CANBT1 = 0x04; CANBT2 = 0x06; CANBT3 = 0x23; break; }
case f250kbps: { CANBT1 = 0x04; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f500kbps: { CANBT1 = 0x00; CANBT2 = 0x08; CANBT3 = 0x25; break; }
default : return FALSE;
}
#elif F_CPU == 4000000ul
switch ( br ){
case f100kbps: { CANBT1 = 0x08; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f125kbps: { CANBT1 = 0x06; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f200kbps: { CANBT1 = 0x00; CANBT2 = 0x0E; CANBT3 = 0x4B; break; }
case f250kbps: { CANBT1 = 0x02; CANBT2 = 0x04; CANBT3 = 0x13; break; }
case f500kbps: { CANBT1 = 0x00; CANBT2 = 0x04; CANBT3 = 0x13; break; }
default : return FALSE;
}
#else
return FALSE;
#endif
CANTCON = 0x00;
return TRUE;
#else
# error "Macro F_CPU must be defined"
return FALSE;
#endif
}