硬汉嵌入式论坛

 找回密码
 立即注册
查看: 607|回复: 1
收起左侧

[CAN/FDCAN] STM32H7的CANFD TxFIFO和TxBuffer中断使能方法

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2023-5-11 02:59:26 | 显示全部楼层 |阅读模式



代码:
[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: 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(uint8_t *_DataBuf, uint32_t _Len)
{		
	FDCAN_TxHeaderTypeDef TxHeader = {0};

	/* 配置发送参数 */
	TxHeader.Identifier = 0x222;             		 /* 设置接收帧消息的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_STORE_TX_EVENTS;/* 用于发送事件FIFO控制, 不存储 */
	TxHeader.MessageMarker = 1;                      /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
	
    /* 添加数据到TX FIFO */
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf);
	
	/* Tx接收到新消息就触发中断 */
	HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);	
	
	TxHeader.MessageMarker = 2;
	HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER0);
	
	HAL_FDCAN_EnableTxBufferRequest(&hfdcan1, FDCAN_TX_BUFFER0);
	HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_COMPLETE, FDCAN_TX_BUFFER0);
}


下载.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2023-5-11 17:52:46 | 显示全部楼层
更新一次性发送多个FIFO和Buffer

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: 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(uint8_t *_DataBuf, uint32_t _Len)
{		
	FDCAN_TxHeaderTypeDef TxHeader = {0};

	/* 第1步:配置发送参数 ===================================================================*/
	TxHeader.Identifier = 0x222;             		     /* 设置接收帧消息的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_STORE_TX_EVENTS; /* 用于发送事件FIFO控制, 不存储 */
	TxHeader.MessageMarker = 1;                          /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
	
    /* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
	TxHeader.MessageMarker = 2;   
	HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
	TxHeader.MessageMarker = 3;   
	HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf); /* 根据需要,可以修改_DataBuf数值 */
	
	/* 使能Tx FIFO发送空中断 */
	HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);	
	
    /* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
	TxHeader.MessageMarker = 4;
	HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER0);/* 根据需要,可以修改_DataBuf数值 */
	HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,  &TxHeader, _DataBuf, FDCAN_TX_BUFFER1);/* 根据需要,可以修改_DataBuf数值 */
	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);
}


QQ截图20230511175331.png


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 06:16 , Processed in 0.177869 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表