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

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

[复制链接]
  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    110

    主题

    463

    回帖

    890

    积分

    高级会员

    积分
    890
    发表于 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;     //设置发送忙标志
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 134 天

    [LV.7]常住居民III

    26

    主题

    1310

    回帖

    4081

    积分

    论坛元老

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

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 158 天

    [LV.7]常住居民III

    110

    主题

    463

    回帖

    890

    积分

    高级会员

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-7 18:19 , Processed in 0.056489 second(s), 39 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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