社区导航

 
查看: 936|回复: 11

[原创] 关于总线冲突那点事(一)

[复制链接]

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-23 22:05:15 | 显示全部楼层 |阅读模式
  这个也是系列帖子,是关于酷叔一直想了解的话题:关于总线那点事。酷叔一直想了解的是CAN如何学习,但我想水两个帖子楼主在帖子中若有用词不当的,望各位加以交流纠正。

   在这个帖子中,关于总线的,我都以半双工总线为主题,一个RS485总线,一个CAN总线。就是因为半双工,所以大多情况下,我们都需要考虑到一个问题:在多从机的情况下,如何避免"同时"发送给主机的时候,如何有序地、不造成总线混乱地发送,这是在只有一条总线的情况下,需要考虑的问题。特别是需要广播去读取从机的某个信息,如果不做防冲突机制,总线一乱上发的估计都是一堆乱码。本贴主要说明RS485总线,MCU用的STM32。
  RS485总线不像CAN一样拥有硬件总线仲裁优先级之分,准确来说,所有的节点都可以是主机也可以是从机。如何让其总线不造成冲突,RS485上,楼主也有个方案,就是使用每个节点都带节点地址(拨码开关、信息写死绑定等手段都可以),利用软件不同节点延时检测总线是否空闲+DMA发送快速抢占总线两个方式来进行对其防冲突。
  以下楼主只是说明其原理流程,代码截图过程中可能不太清晰,但是思路上,我可以尽量做到清晰。


此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处





此帖出自stm32/stm8论坛

评分

1

查看全部评分

<font color="Red">物致DIY 期待您的到来~
QQ群:646461928
小店


回复

使用道具 举报

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-23 23:22:35 | 显示全部楼层
在这里,楼主还是以一个广播读取软件版本号,各个节点从机返回版本号为例进行说明。RS485总线与单片机通信需要一个转换芯片,必须转换TTL,也就是相对应的串口。常见的芯片有美信的MAX485等。其中都会有收发使能脚,两个使能脚不要同时使能,一上电默认为使能接收,当有数据发送的时候再使能发送,发送完成再使能接收。如此轮询来进行通信。
追踪到底还是串口问题,但是相比串口,更需要注意的是收发不能同时。总线通信上,楼主习惯使用FIFO队列来收发数据进行异步处理,也就是说不管只要有收到数据或者要发送数据,统统都放进FIFO队列中,当然如果你使用RTOS,也可以使用消息队列来进行收发数据。
所以我们需要做一个初始化的步骤:一些相关变量初始化、FIFO队列初始化、相关IO初始化、相关中断初始化。
TIM截图20181123231448.png
   那么中断上,我们使能了三个中断,一个为接收完成中断、空闲中断、DMA发送完成中断(楼主使用的HAL库,HAL库的DMA发送完成会开启串口发送完成中断)。所以在全局中断里面我们需要判断这三个中断事件并做些相对应的事件逻辑处理。
    TIM截图20181123232209.png
<font color="Red">物致DIY 期待您的到来~
QQ群:646461928
小店


回复

使用道具 举报

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-23 23:55:39 | 显示全部楼层
接收部分的解析就不说明了,因为涉及到的东西好像偏离了主题。那么我们需要考虑的是,如何避免发送的时候,自己的节点不会与其他节点发送造成冲突。我们还没需要一个思路,就是去判断总线上的接收端电平是否拉低作为硬件总线是否空闲,前面的空闲中断只是起到节点上第一时间没有收发数据,要真正能够有序发送,楼主在此还是使用不同节点不同延时阻塞判断接收端的电平是否被拉低作为以此发送优先级,越低地址的节点越容易抢占到总线率先发送。
TIM截图20181123234741.png
   那么在发送接口上,我们需要判断的是,DMA发送上是否DMA发送完成标志是否成立,不成立的话返回错误,一次轮询后再继续发送。在这里我们是把要发送的数据存在一个缓冲区,待总线抢占到了才发送,所以在这里是需要改变发送状态变量。然后在任务中去轮询检测这个变量状态。
   TIM截图20181123235524.png
<font color="Red">物致DIY 期待您的到来~
QQ群:646461928
小店


回复

使用道具 举报

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-24 00:16:53 | 显示全部楼层
那么我们可以建立一个线程或者任务,2ms一次都可以,进行检测防冲突标志是否有效,进而判断空闲是否空闲决定发送。
TIM截图20181124000932.png
      TIM截图20181124001638.png

<font color="Red">物致DIY 期待您的到来~
QQ群:646461928
小店


回复

使用道具 举报

5460

TA的帖子

186

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-24 11:11:36 | 显示全部楼层
谢谢分享!赞一个!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

498

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-11-24 11:35:22 | 显示全部楼层
这种机制要整个网络的节点都遵守效果才会很好,不然冲突还是会发生的

点评

所有节点都遵守,也就是共用一套这样的机制。但是这个机制不能保证百分百不冲突。在我实际项目中,96个节点可以做到95%不冲突概率  详情 回复 发表于 2018-11-24 14:00
刻苦学习,共同进步


回复

使用道具 举报

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-24 11:50:42 | 显示全部楼层
lcofjp 发表于 2018-11-24 11:11
谢谢分享!赞一个!

谢谢队长支持
<font color="Red">物致DIY 期待您的到来~
QQ群:646461928
小店


回复

使用道具 举报

8068

TA的帖子

2

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2018-11-24 13:51:00 | 显示全部楼层
感谢分享经验


回复

使用道具 举报

809

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-11-24 14:00:08 来自手机 | 显示全部楼层
迈尔风随 发表于 2018-11-24 11:35
这种机制要整个网络的节点都遵守效果才会很好,不然冲突还是会发生的

所有节点都遵守,也就是共用一套这样的机制。但是这个机制不能保证百分百不冲突。在我实际项目中,96个节点可以做到95%不冲突概率


回复

使用道具 举报

3308

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-11-24 22:20:53 | 显示全部楼层
,好流弊
So what......


回复

使用道具 举报

2783

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2018-11-25 01:53:13 | 显示全部楼层

,好流弊
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

2783

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2018-11-25 01:53:24 | 显示全部楼层
,好流弊
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-19 14:03 , Processed in 0.409726 second(s), 17 queries , Gzip On, MemCache On.

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