|
void MX_FDCAN1_Init(void)
{
/* USER CODE BEGIN FDCAN1_Init 0 */
*/
/* USER CODE END FDCAN1_Init 0 */
/* USER CODE BEGIN FDCAN1_Init 1 */
/* USER CODE END FDCAN1_Init 1 */
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;
hfdcan1.Init.Mode = FDCAN_MODE_INTERNAL_LOOPBACK;
hfdcan1.Init.AutoRetransmission = ENABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = ENABLE;
hfdcan1.Init.NominalPrescaler = 5;
hfdcan1.Init.NominalSyncJumpWidth = 1;
hfdcan1.Init.NominalTimeSeg1 = 6;
hfdcan1.Init.NominalTimeSeg2 = 2;
hfdcan1.Init.DataPrescaler = 2;
hfdcan1.Init.DataSyncJumpWidth = 1;
hfdcan1.Init.DataTimeSeg1 = 8;
hfdcan1.Init.DataTimeSeg2 = 1;
hfdcan1.Init.MessageRAMOffset = 0;
hfdcan1.Init.StdFiltersNbr = 4; //
hfdcan1.Init.ExtFiltersNbr = 4;
hfdcan1.Init.RxFifo0ElmtsNbr = 16;
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
hfdcan1.Init.RxFifo1ElmtsNbr = 16;
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
hfdcan1.Init.RxBuffersNbr = 16;
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_64;
hfdcan1.Init.TxEventsNbr = 16;
hfdcan1.Init.TxBuffersNbr = 16;
hfdcan1.Init.TxFifoQueueElmtsNbr = 16;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN FDCAN1_Init 2 */
/*
配置过滤器, 过滤器主要用于接收,比如屏蔽位模式。
FilterID1 = filter
FilterID2 = mask
FilterID2的mask每个bit含义
0: 不关心,该位不用于比较;
1: 必须匹配,接收到的ID必须与滤波器对应的ID位相一致。
举例说明:
FilterID1 = 0x111 001 0001 0001
FilterID2 = 0x7FF 111 1111 1111
表示仅接收ID为0x111的FDCAN帧。
*/
/* 第4步:扩展ID过滤设置 ==================================================================================*/
sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,扩展ID,范围0到64 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -----------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x12345678; /* 起始ID:0x12345678 */
sFilterConfig1.FilterID2 = 0x12345680; /* 结束ID:0x12345680 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 扩展ID */
sFilterConfig1.FilterIndex = 1; /* 用于过滤索引,扩展ID,范围0到64 */
sFilterConfig1.FilterType = FDCAN_FILTER_DUAL; /* 专用ID过滤 --------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x12345681; /* 指定ID */
sFilterConfig1.FilterID2 = 0x12345682; /* 指定ID */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 扩展ID */
sFilterConfig1.FilterIndex = 2; /* 用于过滤索引,扩展ID,范围0到64 */
sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 过滤器采样屏蔽位模式 ----*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO1; /* 如果过滤匹配,将数据保存到Rx FIFO 1 */
sFilterConfig1.FilterID1 = 0x12345683; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x1FFFFFFF; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
// sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 扩展ID */
// sFilterConfig1.FilterIndex = 3; /* 用于过滤索引,扩展ID,范围0到64 */
// sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 忽略 --------------------*/
// sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXBUFFER; /* 如果过滤匹配,将数据保存到Rx Buffer */
// sFilterConfig1.FilterID1 = 0x12345684; /* 接收指定ID消息 */
// sFilterConfig1.FilterID2 = 0x1FFFFFFF; /* 忽略 */
// sFilterConfig1.IsCalibrationMsg = 0; /* 正常消息 */
// sFilterConfig1.RxBufferIndex = 0; /* Rx buffer位置 */
// HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
/* 第5步:标准ID过滤设置 ==================================================================================*/
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_RANGE; /* 范围过滤 -------------------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x000; /* 起始ID:0x000 */
sFilterConfig1.FilterID2 = 0x010; /* 结束ID:0x010 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 1; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_DUAL; /* 专用ID过滤 ----------------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x011; /* 指定ID */
sFilterConfig1.FilterID2 = 0x012; /* 指定ID */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 2; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 过滤器采样屏蔽位模式 -----------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x013; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x7FF; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
// sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
// sFilterConfig1.FilterIndex = 3; /* 用于过滤索引,扩展ID,范围0到64 */
// sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 忽略 ---------------------------*/
// sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXBUFFER; /* 如果过滤匹配,将数据保存到Rx BUFFER */
// sFilterConfig1.FilterID1 = 0x014; /* 接收指定ID消息 */
// sFilterConfig1.FilterID2 = 0x7FF; /* 忽略 */
// sFilterConfig1.IsCalibrationMsg = 0; /* 正常消息 */
// sFilterConfig1.RxBufferIndex = 1; /* Rx buffer位置 */
// HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, /* 全局过滤设置 */
FDCAN_REJECT, /* 接收到消息ID与标准ID过滤不匹配,不接受 */
FDCAN_REJECT, /* 接收到消息ID与扩展ID过滤不匹配,不接受 */
FDCAN_FILTER_REMOTE, /* 过滤标准ID远程帧 */
FDCAN_FILTER_REMOTE); /* 过滤扩展ID远程帧 */
/* 第5步:Rx FIFO0中断配置 ===================================================================*/
/* 设置Rx FIFO0的阈值为1 ---------------------------------------*/
HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 1);
/* 开启RX FIFO0的阈值中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
/* 第6步:Rx FIFO1中断配置 ===================================================================*/
/* 开启RX FIFO1的新数据中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
/* 第7步:Rx Buffer中断配置 ==================================================================*/
/* Rx Buffer接收到新消息就触发中断 */
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_BUFFER_NEW_MESSAGE, 0);
/* 启动FDCAN */
HAL_FDCAN_Start(&hfdcan1);
/* USER CODE END FDCAN1_Init 2 */
}
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(fdcanHandle->Instance==FDCAN1)
{
/* USER CODE BEGIN FDCAN1_MspInit 0 */
/* USER CODE END FDCAN1_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
PeriphClkInitStruct.PLL2.PLL2M = 5;
PeriphClkInitStruct.PLL2.PLL2N = 80;
PeriphClkInitStruct.PLL2.PLL2P = 2;
PeriphClkInitStruct.PLL2.PLL2Q = 20;
PeriphClkInitStruct.PLL2.PLL2R = 2;
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
PeriphClkInitStruct.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
/* FDCAN1 clock enable */
__HAL_RCC_FDCAN_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**FDCAN1 GPIO Configuration
PA12 ------> FDCAN1_TX
PA11 ------> FDCAN1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* FDCAN1 interrupt Init */
HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
/* USER CODE BEGIN FDCAN1_MspInit 1 */
/* USER CODE END FDCAN1_MspInit 1 */
}
}
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{
if(fdcanHandle->Instance==FDCAN1)
{
/* USER CODE BEGIN FDCAN1_MspDeInit 0 */
/* USER CODE END FDCAN1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_FDCAN_CLK_DISABLE();
/**FDCAN1 GPIO Configuration
PA12 ------> FDCAN1_TX
PA11 ------> FDCAN1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12|GPIO_PIN_11);
/* FDCAN1 interrupt Deinit */
HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
/* USER CODE BEGIN FDCAN1_MspDeInit 1 */
/* USER CODE END FDCAN1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/*
*********************************************************************************************************
* 函 数 名: HAL_FDCAN_RxFifo0Callback
* 功能说明: Rx FIFO0回调函数
* 形 参: hfdcan
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if (hfdcan == &hfdcan1)
{
if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
{
/* 从RX FIFO0读取数据 */
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &g_Can1RxHeader, g_Can1RxData);
/* 重新使能RX FIFO0阈值中断 */
HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
/* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
// bsp_PutMsg(MSG_CAN1_RxFIFO0, 0);
printf("RxFifo0 recieve data id:0x%x\r\n", g_Can1RxHeader.Identifier);
}
}
}
/*
*********************************************************************************************************
* 函 数 名: HAL_FDCAN_RxFifo0Callback
* 功能说明: Rx FIFO0回调函数
* 形 参: hfdcan
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo1ITs)
{
if (hfdcan == &hfdcan1)
{
printf("RxFifo1 entry\r\n");
if ((RxFifo1ITs & FDCAN_IT_RX_FIFO1_NEW_MESSAGE) != RESET)
{
/* 从RX FIFO1读取数据 */
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO1, &g_Can1RxHeader, g_Can1RxData);
/* 使能Rx FIFO1收到新数据阈值中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);
/* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
// bsp_PutMsg(MSG_CAN1_RxFIFO1, 0);
printf("RxFifo1 recieve data\r\n");
}
}
}
/*
*********************************************************************************************************
* 函 数 名: HAL_FDCAN_RxBufferNewMessageCallback
* 功能说明: Rx Buffer回调函数
* 形 参: hfdcan
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_RxBufferNewMessageCallback(FDCAN_HandleTypeDef *hfdcan)
{
printf("HAL_FDCAN_RxBufferNewMessageCallback\r\n");
HAL_StatusTypeDef Status;
uint8_t i, off;
if (hfdcan == &hfdcan1)
{
for(i = 0; i < 32; i++)
{
off = (hfdcan->Instance->NDAT1 & (1<<i) ) >> i;
if(off == 1)
{
/* 从RX Buffer0读取数据, i值等同于FDCAN_RX_BUFFER */
Status = HAL_FDCAN_GetRxMessage(hfdcan, i, &g_Can1RxHeader, g_Can1RxData);
if(Status == HAL_OK)
{
/* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
// bsp_PutMsg(MSG_CAN1_RxBuffer, 0);
}
}
}
for(i = 0; i < 32; i++)
{
off = (hfdcan->Instance->NDAT2 & (1<<i) ) >> i;
if(off == 1)
{
/* 从RX Buffer0读取数据, i值等同于FDCAN_RX_BUFFER */
Status = HAL_FDCAN_GetRxMessage(hfdcan, i+31, &g_Can1RxHeader, g_Can1RxData);
if(Status == HAL_OK)
{
/* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */
// bsp_PutMsg(MSG_CAN1_RxBuffer, 0);
}
}
}
}
}
/*
*********************************************************************************************************
* 函 数 名: HAL_FDCAN_TxFifoEmptyCallback
* 功能说明: Tx FIFO发送完成回调函数
* 形 参: hfdcan
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_TxFifoEmptyCallback(FDCAN_HandleTypeDef *hfdcan)
{
if (hfdcan == &hfdcan1)
{
printf("FDCAN1_TxFifoEmpty\r\n");
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
}
}
/*
*********************************************************************************************************
* 函 数 名: HAL_FDCAN_TxBufferCompleteCallback
* 功能说明: Tx Buffer发送完成标志
* 形 参: hfdcan
* 返 回 值: 无
*********************************************************************************************************
*/
void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef *hfdcan, uint32_t BufferIndexes)
{
// if (hfdcan == &hfdcan1)
// {
// bsp_PutMsg(MSG_CAN1_TxBuffer, 0);
// }
//
// if (hfdcan == &hfdcan2)
// {
// bsp_PutMsg(MSG_CAN2_TxBuffer, 0);
// }
}
/*
*********************************************************************************************************
* 函 数 名: can1_SendPacket
* 功能说明: 发送一包数据
* 形 参:_DataBuf 数据缓冲区
* _Len 数据长度
* FDCAN_DLC_BYTES_0
* FDCAN_DLC_BYTES_1
* FDCAN_DLC_BYTES_2
* FDCAN_DLC_BYTES_3
* FDCAN_DLC_BYTES_4
* FDCAN_DLC_BYTES_5
* FDCAN_DLC_BYTES_6
* FDCAN_DLC_BYTES_7
* FDCAN_DLC_BYTES_8
* FDCAN_DLC_BYTES_12
* FDCAN_DLC_BYTES_16
* FDCAN_DLC_BYTES_20
* FDCAN_DLC_BYTES_24
* FDCAN_DLC_BYTES_32
* FDCAN_DLC_BYTES_48
* FDCAN_DLC_BYTES_64
* 返 回 值: 无
*********************************************************************************************************
*/
void can1_SendPacket_one(uint8_t *_DataBuf, uint32_t _Len,uint32_t id)
{
FDCAN_TxHeaderTypeDef TxHeader = {0};
/* 第1步:配置发送参数 ===================================================================*/
TxHeader.Identifier = id; /* 设置接收帧消息的ID */
TxHeader.IdType = FDCAN_STANDARD_ID; /* 标准ID */
TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */
TxHeader.DataLength = _Len; /* 发送数据长度 */
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /* 设置错误状态指示 */
TxHeader.BitRateSwitch = FDCAN_BRS_ON; /* 开启可变波特率 */
TxHeader.FDFormat = FDCAN_FD_CAN; /* FDCAN格式 */
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; /* 用于发送事件FIFO控制, 不存储 */
TxHeader.MessageMarker = 0; /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
/* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
/* 使能Tx FIFO发送空中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
}
void can1_SendPacket(uint8_t *_DataBuf, uint32_t _Len)
{
FDCAN_TxHeaderTypeDef TxHeader = {0};
/* 第1步:配置发送参数 ===================================================================*/
TxHeader.Identifier = 0x001; /* 设置接收帧消息的ID */
TxHeader.IdType = FDCAN_STANDARD_ID; /* 标准ID */
TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */
TxHeader.DataLength = _Len; /* 发送数据长度 */
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /* 设置错误状态指示 */
TxHeader.BitRateSwitch = FDCAN_BRS_ON; /* 开启可变波特率 */
TxHeader.FDFormat = FDCAN_FD_CAN; /* FDCAN格式 */
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; /* 用于发送事件FIFO控制, 不存储 */
TxHeader.MessageMarker = 0; /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
/* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
TxHeader.Identifier = 0x002;
TxHeader.MessageMarker = 1;
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
TxHeader.Identifier = 0x003;
TxHeader.MessageMarker = 2;
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
/* 使能Tx FIFO发送空中断 */
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
// /* 第2步:添加数据到TX BUFFER, 连续添加三组 ================================================*/
// TxHeader.Identifier = 0x12345678;
// TxHeader.IdType = FDCAN_EXTENDED_ID;
// TxHeader.MessageMarker = 4;
// HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1, &TxHeader, _DataBuf, FDCAN_TX_BUFFER0);/* 根据需要,可以修改_DataBuf数值 */
// TxHeader.Identifier = 0x12345681;
// TxHeader.IdType = FDCAN_EXTENDED_ID;
// TxHeader.MessageMarker = 5;
// HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1, &TxHeader, _DataBuf, FDCAN_TX_BUFFER1);/* 根据需要,可以修改_DataBuf数值 */
// TxHeader.Identifier = 0x12345683;
// TxHeader.IdType = FDCAN_EXTENDED_ID;
// TxHeader.MessageMarker = 6;
// HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1, &TxHeader, _DataBuf, FDCAN_TX_BUFFER2);/* 根据需要,可以修改_DataBuf数值 */
//
// /* 使能Tx Buffer发送完成中断 */
// HAL_FDCAN_EnableTxBufferRequest(&hfdcan1, FDCAN_TX_BUFFER0|FDCAN_TX_BUFFER1|FDCAN_TX_BUFFER2);
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE, FDCAN_TX_BUFFER0|FDCAN_TX_BUFFER1|FDCAN_TX_BUFFER2);
}
/* USER CODE END 1 */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|