找回密码
 立即注册
查看: 398|回复: 2

CAN发送标准帧函数存在疑问点?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-04-30 20:48:13
已绑定手机

151

主题

589

回帖

1196

积分

金牌会员

积分
1196
发表于 2024-4-26 10:37:14 | 显示全部楼层 |阅读模式

疑问问题:见代码中的问号处
//========================================================================
// 函数: void CanSendMsg(CAN_DataDef *CAN)
// 描述: CAN发送标准帧函数。
// 参数: *CANx: 存放CAN总线发送数据..
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CanSendMsg(CAN_DataDef *CAN)
{
        u32 CanID;
    u8 RX_Index,i;

    i = 200;
    while((--i) && (B_CanSend));  //等待上次发送完成

    if(CAN->FF)     //判断是否扩展帧
    {
        CanID = CAN->ID << 3;
        CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)|0x80);        //这里的0x80把FF位置1是扩展帧,下面同样位置处标准帧没有清零呢?????
        CanWriteReg(TX_BUF1,(u8)(CanID>>24));
        CanWriteReg(TX_BUF2,(u8)(CanID>>16));
        CanWriteReg(TX_BUF3,(u8)(CanID>>8));

        CanWriteReg(TX_BUF0,(u8)CanID);

        RX_Index = 1;
        for(i=0;((i<CAN->DLC) && (i<8));i++)        //数据长度为DLC,最多不超过8
        {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer);   //写入有效数据
        }
        while(RX_Index&3)   //判断已读数据长度是否4的整数倍
        {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
        }
    }
    else    //发送标准帧
    {
        CanID = (u16)(CAN->ID << 5);
                          CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)); //前面发送扩展帧时,把FF位进行了置1处理,这里为啥没有把FF置0操作呢???
        CanWriteReg(TX_BUF1,(u8)(CanID>>8));
        CanWriteReg(TX_BUF2,(u8)CanID);

        RX_Index = 3;
        for(i=0;((i<CAN->DLC) && (i<8));i++)        //数据长度为DLC,最多不超过8
        {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer);   //写入有效数据
        }
        while(RX_Index&3)   //判断已读数据长度是否4的整数倍
        {
            CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
        }
    }
        CanWriteReg(CMR ,0x04);                //发起一次帧传输
    B_CanSend = 1;     //设置发送忙标志
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-26 11:08:47 | 显示全部楼层
标准帧 TX_BUF0 写入第一个字节的内容是 CAN->DLC|((u8)CAN->RTR<<6)
CAN->DLC 有效内容只有4位,bit7本来就是0,所以不用清除。
截图202404261108433185.jpg
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-04-30 20:48:13
已绑定手机

151

主题

589

回帖

1196

积分

金牌会员

积分
1196
发表于 2024-4-26 11:21:26 | 显示全部楼层
乘风*** 发表于 2024-4-26 11:08
标准帧 TX_BUF0 写入第一个字节的内容是 CAN->DLC|((u8)CAN->RTR

哦哦,谢谢老师指点,明白了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:51 , Processed in 0.179849 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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