你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CAN通讯?

[复制链接]
qazplm3218 提问时间:2019-8-29 08:46 /
STM32F103实现CAN通讯:一台主机下面挂上64个从机,从机地址为1-64,以哪种方式进行数据的传递??第一种:主机是以广播的形式向64个从机发送指令,然后64个从机同时返回数据,主机在接收解析64条数据???
第二种:主机先向1从机发送数据,然后1从机响应返回数据,主机在接收解析1从机数据;然后主机再向2从机发送数据,然后2从机响应返回数据,主机接收解析2从机数据;直到64从机,依次循环....??
收藏 1 评论13 发布时间:2019-8-29 08:46

举报

13个回答
哀歌与世无争 回答时间:2019-8-30 09:04:25
qazplm3218 发表于 2019-8-30 08:48
我请教个问题,在数据帧里还需要自己在加入检验码吗?比如:和检验、CRC校验 ...

不用,can总线是自带校验的,一帧can报文里包含一段检验域,使用的是CRC16校验,收到报文后can控制器会自动计算校验,校验通过才接受报文,这些都是硬件外设自动完成的,不用代码编辑,这就为啥汽车都是用can,比串口强大很多。
所以stm32能进can接受中断,说明报文已经通过校验了,不用再加校验了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wu18946796976 回答时间:2019-8-29 08:52:51
CAN是以第一种的方法发送数据
1、CAN总线种没有主机和从机,任何两台设备之间都可以通讯
2、虽然总线上有数据,但任意一个设备只能解析和本身地址一样的数据,其他地址的数据自动过滤,不存在解析64条数据

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

Dandjinh 回答时间:2019-8-29 08:56:41
主机问1号,1号回答,2号收到1号回答也发回答,以此类推
qazplm3218 回答时间:2019-8-29 10:14:43
wu18946796976 发表于 2019-8-29 08:52
CAN是以第一种的方法发送数据
1、CAN总线种没有主机和从机,任何两台设备之间都可以通讯
2、虽然总线上有数 ...

通过设置过滤器,所谓的主机可以接收所有从机的数据,但是从机之间不能相互通讯。这样的话,就是要主机通过从机的ID,解析64条对应ID的数据,这个思路正确吗 ??
回答时间:2019-8-29 10:41:50
通过CANid源地址或者CAN数据字节指定接收内容。所有设备都可以收到CAN数据,只需要判断是不是自己需要应答即可。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

TLLED 回答时间:2019-8-29 10:42:15
通过设定的从CAN帧ID来轮询收发数据

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

qazplm3218 回答时间:2019-8-29 11:21:46
安 发表于 2019-8-29 10:41
通过CANid源地址或者CAN数据字节指定接收内容。所有设备都可以收到CAN数据,只需要判断是不是自己需要应答 ...

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
  RxMessage.StdId=0x00;
  RxMessage.ExtId=0x00;
  RxMessage.IDE=0;
  RxMessage.DLC=0;
  RxMessage.FMI=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;   
       
  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);                                                                                                                                                                                
        if(RxMessage.StdId==0x0001)
        {
             数组1接收数据
        }
      if(RxMessage.StdId==0x0002)
        {
             数组2接收数据
        }


以上是在CAN接收中断程序。ID0x01、ID 0x02同时发送数据,只有接收到ID01的数据,ID02接收不到数据??程序要怎么处理???

谢谢



回答时间:2019-8-29 11:46:32
不可能同时接收到的。处理完一个再处理下一个。可以加断点,每次进入时,CAN接收的内容。
哀歌与世无争 回答时间:2019-8-29 13:13:43
qazplm3218 发表于 2019-8-29 11:21
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;

不会同时收到数据,因为can发送有总线优先级仲裁。
多个节点竞争总线时,ID小的优先级高;
ID相同标准帧优先级高于扩展帧,数据帧优先级高于远程帧
所以同时发送会先收到0x01后收到0x02
wu18946796976 回答时间:2019-8-29 14:13:12
qazplm3218 发表于 2019-8-29 10:14
通过设置过滤器,所谓的主机可以接收所有从机的数据,但是从机之间不能相互通讯。这样的话,就是要主机通 ...

通过设置过滤器确实可以接收到所有设备的数据,如果所有的设备都不设置过滤器,那每一个设备都可以收到其他所有设备的数据,整个就是一个马蜂窝,根本不知道数据来自哪里,要发送到哪里,这个系统就是一个没有实际应用的系统,没有任何项目意义,那样的话就和你的思路一样的,每一个设备都要接收64个设备的数据
还有一点,CAN网络中没有主机和从机的概念,区分优先级是通过ID号识别的,所以CAN网络中每个设备必须要有ID,也就是要设置过滤器,保证网络中每一个设备的唯一性,在强调一次,CAN网络中没有主机和从机的概念,网络中关系都是平行的,并且ID越小的设备优先级越高,所以网络中的主控单元一类的ID号设置小一点,争取在同时发送数据的时候享有最高的优先级
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版