enable CAN on H7 (#2393)

* enable

* guard correctly

* h7 bit timing

* allow longer frames

* allow data smaller than maximum

* mcu temperature

* typo

* tx message

* testing

* check for CAN or FDCAN

* don't need that any more

* h7 bitrate config

* undo testing

* h7-ify msg tx

* comment

* break out SID/EID macros

* guard differently

* update ChibiOS

Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
This commit is contained in:
Matthew Kennedy 2021-03-09 15:54:01 -08:00 committed by GitHub
parent 3b6d5e9b24
commit 40c4238f13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 95 additions and 25 deletions

@ -1 +1 @@
Subproject commit 6b0f623d023ed984c586f8979c10bbf11807e121 Subproject commit 948b015c9c491295d088d0db4b209b3a37b1a524

View File

@ -11,9 +11,6 @@
#undef EFI_MC33816 #undef EFI_MC33816
#define EFI_MC33816 FALSE #define EFI_MC33816 FALSE
#undef EFI_CAN_SUPPORT
#define EFI_CAN_SUPPORT FALSE
#undef EFI_CJ125 #undef EFI_CJ125
#define EFI_CJ125 FALSE #define EFI_CJ125 FALSE

View File

@ -257,7 +257,7 @@ private:
} }
if (widebandUpdatePending) { if (widebandUpdatePending) {
#if EFI_WIDEBAND_FIRMWARE_UPDATE && HAL_USE_CAN #if EFI_WIDEBAND_FIRMWARE_UPDATE && EFI_CAN_SUPPORT
updateWidebandFirmware(logger); updateWidebandFirmware(logger);
#endif #endif
widebandUpdatePending = false; widebandUpdatePending = false;

View File

@ -35,3 +35,12 @@ public:
CanWrite(); CanWrite();
void PeriodicTask(efitime_t nowNt) override; void PeriodicTask(efitime_t nowNt) override;
}; };
// We need these helpers because the frame layout is different on STM32H7
#ifdef STM32H7XX
#define CAN_SID(f) ((f).std.SID)
#define CAN_EID(f) ((f).ext.EID)
#else
#define CAN_SID(f) ((f).SID)
#define CAN_EID(f) ((f).EID)
#endif

View File

