宏编译成功,还差缓冲区动态分配
This commit is contained in:
parent
9db1394184
commit
55153c98a0
File diff suppressed because one or more lines are too long
@ -153,40 +153,7 @@
|
|||||||
<Name>-UE1007200D0D2139393740544 -O2254 -SF5000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32H72x-73x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32H723VGTx$CMSIS\Flash\STM32H72x-73x_1024.FLM)</Name>
|
<Name>-UE1007200D0D2139393740544 -O2254 -SF5000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(6BA02477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32H72x-73x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32H723VGTx$CMSIS\Flash\STM32H72x-73x_1024.FLM)</Name>
|
||||||
</SetRegEntry>
|
</SetRegEntry>
|
||||||
</TargetDriverDllRegistry>
|
</TargetDriverDllRegistry>
|
||||||
<Breakpoint>
|
<Breakpoint/>
|
||||||
<Bp>
|
|
||||||
<Number>0</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>249</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>134224724</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
|
||||||
<Filename>..\User\bsp\fdcan.c</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression>\\FDCAN\../User/bsp/fdcan.c\249</Expression>
|
|
||||||
</Bp>
|
|
||||||
<Bp>
|
|
||||||
<Number>1</Number>
|
|
||||||
<Type>0</Type>
|
|
||||||
<LineNumber>217</LineNumber>
|
|
||||||
<EnabledFlag>1</EnabledFlag>
|
|
||||||
<Address>134224896</Address>
|
|
||||||
<ByteObject>0</ByteObject>
|
|
||||||
<HtxType>0</HtxType>
|
|
||||||
<ManyObjects>0</ManyObjects>
|
|
||||||
<SizeOfObject>0</SizeOfObject>
|
|
||||||
<BreakByAccess>0</BreakByAccess>
|
|
||||||
<BreakIfRCount>1</BreakIfRCount>
|
|
||||||
<Filename>..\User\bsp\fdcan.c</Filename>
|
|
||||||
<ExecCommand></ExecCommand>
|
|
||||||
<Expression>\\FDCAN\../User/bsp/fdcan.c\217</Expression>
|
|
||||||
</Bp>
|
|
||||||
</Breakpoint>
|
|
||||||
<WatchWindow1>
|
<WatchWindow1>
|
||||||
<Ww>
|
<Ww>
|
||||||
<count>0</count>
|
<count>0</count>
|
||||||
|
|||||||
241
User/bsp/fdcan.c
241
User/bsp/fdcan.c
@ -9,6 +9,52 @@
|
|||||||
/* Private define ----------------------------------------------------------- */
|
/* Private define ----------------------------------------------------------- */
|
||||||
#define FDCAN_QUEUE_MUTEX_TIMEOUT 100
|
#define FDCAN_QUEUE_MUTEX_TIMEOUT 100
|
||||||
|
|
||||||
|
/* Private macro ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* ===== FDCAN_FilterTypeDef 配置表 =====
|
||||||
|
* 定义每个FDCAN实例的过滤器参数表。
|
||||||
|
* 过滤器表参数说明:
|
||||||
|
* idx idtype ftype id1 id2 rxidx
|
||||||
|
* 过滤器编号 标识符类型 过滤器类型 过滤器ID1 过滤器ID2 接收缓冲区索引
|
||||||
|
*/
|
||||||
|
#ifdef FDCAN1_EN
|
||||||
|
#define FDCAN1_FILTER_CONFIG_TABLE(X) \
|
||||||
|
X(0, FDCAN_STANDARD_ID, FDCAN_FILTER_MASK, 0x000 , 0x000 , 0) \
|
||||||
|
X(1, FDCAN_EXTENDED_ID, FDCAN_FILTER_MASK, 0x00000000, 0x00000000, 0)
|
||||||
|
#define FDCAN1_GLOBAL_FILTER FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE/* 全局过滤器参数(用于 HAL_FDCAN_ConfigGlobalFilter) */
|
||||||
|
#endif
|
||||||
|
#ifdef FDCAN2_EN
|
||||||
|
#define FDCAN2_FILTER_CONFIG_TABLE(X) \
|
||||||
|
X(0, FDCAN_STANDARD_ID, FDCAN_FILTER_MASK, 0x000 , 0x000 , 0) \
|
||||||
|
X(1, FDCAN_EXTENDED_ID, FDCAN_FILTER_MASK, 0x00000000, 0x00000000, 0)
|
||||||
|
#define FDCAN2_GLOBAL_FILTER FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE/* 全局过滤器参数(用于 HAL_FDCAN_ConfigGlobalFilter) */
|
||||||
|
#endif
|
||||||
|
#ifdef FDCAN3_EN
|
||||||
|
#define FDCAN3_FILTER_CONFIG_TABLE(X) \
|
||||||
|
X(0, FDCAN_STANDARD_ID, FDCAN_FILTER_MASK, 0x000 , 0x000 , 0) \
|
||||||
|
X(1, FDCAN_EXTENDED_ID, FDCAN_FILTER_MASK, 0x00000000, 0x00000000, 0)
|
||||||
|
#define FDCAN3_GLOBAL_FILTER FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE/* 全局过滤器参数(用于 HAL_FDCAN_ConfigGlobalFilter) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ====宏展开实现==== */
|
||||||
|
#define FDCAN_FILTER_TO_RXFIFO_ENUM_INNER(FIFOIndex) FDCAN_FILTER_TO_RXFIFO##FIFOIndex
|
||||||
|
#define FDCAN_FILTER_TO_RXFIFO_ENUM(FIFOIndex) FDCAN_FILTER_TO_RXFIFO_ENUM_INNER(FIFOIndex)
|
||||||
|
#define FDCAN_CONFIG_FILTER(idx, idtype, ftype, id1, id2, rxidx) \
|
||||||
|
sFilterConfig.FilterIndex = (idx); \
|
||||||
|
sFilterConfig.IdType = (idtype); \
|
||||||
|
sFilterConfig.FilterType = (ftype); \
|
||||||
|
sFilterConfig.FilterConfig = (FDCAN_FILTER_TO_RXFIFO_ENUM(FDCANX_RX_FIFO)); \
|
||||||
|
sFilterConfig.FilterID1 = (id1); \
|
||||||
|
sFilterConfig.FilterID2 = (id2); \
|
||||||
|
sFilterConfig.RxBufferIndex = (rxidx); \
|
||||||
|
HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig);
|
||||||
|
|
||||||
|
#define FDCAN_NOTIFY_FLAG_RXFIFO_INNER(FIFO_IDX) FDCAN_IT_RX_FIFO##FIFO_IDX##_NEW_MESSAGE
|
||||||
|
#define FDCAN_NOTIFY_FLAG_RXFIFO(FIFO_IDX) FDCAN_NOTIFY_FLAG_RXFIFO_INNER(FIFO_IDX)
|
||||||
|
#define FDCANx_NOTIFY_FLAGS(FIFO_MACRO) (FDCAN_NOTIFY_FLAG_RXFIFO(FIFO_MACRO) | FDCAN_IT_TX_EVT_FIFO_NEW_DATA | FDCAN_IT_RAM_ACCESS_FAILURE)
|
||||||
|
|
||||||
|
#define FDCANX_MSG_PENDING_CB_INNER(FIFO_IDX) HAL_FDCAN_RX_FIFO##FIFO_IDX##_MSG_PENDING_CB
|
||||||
|
#define FDCANX_MSG_PENDING_CB(FIFO_IDX) FDCANX_MSG_PENDING_CB_INNER(FIFO_IDX)
|
||||||
/* Private typedef ---------------------------------------------------------- */
|
/* Private typedef ---------------------------------------------------------- */
|
||||||
typedef struct BSP_FDCAN_QueueNode {
|
typedef struct BSP_FDCAN_QueueNode {
|
||||||
BSP_FDCAN_t fdcan;
|
BSP_FDCAN_t fdcan;
|
||||||
@ -309,7 +355,7 @@ int8_t BSP_FDCAN_Init(void) {
|
|||||||
// 过滤器类型: (仅介绍掩码模式)
|
// 过滤器类型: (仅介绍掩码模式)
|
||||||
// sFilterConfig.FilterType = FDCAN_FILTER_MASK;(掩码模式)
|
// sFilterConfig.FilterType = FDCAN_FILTER_MASK;(掩码模式)
|
||||||
// 过滤器配置:
|
// 过滤器配置:
|
||||||
// sFilterConfig.FilterConfig = FDCAN_FILTER_DISABLE; (禁用该滤波器条目)
|
// sFilterConfig.FilterConfig = FDCAN_FILTER_DISABLE; (禁用该过滤器条目)
|
||||||
// FDCAN_FILTER_TO_RXFIFO0; (将匹配的消息放入 FIFO 0(普通优先级))
|
// FDCAN_FILTER_TO_RXFIFO0; (将匹配的消息放入 FIFO 0(普通优先级))
|
||||||
// FDCAN_FILTER_TO_RXFIFO1; (将匹配的消息放入 FIFO 1(高优先级))
|
// FDCAN_FILTER_TO_RXFIFO1; (将匹配的消息放入 FIFO 1(高优先级))
|
||||||
// FDCAN_FILTER_TO_RXBUFFER; (将匹配的消息放入 指定的接收缓冲区)
|
// FDCAN_FILTER_TO_RXBUFFER; (将匹配的消息放入 指定的接收缓冲区)
|
||||||
@ -332,67 +378,59 @@ int8_t BSP_FDCAN_Init(void) {
|
|||||||
// 标记校准信息(用于 FDCAN 校准/时钟相关单元作特殊处理或统计)
|
// 标记校准信息(用于 FDCAN 校准/时钟相关单元作特殊处理或统计)
|
||||||
// 仅在FilterConfig 设为 FDCAN_FILTER_TO_RXBUFFER 时才有意义,通常设置为0
|
// 仅在FilterConfig 设为 FDCAN_FILTER_TO_RXBUFFER 时才有意义,通常设置为0
|
||||||
// IsCalibrationMsg = 0 or 1;
|
// IsCalibrationMsg = 0 or 1;
|
||||||
|
// fdcan_filter_table.h
|
||||||
|
|
||||||
/* 依据上述说明,配置过滤器 */
|
/* 依据上述说明,配置过滤器并启动FDCAN */
|
||||||
FDCAN_FilterTypeDef sFilterConfig;
|
FDCAN_FilterTypeDef sFilterConfig;
|
||||||
/* 配置 FDCAN1 过滤器 */
|
|
||||||
/* 索引0;标准ID;掩码模式;存入 FIFO 0(普通优先级);不过滤; */
|
|
||||||
sFilterConfig.FilterIndex = 0;
|
|
||||||
sFilterConfig.IdType = FDCAN_STANDARD_ID;
|
|
||||||
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
|
|
||||||
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
|
|
||||||
sFilterConfig.FilterID1 = 0x000;
|
|
||||||
sFilterConfig.FilterID2 = 0x000;
|
|
||||||
sFilterConfig.RxBufferIndex = 0;
|
|
||||||
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);
|
|
||||||
HAL_FDCAN_ConfigGlobalFilter(&hfdcan1,FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
|
|
||||||
/* 配置 FDCAN2 过滤器 */
|
|
||||||
/* 索引0;标准ID;掩码模式;存入 FIFO 1(普通优先级);不过滤; */
|
|
||||||
sFilterConfig.FilterIndex = 0;
|
|
||||||
sFilterConfig.IdType = FDCAN_STANDARD_ID;
|
|
||||||
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
|
|
||||||
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
|
|
||||||
sFilterConfig.FilterID1 = 0x000;
|
|
||||||
sFilterConfig.FilterID2 = 0x000;
|
|
||||||
sFilterConfig.RxBufferIndex = 0;
|
|
||||||
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
|
|
||||||
HAL_FDCAN_ConfigGlobalFilter(&hfdcan2,FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
|
|
||||||
/* 配置 FDCAN3 过滤器 */
|
|
||||||
/* 索引0;标准ID;掩码模式;存入 FIFO 1(普通优先级);不过滤; */
|
|
||||||
sFilterConfig.FilterIndex = 0;
|
|
||||||
sFilterConfig.IdType = FDCAN_STANDARD_ID;
|
|
||||||
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
|
|
||||||
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
|
|
||||||
sFilterConfig.FilterID1 = 0x000;
|
|
||||||
sFilterConfig.FilterID2 = 0x000;
|
|
||||||
sFilterConfig.RxBufferIndex = 0;
|
|
||||||
HAL_FDCAN_ConfigFilter(&hfdcan3, &sFilterConfig);
|
|
||||||
HAL_FDCAN_ConfigGlobalFilter(&hfdcan3,FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE);
|
|
||||||
|
|
||||||
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE
|
#ifdef FDCAN1_EN
|
||||||
| FDCAN_IT_TX_EVT_FIFO_NEW_DATA
|
#define hfdcan hfdcan1
|
||||||
| FDCAN_IT_RAM_ACCESS_FAILURE, 0);//加一个RAM访问失败中断
|
#define FDCANX_RX_FIFO FDCAN1_RX_FIFO
|
||||||
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO1_NEW_MESSAGE
|
FDCAN1_FILTER_CONFIG_TABLE(FDCAN_CONFIG_FILTER)
|
||||||
| FDCAN_IT_TX_EVT_FIFO_NEW_DATA
|
#undef hfdcan
|
||||||
| FDCAN_IT_RAM_ACCESS_FAILURE, 0);
|
#undef FDCANX_RX_FIFO
|
||||||
HAL_FDCAN_ActivateNotification(&hfdcan3, FDCAN_IT_RX_FIFO1_NEW_MESSAGE
|
HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN1_GLOBAL_FILTER);
|
||||||
| FDCAN_IT_TX_EVT_FIFO_NEW_DATA
|
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCANx_NOTIFY_FLAGS(FDCAN1_RX_FIFO), 0);
|
||||||
| FDCAN_IT_RAM_ACCESS_FAILURE, 0);
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_1, FDCANX_MSG_PENDING_CB(FDCAN1_RX_FIFO), BSP_FDCAN_RxFifo0Callback);
|
||||||
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_1, HAL_FDCAN_RX_FIFO0_MSG_PENDING_CB, BSP_FDCAN_RxFifo0Callback);
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_1, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_1, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
||||||
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_2, HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB, BSP_FDCAN_RxFifo1Callback);
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_2, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
|
||||||
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_3, HAL_FDCAN_RX_FIFO1_MSG_PENDING_CB, BSP_FDCAN_RxFifo1Callback);
|
|
||||||
BSP_FDCAN_RegisterCallback(BSP_FDCAN_3, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
|
||||||
|
|
||||||
/* __ ,启动! */
|
|
||||||
HAL_FDCAN_Start(&hfdcan1);
|
HAL_FDCAN_Start(&hfdcan1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FDCAN2_EN
|
||||||
|
#define hfdcan hfdcan2
|
||||||
|
#define FDCANX_RX_FIFO FDCAN2_RX_FIFO
|
||||||
|
FDCAN2_FILTER_CONFIG_TABLE(FDCAN_CONFIG_FILTER)
|
||||||
|
#undef hfdcan
|
||||||
|
#undef FDCANX_RX_FIFO
|
||||||
|
HAL_FDCAN_ConfigGlobalFilter(&hfdcan2, FDCAN2_GLOBAL_FILTER);
|
||||||
|
HAL_FDCAN_ActivateNotification(&hfdcan2, FDCANx_NOTIFY_FLAGS(FDCAN2_RX_FIFO), 0);
|
||||||
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_2, FDCANX_MSG_PENDING_CB(FDCAN2_RX_FIFO), BSP_FDCAN_RxFifo1Callback);
|
||||||
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_2, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
||||||
HAL_FDCAN_Start(&hfdcan2);
|
HAL_FDCAN_Start(&hfdcan2);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FDCAN3_EN
|
||||||
|
#define hfdcan hfdcan3
|
||||||
|
#define FDCANX_RX_FIFO FDCAN3_RX_FIFO
|
||||||
|
FDCAN3_FILTER_CONFIG_TABLE(FDCAN_CONFIG_FILTER)
|
||||||
|
#undef hfdcan
|
||||||
|
#undef FDCANX_RX_FIFO
|
||||||
|
HAL_FDCAN_ConfigGlobalFilter(&hfdcan3, FDCAN3_GLOBAL_FILTER);
|
||||||
|
HAL_FDCAN_ActivateNotification(&hfdcan3, FDCANx_NOTIFY_FLAGS(FDCAN3_RX_FIFO), 0);
|
||||||
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_3, FDCANX_MSG_PENDING_CB(FDCAN3_RX_FIFO), BSP_FDCAN_RxFifo1Callback);
|
||||||
|
BSP_FDCAN_RegisterCallback(BSP_FDCAN_3, HAL_FDCAN_TX_EVENT_FIFO_CB, BSP_FDCAN_TxCompleteCallback);
|
||||||
HAL_FDCAN_Start(&hfdcan3);
|
HAL_FDCAN_Start(&hfdcan3);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef FDCAN_FILTER_TO_RXFIFO_ENUM_INNER
|
||||||
|
#undef FDCAN_FILTER_TO_RXFIFO_ENUM
|
||||||
|
#undef FDCAN_CONFIG_FILTER
|
||||||
|
#undef FDCAN_NOTIFY_FLAG_RXFIFO_INNER
|
||||||
|
#undef FDCAN_NOTIFY_FLAG_RXFIFO
|
||||||
|
#undef FDCANx_NOTIFY_FLAGS
|
||||||
|
#undef FDCANX_MSG_PENDING_CB_INNER
|
||||||
|
#undef FDCANX_MSG_PENDING_CB
|
||||||
|
|
||||||
return BSP_OK;
|
return BSP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,54 +461,61 @@ int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t
|
|||||||
FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle(fdcan);
|
FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle(fdcan);
|
||||||
if (hfdcan == NULL) return BSP_ERR_NULL;
|
if (hfdcan == NULL) return BSP_ERR_NULL;
|
||||||
|
|
||||||
BSP_FDCAN_TxMessage_t tx_msg = {0};
|
BSP_FDCAN_TxMessage_t tx_msg = {0};
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case BSP_FDCAN_FORMAT_STD_DATA:
|
case BSP_FDCAN_FORMAT_STD_DATA:
|
||||||
tx_msg.header.Identifier = id;
|
tx_msg.header.Identifier = id;
|
||||||
tx_msg.header.IdType = FDCAN_STANDARD_ID;
|
tx_msg.header.IdType = FDCAN_STANDARD_ID;
|
||||||
tx_msg.header.TxFrameType = FDCAN_DATA_FRAME;
|
tx_msg.header.TxFrameType = FDCAN_DATA_FRAME;
|
||||||
break;
|
break;
|
||||||
case BSP_FDCAN_FORMAT_EXT_DATA:
|
case BSP_FDCAN_FORMAT_EXT_DATA:
|
||||||
tx_msg.header.Identifier = id;
|
tx_msg.header.Identifier = id;
|
||||||
tx_msg.header.IdType = FDCAN_EXTENDED_ID;
|
tx_msg.header.IdType = FDCAN_EXTENDED_ID;
|
||||||
tx_msg.header.TxFrameType = FDCAN_DATA_FRAME;
|
tx_msg.header.TxFrameType = FDCAN_DATA_FRAME;
|
||||||
break;
|
break;
|
||||||
case BSP_FDCAN_FORMAT_STD_REMOTE:
|
case BSP_FDCAN_FORMAT_STD_REMOTE:
|
||||||
tx_msg.header.Identifier = id;
|
tx_msg.header.Identifier = id;
|
||||||
tx_msg.header.IdType = FDCAN_STANDARD_ID;
|
tx_msg.header.IdType = FDCAN_STANDARD_ID;
|
||||||
tx_msg.header.TxFrameType = FDCAN_REMOTE_FRAME;
|
tx_msg.header.TxFrameType = FDCAN_REMOTE_FRAME;
|
||||||
break;
|
break;
|
||||||
case BSP_FDCAN_FORMAT_EXT_REMOTE:
|
case BSP_FDCAN_FORMAT_EXT_REMOTE:
|
||||||
tx_msg.header.Identifier = id;
|
tx_msg.header.Identifier = id;
|
||||||
tx_msg.header.IdType = FDCAN_EXTENDED_ID;
|
tx_msg.header.IdType = FDCAN_EXTENDED_ID;
|
||||||
tx_msg.header.TxFrameType = FDCAN_REMOTE_FRAME;
|
tx_msg.header.TxFrameType = FDCAN_REMOTE_FRAME;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return BSP_ERR;
|
return BSP_ERR;
|
||||||
}
|
}
|
||||||
|
switch (hfdcan->Init.FrameFormat) {
|
||||||
|
case FDCAN_FRAME_FD_BRS:
|
||||||
|
tx_msg.header.BitRateSwitch = FDCAN_BRS_ON;
|
||||||
|
tx_msg.header.FDFormat = FDCAN_FD_CAN;
|
||||||
|
break;
|
||||||
|
case FDCAN_FRAME_FD_NO_BRS:
|
||||||
|
tx_msg.header.BitRateSwitch = FDCAN_BRS_OFF;
|
||||||
|
tx_msg.header.FDFormat = FDCAN_FD_CAN;
|
||||||
|
break;
|
||||||
|
case FDCAN_FRAME_CLASSIC:
|
||||||
|
default:
|
||||||
|
tx_msg.header.BitRateSwitch = FDCAN_BRS_OFF;
|
||||||
|
tx_msg.header.FDFormat = FDCAN_CLASSIC_CAN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
tx_msg.header.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
|
tx_msg.header.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
|
||||||
|
tx_msg.header.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
|
||||||
// tx_msg.header.BitRateSwitch = FDCAN_BRS_OFF;
|
|
||||||
// tx_msg.header.FDFormat = FDCAN_CLASSIC_CAN;
|
|
||||||
// tx_msg.header.BitRateSwitch = FDCAN_BRS_ON;
|
|
||||||
// tx_msg.header.FDFormat = FDCAN_FD_CAN;
|
|
||||||
tx_msg.header.BitRateSwitch = FDCAN_BRS_OFF;
|
|
||||||
tx_msg.header.FDFormat = FDCAN_FD_CAN;
|
|
||||||
|
|
||||||
tx_msg.header.TxEventFifoControl = FDCAN_STORE_TX_EVENTS;
|
|
||||||
tx_msg.header.MessageMarker = 0x01;
|
tx_msg.header.MessageMarker = 0x01;
|
||||||
tx_msg.header.DataLength = BSP_FDCAN_EncodeDLC(dlc);
|
tx_msg.header.DataLength = BSP_FDCAN_EncodeDLC(dlc);
|
||||||
|
|
||||||
memset(tx_msg.data, 0, dlc);
|
memset(tx_msg.data, 0, dlc);
|
||||||
if (data != NULL && dlc > 0) {
|
if (data != NULL && dlc > 0) {
|
||||||
memcpy(tx_msg.data, data, dlc);}
|
memcpy(tx_msg.data, data, dlc);}
|
||||||
|
|
||||||
fifolevel=HAL_FDCAN_GetTxFifoFreeLevel(hfdcan);
|
fifolevel=HAL_FDCAN_GetTxFifoFreeLevel(hfdcan);
|
||||||
if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) > 0) {
|
if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) > 0) {
|
||||||
if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &tx_msg.header, tx_msg.data) == HAL_OK) return BSP_OK;
|
if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &tx_msg.header, tx_msg.data) == HAL_OK) return BSP_OK;
|
||||||
}
|
}
|
||||||
if (BSP_FDCAN_TxQueuePush(fdcan, &tx_msg)) return BSP_OK;
|
if (BSP_FDCAN_TxQueuePush(fdcan, &tx_msg)) return BSP_OK;
|
||||||
return BSP_ERR;
|
return BSP_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t BSP_FDCAN_TransmitStdDataFrame(BSP_FDCAN_t fdcan, BSP_FDCAN_StdDataFrame_t *frame) {
|
int8_t BSP_FDCAN_TransmitStdDataFrame(BSP_FDCAN_t fdcan, BSP_FDCAN_StdDataFrame_t *frame) {
|
||||||
|
|||||||
@ -21,7 +21,22 @@ extern "C" {
|
|||||||
#define BSP_FDCAN_TIMEOUT_IMMEDIATE 0
|
#define BSP_FDCAN_TIMEOUT_IMMEDIATE 0
|
||||||
#define BSP_FDCAN_TIMEOUT_FOREVER osWaitForever
|
#define BSP_FDCAN_TIMEOUT_FOREVER osWaitForever
|
||||||
#define BSP_FDCAN_TX_QUEUE_SIZE 32
|
#define BSP_FDCAN_TX_QUEUE_SIZE 32
|
||||||
|
/* Exported macro ----------------------------------------------------------- */
|
||||||
|
//FDCANX实例使能
|
||||||
|
#define FDCAN1_EN
|
||||||
|
#define FDCAN2_EN
|
||||||
|
#define FDCAN3_EN
|
||||||
|
|
||||||
|
// FDCANX接收FIFO选择(0=FIFO0, 1=FIFO1)
|
||||||
|
#ifdef FDCAN1_EN
|
||||||
|
#define FDCAN1_RX_FIFO 0
|
||||||
|
#endif
|
||||||
|
#ifdef FDCAN2_EN
|
||||||
|
#define FDCAN2_RX_FIFO 1
|
||||||
|
#endif
|
||||||
|
#ifdef FDCAN3_EN
|
||||||
|
#define FDCAN3_RX_FIFO 1
|
||||||
|
#endif
|
||||||
/* Exported types ----------------------------------------------------------- */
|
/* Exported types ----------------------------------------------------------- */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
BSP_FDCAN_1,
|
BSP_FDCAN_1,
|
||||||
|
|||||||
@ -71,13 +71,13 @@ void Task_blink(void *argument) {
|
|||||||
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20};
|
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20};
|
||||||
|
|
||||||
// 简单 CRC/校验(可选)
|
// 简单 CRC/校验(可选)
|
||||||
data1[7] = data1[0] ^ data1[1] ^ data1[2];
|
// data1[7] = data1[0] ^ data1[1] ^ data1[2];
|
||||||
data2[7] = data2[0] ^ data2[1] ^ data2[2];
|
// data2[7] = data2[0] ^ data2[1] ^ data2[2];
|
||||||
// data3[7] = data3[0] ^ data3[1] ^ data3[2];
|
// data3[7] = data3[0] ^ data3[1] ^ data3[2];
|
||||||
|
|
||||||
// 使用 BSP 封装的发送接口(非阻塞,若硬件 FIFO 满则内部入队)
|
// 使用 BSP 封装的发送接口(非阻塞,若硬件 FIFO 满则内部入队)
|
||||||
// BSP_FDCAN_Transmit(BSP_FDCAN_1, BSP_FDCAN_FORMAT_STD_DATA, 0x101, data1, 8);
|
BSP_FDCAN_Transmit(BSP_FDCAN_1, BSP_FDCAN_FORMAT_STD_DATA, 0x101, data1, 8);
|
||||||
// BSP_FDCAN_Transmit(BSP_FDCAN_2, BSP_FDCAN_FORMAT_STD_DATA, 0x102, data2, 8);
|
BSP_FDCAN_Transmit(BSP_FDCAN_2, BSP_FDCAN_FORMAT_STD_DATA, 0x102, data2, 8);
|
||||||
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 13);
|
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 13);
|
||||||
|
|
||||||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg1, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg1, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user