From 93913cad12afac66229f3d5515f3e6b9ba0b5994 Mon Sep 17 00:00:00 2001 From: vell Date: Fri, 15 Jul 2022 12:37:35 +0800 Subject: [PATCH 1/2] write can frame add wait timeout --- src/CAN.c | 14 +++++++++++ src/CAN.h | 64 +++++++++++++++++++++++++----------------------- src/ESP32CAN.cpp | 19 ++++++++------ src/ESP32CAN.h | 1 + 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/src/CAN.c b/src/CAN.c index 826f9db..ad3efbb 100644 --- a/src/CAN.c +++ b/src/CAN.c @@ -262,6 +262,20 @@ int CAN_init() { return 0; } +int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTick) { + if (sem_tx_complete == NULL) { + return -1; + } + + // Write the frame to the controller + CAN_write_frame_phy(p_frame); + + // wait for the frame tx to complete + xSemaphoreTake(sem_tx_complete, waitTick); + + return 0; +} + int CAN_write_frame(const CAN_frame_t *p_frame) { if (sem_tx_complete == NULL) { return -1; diff --git a/src/CAN.h b/src/CAN.h index aebde46..b2f4dfe 100644 --- a/src/CAN.h +++ b/src/CAN.h @@ -40,57 +40,57 @@ extern "C" { * \brief CAN frame type (standard/extended) */ typedef enum { - CAN_frame_std = 0, /**< Standard frame, using 11 bit identifer. */ - CAN_frame_ext = 1 /**< Extended frame, using 29 bit identifer. */ + CAN_frame_std = 0, /**< Standard frame, using 11 bit identifer. */ + CAN_frame_ext = 1 /**< Extended frame, using 29 bit identifer. */ } CAN_frame_format_t; /** * \brief CAN RTR */ typedef enum { - CAN_no_RTR = 0, /**< No RTR frame. */ - CAN_RTR = 1 /**< RTR frame. */ + CAN_no_RTR = 0, /**< No RTR frame. */ + CAN_RTR = 1 /**< RTR frame. */ } CAN_RTR_t; /** \brief Frame information record type */ typedef union { - uint32_t U; /**< \brief Unsigned access */ - struct { - uint8_t DLC : 4; /**< \brief [3:0] DLC, Data length container */ - unsigned int unknown_2 : 2; /**< \brief \internal unknown */ - CAN_RTR_t RTR : 1; /**< \brief [6:6] RTR, Remote Transmission Request */ - CAN_frame_format_t FF : 1; /**< \brief [7:7] Frame Format, see# CAN_frame_format_t*/ - unsigned int reserved_24 : 24; /**< \brief \internal Reserved */ - } B; + uint32_t U; /**< \brief Unsigned access */ + struct { + uint8_t DLC: 4; /**< \brief [3:0] DLC, Data length container */ + unsigned int unknown_2: 2; /**< \brief \internal unknown */ + CAN_RTR_t RTR: 1; /**< \brief [6:6] RTR, Remote Transmission Request */ + CAN_frame_format_t FF: 1; /**< \brief [7:7] Frame Format, see# CAN_frame_format_t*/ + unsigned int reserved_24: 24; /**< \brief \internal Reserved */ + } B; } CAN_FIR_t; /** \brief CAN Frame structure */ typedef struct { - CAN_FIR_t FIR; /**< \brief Frame information record*/ - uint32_t MsgID; /**< \brief Message ID */ - union { - uint8_t u8[8]; /**< \brief Payload byte access*/ - uint32_t u32[2]; /**< \brief Payload u32 access*/ - uint64_t u64; /**< \brief Payload u64 access*/ - } data; + CAN_FIR_t FIR; /**< \brief Frame information record*/ + uint32_t MsgID; /**< \brief Message ID */ + union { + uint8_t u8[8]; /**< \brief Payload byte access*/ + uint32_t u32[2]; /**< \brief Payload u32 access*/ + uint64_t u64; /**< \brief Payload u64 access*/ + } data; } CAN_frame_t; typedef enum { - Dual_Mode=0, /**< \brief The dual acceptance filter option is enabled (two filters, each with the length of 16 bit are active) */ - Single_Mode=1 /**< \brief The single acceptance filter option is enabled (one filter with the length of 32 bit is active) */ + Dual_Mode = 0, /**< \brief The dual acceptance filter option is enabled (two filters, each with the length of 16 bit are active) */ + Single_Mode = 1 /**< \brief The single acceptance filter option is enabled (one filter with the length of 32 bit is active) */ } CAN_filter_mode_t; /** \brief CAN Filter structure */ typedef struct { - CAN_filter_mode_t FM:1; /**< \brief [0:0] Filter Mode */ - uint8_t ACR0; /**< \brief Acceptance Code Register ACR0 */ - uint8_t ACR1; /**< \brief Acceptance Code Register ACR1 */ - uint8_t ACR2; /**< \brief Acceptance Code Register ACR2 */ - uint8_t ACR3; /**< \brief Acceptance Code Register ACR3 */ - uint8_t AMR0; /**< \brief Acceptance Mask Register AMR0 */ - uint8_t AMR1; /**< \brief Acceptance Mask Register AMR1 */ - uint8_t AMR2; /**< \brief Acceptance Mask Register AMR2 */ - uint8_t AMR3; /**< \brief Acceptance Mask Register AMR3 */ + CAN_filter_mode_t FM: 1; /**< \brief [0:0] Filter Mode */ + uint8_t ACR0; /**< \brief Acceptance Code Register ACR0 */ + uint8_t ACR1; /**< \brief Acceptance Code Register ACR1 */ + uint8_t ACR2; /**< \brief Acceptance Code Register ACR2 */ + uint8_t ACR3; /**< \brief Acceptance Code Register ACR3 */ + uint8_t AMR0; /**< \brief Acceptance Mask Register AMR0 */ + uint8_t AMR1; /**< \brief Acceptance Mask Register AMR1 */ + uint8_t AMR2; /**< \brief Acceptance Mask Register AMR2 */ + uint8_t AMR3; /**< \brief Acceptance Mask Register AMR3 */ } CAN_filter_t; /** @@ -108,6 +108,8 @@ int CAN_init(void); */ int CAN_write_frame(const CAN_frame_t *p_frame); +int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTick); + /** * \brief Stops the CAN Module * @@ -121,7 +123,7 @@ int CAN_stop(void); * \param p_filter Pointer to the filter, see #CAN_filter_t * \return 0 CAN Filter had been initialized */ -int CAN_config_filter(const CAN_filter_t* p_filter); +int CAN_config_filter(const CAN_filter_t *p_filter); #ifdef __cplusplus diff --git a/src/ESP32CAN.cpp b/src/ESP32CAN.cpp index 1412b4a..2233172 100644 --- a/src/ESP32CAN.cpp +++ b/src/ESP32CAN.cpp @@ -1,20 +1,23 @@ #include "ESP32CAN.h" -int ESP32CAN::CANInit() -{ +int ESP32CAN::CANInit() { return CAN_init(); } -int ESP32CAN::CANWriteFrame(const CAN_frame_t* p_frame) -{ + +int ESP32CAN::CANWriteFrame(const CAN_frame_t *p_frame) { return CAN_write_frame(p_frame); } -int ESP32CAN::CANStop() -{ + +int ESP32CAN::CANStop() { return CAN_stop(); } -int ESP32CAN::CANConfigFilter(const CAN_filter_t* p_filter) -{ + +int ESP32CAN::CANConfigFilter(const CAN_filter_t *p_filter) { return CAN_config_filter(p_filter); } +int ESP32CAN::CANWriteFrame(const CAN_frame_t *p_frame, int waitMs) { + return CAN_write_frame_timeout(p_frame, waitMs * portTICK_PERIOD_MS); +} + ESP32CAN ESP32Can; diff --git a/src/ESP32CAN.h b/src/ESP32CAN.h index 0cbe156..dab75fa 100644 --- a/src/ESP32CAN.h +++ b/src/ESP32CAN.h @@ -10,6 +10,7 @@ class ESP32CAN int CANInit(); int CANConfigFilter(const CAN_filter_t* p_filter); int CANWriteFrame(const CAN_frame_t* p_frame); + int CANWriteFrame(const CAN_frame_t* p_frame, int waitMs); int CANStop(); }; From e77f84672d21f629fe668b9fe3bfe66602f7dfb5 Mon Sep 17 00:00:00 2001 From: vell Date: Fri, 15 Jul 2022 12:43:20 +0800 Subject: [PATCH 2/2] add note --- src/CAN.c | 28 +++++++++---------- src/CAN.h | 71 ++++++++++++++++++++++++++---------------------- src/ESP32CAN.cpp | 22 ++++++++------- 3 files changed, 65 insertions(+), 56 deletions(-) diff --git a/src/CAN.c b/src/CAN.c index ad3efbb..121b722 100644 --- a/src/CAN.c +++ b/src/CAN.c @@ -262,20 +262,6 @@ int CAN_init() { return 0; } -int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTick) { - if (sem_tx_complete == NULL) { - return -1; - } - - // Write the frame to the controller - CAN_write_frame_phy(p_frame); - - // wait for the frame tx to complete - xSemaphoreTake(sem_tx_complete, waitTick); - - return 0; -} - int CAN_write_frame(const CAN_frame_t *p_frame) { if (sem_tx_complete == NULL) { return -1; @@ -290,6 +276,20 @@ int CAN_write_frame(const CAN_frame_t *p_frame) { return 0; } +int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTicks) { + if (sem_tx_complete == NULL) { + return -1; + } + + // Write the frame to the controller + CAN_write_frame_phy(p_frame); + + // wait for the frame tx to complete + xSemaphoreTake(sem_tx_complete, waitTicks); + + return 0; +} + int CAN_stop() { // enter reset mode MODULE_CAN->MOD.B.RM = 1; diff --git a/src/CAN.h b/src/CAN.h index b2f4dfe..bc4531a 100644 --- a/src/CAN.h +++ b/src/CAN.h @@ -40,57 +40,57 @@ extern "C" { * \brief CAN frame type (standard/extended) */ typedef enum { - CAN_frame_std = 0, /**< Standard frame, using 11 bit identifer. */ - CAN_frame_ext = 1 /**< Extended frame, using 29 bit identifer. */ + CAN_frame_std = 0, /**< Standard frame, using 11 bit identifer. */ + CAN_frame_ext = 1 /**< Extended frame, using 29 bit identifer. */ } CAN_frame_format_t; /** * \brief CAN RTR */ typedef enum { - CAN_no_RTR = 0, /**< No RTR frame. */ - CAN_RTR = 1 /**< RTR frame. */ + CAN_no_RTR = 0, /**< No RTR frame. */ + CAN_RTR = 1 /**< RTR frame. */ } CAN_RTR_t; /** \brief Frame information record type */ typedef union { - uint32_t U; /**< \brief Unsigned access */ - struct { - uint8_t DLC: 4; /**< \brief [3:0] DLC, Data length container */ - unsigned int unknown_2: 2; /**< \brief \internal unknown */ - CAN_RTR_t RTR: 1; /**< \brief [6:6] RTR, Remote Transmission Request */ - CAN_frame_format_t FF: 1; /**< \brief [7:7] Frame Format, see# CAN_frame_format_t*/ - unsigned int reserved_24: 24; /**< \brief \internal Reserved */ - } B; + uint32_t U; /**< \brief Unsigned access */ + struct { + uint8_t DLC : 4; /**< \brief [3:0] DLC, Data length container */ + unsigned int unknown_2 : 2; /**< \brief \internal unknown */ + CAN_RTR_t RTR : 1; /**< \brief [6:6] RTR, Remote Transmission Request */ + CAN_frame_format_t FF : 1; /**< \brief [7:7] Frame Format, see# CAN_frame_format_t*/ + unsigned int reserved_24 : 24; /**< \brief \internal Reserved */ + } B; } CAN_FIR_t; /** \brief CAN Frame structure */ typedef struct { - CAN_FIR_t FIR; /**< \brief Frame information record*/ - uint32_t MsgID; /**< \brief Message ID */ - union { - uint8_t u8[8]; /**< \brief Payload byte access*/ - uint32_t u32[2]; /**< \brief Payload u32 access*/ - uint64_t u64; /**< \brief Payload u64 access*/ - } data; + CAN_FIR_t FIR; /**< \brief Frame information record*/ + uint32_t MsgID; /**< \brief Message ID */ + union { + uint8_t u8[8]; /**< \brief Payload byte access*/ + uint32_t u32[2]; /**< \brief Payload u32 access*/ + uint64_t u64; /**< \brief Payload u64 access*/ + } data; } CAN_frame_t; typedef enum { - Dual_Mode = 0, /**< \brief The dual acceptance filter option is enabled (two filters, each with the length of 16 bit are active) */ - Single_Mode = 1 /**< \brief The single acceptance filter option is enabled (one filter with the length of 32 bit is active) */ + Dual_Mode=0, /**< \brief The dual acceptance filter option is enabled (two filters, each with the length of 16 bit are active) */ + Single_Mode=1 /**< \brief The single acceptance filter option is enabled (one filter with the length of 32 bit is active) */ } CAN_filter_mode_t; /** \brief CAN Filter structure */ typedef struct { - CAN_filter_mode_t FM: 1; /**< \brief [0:0] Filter Mode */ - uint8_t ACR0; /**< \brief Acceptance Code Register ACR0 */ - uint8_t ACR1; /**< \brief Acceptance Code Register ACR1 */ - uint8_t ACR2; /**< \brief Acceptance Code Register ACR2 */ - uint8_t ACR3; /**< \brief Acceptance Code Register ACR3 */ - uint8_t AMR0; /**< \brief Acceptance Mask Register AMR0 */ - uint8_t AMR1; /**< \brief Acceptance Mask Register AMR1 */ - uint8_t AMR2; /**< \brief Acceptance Mask Register AMR2 */ - uint8_t AMR3; /**< \brief Acceptance Mask Register AMR3 */ + CAN_filter_mode_t FM:1; /**< \brief [0:0] Filter Mode */ + uint8_t ACR0; /**< \brief Acceptance Code Register ACR0 */ + uint8_t ACR1; /**< \brief Acceptance Code Register ACR1 */ + uint8_t ACR2; /**< \brief Acceptance Code Register ACR2 */ + uint8_t ACR3; /**< \brief Acceptance Code Register ACR3 */ + uint8_t AMR0; /**< \brief Acceptance Mask Register AMR0 */ + uint8_t AMR1; /**< \brief Acceptance Mask Register AMR1 */ + uint8_t AMR2; /**< \brief Acceptance Mask Register AMR2 */ + uint8_t AMR3; /**< \brief Acceptance Mask Register AMR3 */ } CAN_filter_t; /** @@ -108,7 +108,14 @@ int CAN_init(void); */ int CAN_write_frame(const CAN_frame_t *p_frame); -int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTick); +/** + * \brief Send a can frame + * + * \param p_frame Pointer to the frame to be send, see #CAN_frame_t + * \param waitTicks Wait for write completion ticks + * \return 0 Frame has been written to the module + */ +int CAN_write_frame_timeout(const CAN_frame_t *p_frame, int waitTicks); /** * \brief Stops the CAN Module @@ -123,7 +130,7 @@ int CAN_stop(void); * \param p_filter Pointer to the filter, see #CAN_filter_t * \return 0 CAN Filter had been initialized */ -int CAN_config_filter(const CAN_filter_t *p_filter); +int CAN_config_filter(const CAN_filter_t* p_filter); #ifdef __cplusplus diff --git a/src/ESP32CAN.cpp b/src/ESP32CAN.cpp index 2233172..c9a39e1 100644 --- a/src/ESP32CAN.cpp +++ b/src/ESP32CAN.cpp @@ -1,23 +1,25 @@ #include "ESP32CAN.h" -int ESP32CAN::CANInit() { +int ESP32CAN::CANInit() +{ return CAN_init(); } - -int ESP32CAN::CANWriteFrame(const CAN_frame_t *p_frame) { +int ESP32CAN::CANWriteFrame(const CAN_frame_t* p_frame) +{ return CAN_write_frame(p_frame); } -int ESP32CAN::CANStop() { - return CAN_stop(); +int ESP32CAN::CANWriteFrame(const CAN_frame_t *p_frame, int waitMs) { + return CAN_write_frame_timeout(p_frame, waitMs * portTICK_PERIOD_MS); } -int ESP32CAN::CANConfigFilter(const CAN_filter_t *p_filter) { - return CAN_config_filter(p_filter); +int ESP32CAN::CANStop() +{ + return CAN_stop(); } - -int ESP32CAN::CANWriteFrame(const CAN_frame_t *p_frame, int waitMs) { - return CAN_write_frame_timeout(p_frame, waitMs * portTICK_PERIOD_MS); +int ESP32CAN::CANConfigFilter(const CAN_filter_t* p_filter) +{ + return CAN_config_filter(p_filter); } ESP32CAN ESP32Can;