@ -64,7 +64,7 @@ bool acceptCanRx(int sid DECLARE_ENGINE_PARAMETER_SUFFIX) {
* this build-in CAN sniffer is very basic but that's our CAN sniffer * this build-in CAN sniffer is very basic but that's our CAN sniffer
*/ */
static void printPacket(const CANRxFrame &rx, Logging *logger) { static void printPacket(const CANRxFrame &rx, Logging *logger) {
bool accept = acceptCanRx(rx.SID); bool accept = acceptCanRx(CAN_SID(rx));
if (!accept) { if (!accept) {
return; return;
} }
@ -72,8 +72,8 @@ static void printPacket(const CANRxFrame &rx, Logging *logger) {
// only print info if we're in can debug mode // only print info if we're in can debug mode
// internet people use both hex and decimal to discuss packed IDs, for usability it's better to print both right here // internet people use both hex and decimal to discuss packed IDs, for usability it's better to print both right here
scheduleMsg(logger, "CAN_rx %x %d %x, %x %x %x %x %x %x %x %x", rx.SID, scheduleMsg(logger, "CAN_rx %x %d %x, %x %x %x %x %x %x %x %x", CAN_SID(rx),
rx.SID, rx.DLC, rx.data8[0], rx.data8[1], rx.data8[2], rx.data8[3], CAN_SID(rx), rx.DLC, rx.data8[0], rx.data8[1], rx.data8[2], rx.data8[3],
rx.data8[4], rx.data8[5], rx.data8[6], rx.data8[7]); rx.data8[4], rx.data8[5], rx.data8[6], rx.data8[7]);
} }
@ -108,7 +108,7 @@ void processCanRxMessage(const CANRxFrame &frame, Logging *logger,
processCanRxVss(frame, nowNt); processCanRxVss(frame, nowNt);
#if EFI_CANBUS_SLAVE #if EFI_CANBUS_SLAVE
if (frame.EID == CONFIG(verboseCanBaseAddress) + CAN_SENSOR_1_OFFSET) { if (CAN_EID(frame) == CONFIG(verboseCanBaseAddress) + CAN_SENSOR_1_OFFSET) {
int16_t mapScaled = *reinterpret_cast<const int16_t*>(&frame.data8[0]); int16_t mapScaled = *reinterpret_cast<const int16_t*>(&frame.data8[0]);
canMap = mapScaled / (1.0 * PACK_MULT_PRESSURE); canMap = mapScaled / (1.0 * PACK_MULT_PRESSURE);
} else } else
@ -119,7 +119,7 @@ void processCanRxMessage(const CANRxFrame &frame, Logging *logger,
#if EFI_WIDEBAND_FIRMWARE_UPDATE #if EFI_WIDEBAND_FIRMWARE_UPDATE
// Bootloader acks with address 0x727573 aka ascii "rus" // Bootloader acks with address 0x727573 aka ascii "rus"
if (frame.EID == 0x727573) { if (CAN_EID(frame) == 0x727573) {
handleWidebandBootloaderAck(); handleWidebandBootloaderAck();
} }
#endif #endif

View File

@ -82,7 +82,7 @@ void processCanRxVss(const CANRxFrame& frame, efitick_t nowNt) {
} }
//filter it we need to process the can message or not //filter it we need to process the can message or not
if ( frame.SID != filterCanID ) { if (CAN_SID(frame) != filterCanID ) {
return; return;
} }

View File

@ -27,6 +27,7 @@
#include "os_access.h" #include "os_access.h"
#include "engine.h" #include "engine.h"
#include "obd2.h" #include "obd2.h"
#include "can.h"
#include "can_msg_tx.h" #include "can_msg_tx.h"
#include "vehicle_speed.h" #include "vehicle_speed.h"
#include "map.h" #include "map.h"
@ -195,7 +196,7 @@ static void handleDtcRequest(int numCodes, int *dtcCode) {
#if HAL_USE_CAN #if HAL_USE_CAN
void obdOnCanPacketRx(const CANRxFrame& rx) { void obdOnCanPacketRx(const CANRxFrame& rx) {
if (rx.SID != OBD_TEST_REQUEST) { if (CAN_SID(rx) != OBD_TEST_REQUEST) {
return; return;
} }

View File

@ -1,6 +1,6 @@
#include "global.h" #include "global.h"
#if EFI_WIDEBAND_FIRMWARE_UPDATE && HAL_USE_CAN #if EFI_WIDEBAND_FIRMWARE_UPDATE && EFI_CAN_SUPPORT
#include "ch.h" #include "ch.h"
#include "can_msg_tx.h" #include "can_msg_tx.h"

View File

@ -32,7 +32,7 @@ public:
void showInfo(Logging* logger, const char* sensorName) const override; void showInfo(Logging* logger, const char* sensorName) const override;
CanSensorBase* processFrame(const CANRxFrame& frame, efitick_t nowNt) { CanSensorBase* processFrame(const CANRxFrame& frame, efitick_t nowNt) {
if (frame.EID == m_eid) { if (CAN_EID(frame) == m_eid) {
decodeFrame(frame, nowNt); decodeFrame(frame, nowNt);
} }

View File

@ -36,7 +36,7 @@ static LoggingWithStorage logger("CAN driver");
// Values below calculated with http://www.bittiming.can-wiki.info/ // Values below calculated with http://www.bittiming.can-wiki.info/
// Pick ST micro bxCAN // Pick ST micro bxCAN
// Clock rate of 42mhz for f4, 54mhz for f7 // Clock rate of 42mhz for f4, 54mhz for f7, 80mhz for h7
#ifdef STM32F4XX #ifdef STM32F4XX
// These have an 85.7% sample point // These have an 85.7% sample point
#define CAN_BTR_100 (CAN_BTR_SJW(0) | CAN_BTR_BRP(29) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1)) #define CAN_BTR_100 (CAN_BTR_SJW(0) | CAN_BTR_BRP(29) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
@ -49,6 +49,21 @@ static LoggingWithStorage logger("CAN driver");
#define CAN_BTR_250 (CAN_BTR_SJW(0) | CAN_BTR_BRP(11) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1)) #define CAN_BTR_250 (CAN_BTR_SJW(0) | CAN_BTR_BRP(11) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
#define CAN_BTR_500 (CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1)) #define CAN_BTR_500 (CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
#define CAN_BTR_1k0 (CAN_BTR_SJW(0) | CAN_BTR_BRP(2) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1)) #define CAN_BTR_1k0 (CAN_BTR_SJW(0) | CAN_BTR_BRP(2) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
#elif defined(STM32H7XX)
// These have an 87.5% sample point
// FDCAN driver has different bit timing registers (yes, different format)
// for the arbitration and data phases
#define CAN_NBTP_100 0x00310C01
#define CAN_DBTP_100 0x00310C13
#define CAN_NBTP_250 0x00130C01
#define CAN_DBTP_250 0x00130C13
#define CAN_NBTP_500 0x00090C01
#define CAN_DBTP_500 0x00090C13
#define CAN_NBTP_1k0 0x00040C01
#define CAN_DBTP_1k0 0x00040C13
#else #else
#error Please define CAN BTR settings for your MCU! #error Please define CAN BTR settings for your MCU!
#endif #endif
@ -62,7 +77,7 @@ static LoggingWithStorage logger("CAN driver");
* 29 bit would be CAN_TI0R_EXID (?) but we do not mention it here * 29 bit would be CAN_TI0R_EXID (?) but we do not mention it here
* CAN_TI0R_STID "Standard Identifier or Extended Identifier"? not mentioned as well * CAN_TI0R_STID "Standard Identifier or Extended Identifier"? not mentioned as well
*/ */
#if defined(STM32F4XX) || defined(STM32F7XX)
static const CANConfig canConfig100 = { static const CANConfig canConfig100 = {
CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
CAN_BTR_100 }; CAN_BTR_100 };
@ -78,6 +93,39 @@ CAN_BTR_500 };
static const CANConfig canConfig1000 = { static const CANConfig canConfig1000 = {
CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP, CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
CAN_BTR_1k0 }; CAN_BTR_1k0 };
#elif defined(STM32H7XX)
static const CANConfig canConfig100 = {
CAN_NBTP_100,
CAN_DBTP_100,
0, // CCCR
0, // TEST
0,
};
static const CANConfig canConfig250 = {
CAN_NBTP_250,
CAN_DBTP_250,
0, // CCCR
0, // TEST
0,
};
static const CANConfig canConfig500 = {
CAN_NBTP_500,
CAN_DBTP_500,
0, // CCCR
0, // TEST
0,
};
static const CANConfig canConfig1000 = {
CAN_NBTP_1k0,
CAN_DBTP_1k0,
0, // CCCR
0, // TEST
0,
};
#endif
static const CANConfig *canConfig = &canConfig500; static const CANConfig *canConfig = &canConfig500;
@ -212,6 +260,8 @@ void initCan(void) {
break; break;
} }
startCanPins();
// Initialize hardware // Initialize hardware
#if STM32_CAN_USE_CAN2 #if STM32_CAN_USE_CAN2
// CAN1 is required for CAN2 // CAN1 is required for CAN2
@ -236,8 +286,6 @@ void initCan(void) {
if (CONFIG(canReadEnabled)) { if (CONFIG(canReadEnabled)) {
canRead.Start(); canRead.Start();
} }
startCanPins();
} }
#endif /* EFI_CAN_SUPPORT */ #endif /* EFI_CAN_SUPPORT */

View File

@ -11,6 +11,7 @@
#include "global.h" #include "global.h"
#if EFI_CAN_SUPPORT #if EFI_CAN_SUPPORT
#include "can.h"
#include "can_msg_tx.h" #include "can_msg_tx.h"
#include "engine_configuration.h" #include "engine_configuration.h"
@ -27,10 +28,24 @@ extern int canWriteNotOk;
} }
CanTxMessage::CanTxMessage(uint32_t eid, uint8_t dlc, bool isExtended) { CanTxMessage::CanTxMessage(uint32_t eid, uint8_t dlc, bool isExtended) {
#ifndef STM32H7XX
// ST bxCAN device
m_frame.IDE = isExtended ? CAN_IDE_EXT : CAN_IDE_STD; m_frame.IDE = isExtended ? CAN_IDE_EXT : CAN_IDE_STD;
m_frame.EID = eid;
m_frame.RTR = CAN_RTR_DATA; m_frame.RTR = CAN_RTR_DATA;
#else /* if STM32H7XX */
// Bosch M_CAN FDCAN device
m_frame.common.XTD = isExtended;
m_frame.common.RTR = 0;
#endif
if (isExtended) {
CAN_EID(m_frame) = eid;
} else {
CAN_SID(m_frame) = eid;
}
m_frame.DLC = dlc; m_frame.DLC = dlc;
memset(m_frame.data8, 0, sizeof(m_frame.data8)); memset(m_frame.data8, 0, sizeof(m_frame.data8));
} }
@ -43,7 +58,7 @@ CanTxMessage::~CanTxMessage() {
} }
if (CONFIG(debugMode) == DBG_CAN) { if (CONFIG(debugMode) == DBG_CAN) {
scheduleMsg(&sharedLogger, "Sending CAN message: SID %x/%x %x %x %x %x %x %x %x %x", m_frame.SID, m_frame.DLC, scheduleMsg(&sharedLogger, "Sending CAN message: SID %x/%x %x %x %x %x %x %x %x %x", CAN_SID(m_frame), m_frame.DLC,
m_frame.data8[0], m_frame.data8[1], m_frame.data8[0], m_frame.data8[1],
m_frame.data8[2], m_frame.data8[3], m_frame.data8[2], m_frame.data8[3],
m_frame.data8[4], m_frame.data8[5], m_frame.data8[4], m_frame.data8[5],

View File

@ -74,11 +74,11 @@ template <typename TData>
class CanTxTyped final : public CanTxMessage class CanTxTyped final : public CanTxMessage
{ {
#if EFI_CAN_SUPPORT #if EFI_CAN_SUPPORT
static_assert(sizeof(TData) == sizeof(CANTxFrame::data8)); static_assert(sizeof(TData) <= sizeof(CANTxFrame::data8));
#endif // EFI_CAN_SUPPORT #endif // EFI_CAN_SUPPORT
public: public:
explicit CanTxTyped(uint32_t eid) : CanTxMessage(eid) { } explicit CanTxTyped(uint32_t eid) : CanTxMessage(eid, sizeof(TData)) { }
#if EFI_CAN_SUPPORT #if EFI_CAN_SUPPORT
/** /**

View File

@ -774,11 +774,11 @@ bool isValidCanRxPin(brain_pin_e pin) {
} }
CANDriver * detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx) { CANDriver * detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx) {
#if STM32_CAN_USE_CAN1 #if STM32_CAN_USE_CAN1 || STM32_CAN_USE_FDCAN1
if (isValidCan1RxPin(pinRx) && isValidCan1TxPin(pinTx)) if (isValidCan1RxPin(pinRx) && isValidCan1TxPin(pinTx))
return &CAND1; return &CAND1;
#endif #endif
#if STM32_CAN_USE_CAN2 #if STM32_CAN_USE_CAN2 || STM32_CAN_USE_FDCAN2
if (isValidCan2RxPin(pinRx) && isValidCan2TxPin(pinTx)) if (isValidCan2RxPin(pinRx) && isValidCan2TxPin(pinTx))
return &CAND2; return &CAND2;
#endif #endif

View File

@ -239,7 +239,7 @@
/* /*
* CAN driver system settings. * CAN driver system settings.
*/ */
#define STM32_CAN_USE_FDCAN1 FALSE #define STM32_CAN_USE_FDCAN1 TRUE
#define STM32_CAN_USE_FDCAN2 FALSE #define STM32_CAN_USE_FDCAN2 FALSE
/* /*