硬汉嵌入式论坛

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

[CAN/FDCAN] STM32H7关于FDCAN发送函数的一些小疑惑,请大佬们解答

[复制链接]

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-8-1 15:04:32 | 显示全部楼层 |阅读模式
void can1_SendPacket(uint8_t *_DataBuf, uint8_t _Len){               
        FDCAN_TxHeaderTypeDef TxHeader = {0};

       
        /* 配置发送参数 */
        TxHeader.Identifier = 0x222;                              /* 设置接收帧消息的ID */
        TxHeader.IdType = FDCAN_STANDARD_ID;                      /* 标准ID */
        TxHeader.TxFrameType = FDCAN_DATA_FRAME;                 /* 数据帧 */
        TxHeader.DataLength = (uint32_t)_Len << 16;      /* 发送数据长度 */
        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 */
       
    /* 添加数据到TX FIFO */
    HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf);
}



发送函数的数据长度要左移16bit,接收函数也是右移回去,但是正点原子的FDCAN例子发送函数的数据长度不移动,不知道为什么会这么做?
//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)       
//len:数据长度(最大为8),可设置为FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8                                     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
//                 其他,失败;
u8 FDCAN1_Send_Msg(u8* msg,u32 len)
{       
    FDCAN1_TxHeader.Identifier=0x12;                           //32位ID
    FDCAN1_TxHeader.IdType=FDCAN_STANDARD_ID;                  //标准ID
    FDCAN1_TxHeader.TxFrameType=FDCAN_DATA_FRAME;              //数据帧
    FDCAN1_TxHeader.DataLength=len;                            //数据长度
    FDCAN1_TxHeader.ErrorStateIndicator=FDCAN_ESI_ACTIVE;            
    FDCAN1_TxHeader.BitRateSwitch=FDCAN_BRS_OFF;               //关闭速率切换
    FDCAN1_TxHeader.FDFormat=FDCAN_CLASSIC_CAN;                //传统的CAN模式
    FDCAN1_TxHeader.TxEventFifoControl=FDCAN_NO_TX_EVENTS;     //无发送事件
    FDCAN1_TxHeader.MessageMarker=0;                           
   
    if(HAL_FDCAN_AddMessageToTxFifoQ(&FDCAN1_Handler,&FDCAN1_TxHeader,msg)!=HAL_OK) return 1;//发送
    return 0;       
}


回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
 楼主| 发表于 2023-8-1 15:20:58 | 显示全部楼层
jiejuele!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2023-8-1 16:58:48 | 显示全部楼层
如果你调用的是参数FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8  ,这个参数已经移位了。
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
 楼主| 发表于 2023-8-1 17:21:10 | 显示全部楼层
eric2013 发表于 2023-8-1 16:58
如果你调用的是参数FDCAN_DLC_BYTES_2~FDCAN_DLC_BYTES_8  ,这个参数已经移位了。

嗯嗯,后来看了一下,是这样的,正点原子用的是宏定义,就是这个区别。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 17:43 , Processed in 0.200338 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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