diff --git a/mcp2515.c b/mcp2515.c index 7d3086a..166af5d 100644 --- a/mcp2515.c +++ b/mcp2515.c @@ -90,7 +90,7 @@ void MCP2515_Read_Rx(MCP2515_HandleTypeDef* hcan, REGISTER reg, uint8_t values[] HAL_GPIO_WritePin(hcan->cs_port, hcan->cs_pin, GPIO_PIN_SET); } -CAN_Error MCP2515_Set_Mode(MCP2515_HandleTypeDef* hcan, CANCTRL_REQOP_MODE mode) { +CAN_Error MCP2515_Set_Mode(MCP2515_HandleTypeDef* hcan, MCP2515_Mode_t mode) { unsigned long endTime = HAL_GetTick() + 10; uint8_t modeMatch = 0; while (HAL_GetTick() < endTime) { @@ -251,26 +251,6 @@ CAN_Error MCP2515_Reset(MCP2515_HandleTypeDef* hcan) { return ERROR_OK; } -CAN_Error MCP2515_Set_Mode(MCP2515_HandleTypeDef* hcan, MCP2515_Mode_t mode) { - switch (mode) { - case MODE_LISTEN_ONLY: - return MCP2515_Set_Mode(hcan, CANCTRL_REQOP_LISTENONLY); - break; - case MODE_LOOPBACK: - return MCP2515_Set_Mode(hcan, CANCTRL_REQOP_LOOPBACK); - break; - case MODE_SLEEP: - return MCP2515_Set_Mode(hcan, CANCTRL_REQOP_SLEEP); - break; - case MODE_NORMAL: - return MCP2515_Set_Mode(hcan, CANCTRL_REQOP_NORMAL); - break; - default: - return MCP2515_Set_Mode(hcan, CANCTRL_REQOP_NORMAL); - break; - } -} - CAN_Error MCP2515_Set_Pin_Control(MCP2515_HandleTypeDef* hcan, bool B1BFS, bool B0BFS, bool B1BFE, bool B0BFE, bool B1BFM, bool B0BFM) { CAN_Error error = MCP2515_Set_Config_Mode(hcan); if (error != ERROR_OK) { @@ -571,6 +551,13 @@ CAN_Error MCP2515_Set_Bitrate_Clock(MCP2515_HandleTypeDef* hcan, CAN_SPEED canSp return ERROR_FAIL; } +CAN_Error MCP2515_Set_Transmit_Priority(MCP2515_HandleTypeDef* hcan, MCP2515_Priority_t txb0, MCP2515_Priority_t txb1, MCP2515_Priority_t txb2) +{ + MCP2515_Set_Register(hcan, MCP_TXB0CTRL, txb0); + MCP2515_Set_Register(hcan, MCP_TXB1CTRL, txb1); + MCP2515_Set_Register(hcan, MCP_TXB2CTRL, txb2); +} + void MCP2515_Request_To_Send(MCP2515_HandleTypeDef* hcan, uint8_t instruction) { HAL_GPIO_WritePin(hcan->cs_port, hcan->cs_pin, GPIO_PIN_RESET); MCP2515_SPI_transfer(hcan, instruction); diff --git a/mcp2515.h b/mcp2515.h index 976b130..ab12b0f 100644 --- a/mcp2515.h +++ b/mcp2515.h @@ -2,6 +2,7 @@ #define APPLICATION_USER_INC_MCP2515_H_ #include +#include #include typedef enum { @@ -51,12 +52,19 @@ typedef enum { TXB0 = 0, TXB1 = 1, TXB2 = 2 } TXBn; typedef enum { RXB0 = 0, RXB1 = 1 } RXBn; typedef enum { - MODE_LISTEN_ONLY, + MODE_NORMAL, MODE_SLEEP, MODE_LOOPBACK, - MODE_NORMAL + MODE_LISTEN_ONLY } MCP2515_Mode_t; +typedef enum { + PRIORITY_LOW, + PRIORITY_NORMAL, + PRIORITY_HIGH, + PRIORITY_HIGHEST, +} MCP2515_Priority_t; + typedef struct { SPI_HandleTypeDef* hspi; GPIO_TypeDef* cs_port; @@ -74,8 +82,11 @@ CAN_Error MCP2515_Reset(MCP2515_HandleTypeDef* hcan); uint8_t MCP2515_Get_Status(MCP2515_HandleTypeDef* hcan); CAN_Error MCP2515_Set_Mode(MCP2515_HandleTypeDef* hcan, MCP2515_Mode_t mode); +CAN_Error MCP2515_Set_Pin_Control(MCP2515_HandleTypeDef* hcan, bool B1BFS, bool B0BFS, bool B1BFE, bool B0BFE, bool B1BFM, bool B0BFM); +CAN_Error MCP2515_Set_Interrupt(MCP2515_HandleTypeDef* hcan, bool MERRIE, bool WAKIE, bool ERRIE, bool TX2IE, bool TX1IE, bool TX0IE, bool RX1IE, bool RX0IE); CAN_Error MCP2515_Set_Bitrate_Clock(MCP2515_HandleTypeDef* hcan, CAN_SPEED canSpeed, CAN_CLOCK canClock); +CAN_Error MCP2515_Set_Transmit_Priority(MCP2515_HandleTypeDef* hcan, MCP2515_Priority_t txb0, MCP2515_Priority_t txb1, MCP2515_Priority_t txb2); CAN_Error MCP2515_Set_Filter_Mask(MCP2515_HandleTypeDef* hcan, MASK mask, uint8_t ext, uint32_t ulData); CAN_Error MCP2515_Set_Filter(MCP2515_HandleTypeDef* hcan, RXF num, uint8_t ext, uint32_t ulData); diff --git a/mcp2515_consts.h b/mcp2515_consts.h index 2be2920..284cb5e 100644 --- a/mcp2515_consts.h +++ b/mcp2515_consts.h @@ -210,6 +210,7 @@ typedef enum { MCP_RXF2EID8 = 0x0A, MCP_RXF2EID0 = 0x0B, MCP_BFPCTRL = 0x0C, + MCP_TXRTSCTR = 0x0D, MCP_CANSTAT = 0x0E, MCP_CANCTRL = 0x0F, MCP_RXF3SIDH = 0x10,