Multiple frames implementation (#2)

* Add rx event handlers

* Fix compile errors and add constness

* Pass sender id

* Change api interface

* Revert changes

* Add filter fifo

* Add default setup

* Add receive function

* Remove interrupt activation

* Activate RX interrupts

* Merge remote changes

* Add event list constructor

* Fix compilation bug

* Send and receive multiple frames

* Refactor

* Refactor

* Fix compile error

* Use known syntax

* Refactor

* Provide storage

* Add frame end

* Add some documentation

* Turn macros into functions

* Refactor

* Refactor

* Fix compile error

* Use ExtendedIds

Co-authored-by: Riccardo998 <riccardo.storchi98@gmail.com>
This commit is contained in:
Stefano Calabretti
2021-12-09 11:39:39 +01:00
committed by GitHub
parent 90d1836dfa
commit 7b09401b00
9 changed files with 346 additions and 50 deletions
+44 -14
View File
@@ -6,6 +6,7 @@
#include "mmr_can_includes.h"
#include "mmr_can_types.h"
#include "mmr_can_optimize.h"
#include "mmr_can_binary_literals.h"
#ifndef MMR_CAN_RX_FIFO
#define MMR_CAN_RX_FIFO CAN_RX_FIFO0
@@ -23,15 +24,11 @@
#define MMR_CAN_RX_INTERRUPT CAN_IT_RX_FIFO1_MSG_PENDING
#endif
#ifndef MMR_CAN_ID
#define MMR_CAN_ID 0x103
#ifndef MMR_CAN_MAX_DATA_LENGTH
#define MMR_CAN_MAX_DATA_LENGTH 8
#endif
#ifndef MMR_CAN_BUFFER_LEN
#define MMR_CAN_BUFFER_LEN 8
#endif
typedef uint8_t CanRxBuffer[MMR_CAN_BUFFER_LEN];
typedef uint8_t CanRxBuffer[MMR_CAN_MAX_DATA_LENGTH];
typedef struct {
@@ -47,7 +44,10 @@ typedef struct {
* The filter bank to use
*
* In systems with more than one CAN interface,
* this must go from 0 to slaveBankStart.
* this must go from 0 to slaveBankStart for the master CAN
* and from slaveBankStart to 27 for the slave CAN
*
* Master CAN is usually CAN1, while slave CAN is CAN2
*/
CanFilterBank bank;
@@ -63,13 +63,8 @@ typedef struct {
CanFilterMask idMask;
} MmrCanFilterSettings;
typedef struct {
/**
* The id of the CAN interface that will receive the packet.
*
* If you are using the CANbus in loopback mode, it can be the
* id that the sender is using.
*/
CanId remoteId;
CanMailbox *mailbox;
uint8_t *data;
@@ -77,13 +72,48 @@ typedef struct {
} MmrCanPacket;
/**
* @brief
* These values can be appended to the extended-id
* portion of the CAN bus message (that is, the lower 5 bits
* of the standard id)
*
* They are used to check if a message is either standalone
* or split into multiple frames
*
* Multi-frame messages have a higher priority over normal ones
*/
typedef enum {
MMR_CAN_MESSAGE_TYPE_MULTI_FRAME = B_(0010),
MMR_CAN_MESSAGE_TYPE_MULTI_FRAME_END = B_(0011),
MMR_CAN_MESSAGE_TYPE_NORMAL = B_(1000),
} MmrCanMessageType;
/**
* @brief
* Represents a CAN message
*/
typedef struct {
CanId senderId;
void *store;
} MmrCanMessage;
#define MMR_CAN_FilterConfigDefault(phcan) \
MMR_CAN_FilterConfig(phcan, MMR_CAN_GetDefaultFilterSettings())
HalStatus MMR_CAN_BasicSetupAndStart(CanHandle *hcan);
HalStatus MMR_CAN_FilterConfig(CanHandle *hcan, MmrCanFilterSettings settings);
CanFilterMask MMR_CAN_AlignStandardMask(CanFilterMask baseMask);
MmrCanFilterSettings MMR_CAN_GetDefaultFilterSettings();
HalStatus MMR_CAN_Send(CanHandle *hcan, MmrCanPacket packet);
HalStatus MMR_CAN_Receive(CanHandle *hcan, MmrCanMessage *result);
bool MMR_CAN_IsMultiFrame(CanRxHeader *header);
bool MMR_CAN_IsMultiFrameEnd(CanRxHeader *header);
#endif /* INC_MMR_CAN_H_ */