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

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号设置小一点,争取在同时发送数据的时候享有最高的优先级
qazplm3218 回答时间:2019-8-30 08:48:42
哀歌与世无争 发表于 2019-8-29 13:13
不会同时收到数据,因为can发送有总线优先级仲裁。
多个节点竞争总线时,ID小的优先级高;
ID相同标准帧 ...

我请教个问题,在数据帧里还需要自己在加入检验码吗?比如:和检验、CRC校验
mylovemcu 回答时间:2019-8-30 09:43:52
qazplm3218 发表于 2019-8-30 08:48
我请教个问题,在数据帧里还需要自己在加入检验码吗?比如:和检验、CRC校验 ...

不用增加校验了,CAN数据位一共就8位,再加数据位就没了,CAN的校验是在硬件中完成的,本身协议就是CRC16   所以CAN的可靠性很高

评分

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

查看全部评分

qazplm3218 回答时间:2019-8-30 10:44:29
明白了,谢谢各位指导!!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版