2348|5

302

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于CAN通信的问题,例程上的发送函数有点不太明白,请教下大家 [复制链接]

先上例程:

void CAN1_SendMesg(uint32_t id, uint8_t len, uint8_t *dat)
{
    uint16_t i = 0;
    CanTxMsg TxMessage;

    /* Ò»´Î·¢ËÍÖ»ÄÜ·¢ËÍ8¸ö×Ö½Ú */
    if(len > 8)
    {
            return ;
    }
   
    TxMessage.StdId = (id & 0x7FF);  
    TxMessage.ExtId = (id >> 11);             
    TxMessage.RTR = CAN_RTR_DATA;     //
    if((id & 0x7FF) == 0x7FF)      //判断标准帧还是扩展帧
    {
        TxMessage.IDE = CAN_ID_STD;    
    }
    else
    {
        TxMessage.IDE = CAN_ID_EXT;    //±ê×¼ID
    }
    TxMessage.DLC = len;            //·¢Ë͵ÄÊý¾Ý³¤¶È

    /* ½«Êý¾Ý·ÅÈëµ½ÓÊÏäÖÐ */
    for(i=0; i<len; i++)             
    {
        TxMessage.Data[i] = *dat;
        dat++;    
    }
    CAN_Transmit(CAN1, &TxMessage); 
}

以上就是一个开发板厂商给的例程,问题如下:

1. TxMessage.ExtId = (id >> 11);    不应该是等于id&0x1fffffff?

2. 判断标准帧和扩展帧的方式,这种能判断出来吗?

此帖出自stm32/stm8论坛

最新回复

表达和寄存器(buffer)不一定要一样,你可以具体看芯片手册。   详情 回复 发表于 2021-6-8 16:35
点赞 关注
 

回复
举报

638

帖子

2

TA的资源

版主

沙发
 

CAN的标准帧由18位组成:11个标识位+1位远程发送请求+6位控制字段,共18位

CAN的扩展帧由29位组成:在原标准帧上,扩展的11位的扩展标识位(还包括其中的扩展ID标识符,及替代的位,SRR)

LZ的程序中,id应该是1字数据(4字节),有可能是标准帧,也有可能是扩展帧,这得看具体数据来决定

如果数据>0x7FF(超过了11位),则程序判断为扩展帧,反之,则认为是标准帧。

 TxMessage.ExtId = (id >> 11); 这段程序表示,将扩展帧的数据放入 TxMessage.ExtId中(注意:右移了11位,将原标准帧数据移除了),而不是与0x1fffffff的关系。

此帖出自stm32/stm8论坛

点评

ena
嗯,但是不太清楚为什么要移除呢?在库函数里面CAN_Transmit()中,ID并不是将标准帧和扩展帧组合到一块的,而是单独赋值的,如果移除,ID就不完整了吧  详情 回复 发表于 2021-6-7 11:07

赞赏

1

查看全部赞赏

 
 

回复

302

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
dingzy_2002 发表于 2021-6-7 09:33 CAN的标准帧由18位组成:11个标识位+1位远程发送请求+6位控制字段,共18位 CAN的扩展帧由29位组成:在原 ...

嗯,但是不太清楚为什么要移除呢?在库函数里面CAN_Transmit()中,ID并不是将标准帧和扩展帧组合到一块的,而是单独赋值的,如果移除,ID就不完整了吧

此帖出自stm32/stm8论坛

点评

ID在键入时,是将扩展帧与标准帧分开进行的,但函数将其封装成一个1字(4字节的)数据 这样,在TxMessage中,要分别再拆分成标准帧 TxMessage.StdId与扩展帧 TxMessage.ExtId 这样做的好处: 1,能非常明晰  详情 回复 发表于 2021-6-8 14:17
 
 

回复

4008

帖子

0

TA的资源

版主

4
 

扩展id是标准id的一个子集,发送扩展id时标准id是其中的一部分,就好像子网掩码一样,当然你也可以不遵守这种规则.

此帖出自stm32/stm8论坛
 
 
 

回复

638

帖子

2

TA的资源

版主

5
 
ena 发表于 2021-6-7 11:07 嗯,但是不太清楚为什么要移除呢?在库函数里面CAN_Transmit()中,ID并不是将标准帧和扩展帧组合到一块的 ...

ID在键入时,是将扩展帧与标准帧分开进行的,但函数将其封装成一个1字(4字节的)数据

这样,在TxMessage中,要分别再拆分成标准帧 TxMessage.StdId与扩展帧 TxMessage.ExtId

这样做的好处:
1,能非常明晰的判断与录入标准帧/扩展帧

2.对CAN接收的ID处理友好方便.

 

此帖出自stm32/stm8论坛
 
 
 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

6
 

表达和寄存器(buffer)不一定要一样,你可以具体看芯片手册。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表