找回密码
 立即注册
查看: 53|回复: 6

CAN功能寄存器配置函数中的疑问点,请哪位老师讲解一下?

[复制链接]
  • TA的每日心情
    奋斗
    昨天 05:51
  • 签到天数: 154 天

    [LV.7]常住居民III

    110

    主题

    459

    回帖

    866

    积分

    高级会员

    积分
    866
    发表于 2024-4-23 14:17:35 | 显示全部楼层 |阅读模式
    //========================================================================
    // 函数: void CanWriteReg(u8 addr, u8 dat)
    // 描述: CAN功能寄存器配置函数。
    // 参数: CAN功能寄存器地址, CAN功能寄存器数据.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2020-11-16
    // 备注:
    //========================================================================
    void CanWriteReg(u8 addr, u8 dat)
    {
            CANAR = addr;
            CANDR = dat;
    }

    //========================================================================
    // 函数: void CanReadFifo(CAN_DataDef *CANx)
    // 描述: 读取CAN缓冲区数据函数。
    // 参数: *CANx: 存放CAN总线读取数据.
    // 返回: none.
    // 版本: VER2.0
    // 日期: 2023-01-31
    // 备注:
    //========================================================================
    void CanReadFifo(CAN_DataDef *CAN)
    {
        u8 i;
        u8 pdat[5];
        u8 RX_Index=0;

        pdat[0] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));

        if(pdat[0] & 0x80)  //判断是标准帧还是扩展帧
        {
            pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));   //扩展帧ID占4个字节
            pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
            pdat[3] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
            pdat[4] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
            CAN->ID = (((u32)pdat[1] << 24) + ((u32)pdat[2] << 16) + ((u32)pdat[3] << 8) + pdat[4]) >> 3;
        }
        else
        {
            pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));   //标准帧ID占2个字节
            pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
            CAN->ID = ((pdat[1] << 8) + pdat[2]) >> 5;
        }

        CAN->FF = pdat[0] >> 7;     //帧格式
        CAN->RTR = pdat[0] >> 6;    //帧类型
        CAN->DLC = pdat[0];         //数据长度

        for(i=0;((i<CAN->DLC) && (i<8));i++)        //读取数据长度为len,最多不超过8
        {
            CAN->DataBuffer[i] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));//读取有效数据;这里(RX_Index++&3)决定了0-3四个数,读不到4-7这几个字节??
        }
        while(RX_Index&3)//判断已读数据长度是否4的整数倍;这里怎么看出来是4整数的??
        {
            CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));  //读取填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
        }
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:55
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4033

    积分

    论坛元老

    积分
    4033
    发表于 2024-4-23 15:08:56 | 显示全部楼层
    CAN接收缓冲区里面的内容是通过RXBUF0~RXBUF3四个寄存器循环读取的:
    截图202404231504142255.jpg
    也就是例子里面的 RX_BUF0+0 到 RX_BUF0+3。
    所以当 RX_Index&3 不等于0,说明没有读完4的整数倍字节。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 05:51
  • 签到天数: 154 天

    [LV.7]常住居民III

    110

    主题

    459

    回帖

    866

    积分

    高级会员

    积分
    866
     楼主| 发表于 2024-4-23 16:21:39 | 显示全部楼层
    乘风飞扬 发表于 2024-4-23 15:08
    CAN接收缓冲区里面的内容是通过RXBUF0~RXBUF3四个寄存器循环读取的:

    也就是例子里面的 RX_BUF0+0 到 RX_B ...

    感谢老师指点,我深入看一下,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 05:51
  • 签到天数: 154 天

    [LV.7]常住居民III

    110

    主题

    459

    回帖

    866

    积分

    高级会员

    积分
    866
     楼主| 发表于 2024-4-23 17:23:34 | 显示全部楼层
    乘风飞扬 发表于 2024-4-23 15:08
    CAN接收缓冲区里面的内容是通过RXBUF0~RXBUF3四个寄存器循环读取的:

    也就是例子里面的 RX_BUF0+0 到 RX_B ...

    老师:基本都看懂了,还有一点有疑惑,如下:
    CAN模块的RXFIFO是一个64BYTE的FIFO,
    在数据量为1个字节的时候,最多能存储21帧数据。//这个64字节与21帧啥关系?
    数据8个字节的时候,最多能存储5帧数据。//这个64字节与5帧啥关系?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:55
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4033

    积分

    论坛元老

    积分
    4033
    发表于 2024-4-23 17:51:38 | 显示全部楼层
    380091044 发表于 2024-4-23 17:23
    老师:基本都看懂了,还有一点有疑惑,如下:
    CAN模块的RXFIFO是一个64BYTE的FIFO,
    在数据量为1个字节的 ...

    这需要了解一帧报文的内容,如图所示标准帧包含3个字节的信息部分与最多8个字节的数据部分:

    截图202404231740256677.jpg


    一帧报文占用FIFO空间是4的整数倍,所以数据长度为1的数据帧,或者数据长度为0的远程帧都会占用4字节FIFO,64字节FIFO最多可以存放16帧报文。
    当数据长度为8的话,加上3字节信息部分,总共11字节,最多只能存放5帧。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 05:51
  • 签到天数: 154 天

    [LV.7]常住居民III

    110

    主题

    459

    回帖

    866

    积分

    高级会员

    积分
    866
     楼主| 发表于 2024-4-23 19:31:18 | 显示全部楼层
    乘风飞扬 发表于 2024-4-23 17:51
    这需要了解一帧报文的内容,如图所示标准帧包含3个字节的信息部分与最多8个字节的数据部分:

    哦哦,是这样,谢谢老师
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 05:51
  • 签到天数: 154 天

    [LV.7]常住居民III

    110

    主题

    459

    回帖

    866

    积分

    高级会员

    积分
    866
     楼主| 发表于 2024-4-24 08:40:27 | 显示全部楼层
    乘风飞扬 发表于 2024-4-23 17:51
    这需要了解一帧报文的内容,如图所示标准帧包含3个字节的信息部分与最多8个字节的数据部分:

    老师:
    CAN模块的RXFIFO是一个64BYTE的FIFO,//XFIFO是一个64BYTE的FIFO这个我在说明书里面没找到?在哪可以看出来?
    在数据量为1个字节的时候,最多能存储21帧数据。//按照你讲解,数据1+3字节共计4字节,64除以4也就16字节,21帧数据哪来的?
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 02:14 , Processed in 0.062607 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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