OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4565|回复: 11

i2c既然有busy检查,为何还要总线仲裁?

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
发表于 2020-12-29 11:11:00 | 显示全部楼层 |阅读模式
1金钱
busy检查可以判断是否已经被其他通讯占用,如果busy,则等待直到其他通讯结束,然后启动本通讯。那么何必还要总线仲裁,根本没有仲裁的出现机会。而且仲裁是通讯任意时刻发起的,也就是说已经做了一半的通讯可能被刚启动的通讯抢先,这样的仲裁有很大的隐患啊。

请教专家。

最佳答案

查看完整内容[请看2#楼]

BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。 I2C总线规定所有通信都由主机发起,且I2C总线是支持同时挂载多个主机的(多个从机更不在话下,从机用器件地址区分,同一条I2C总线上的从机器件地址不得冲突) 因为从机只需要被动响应主机的请求,且从机都有唯一器件地址区分,因此从机侧不需要做BUSY检测和仲裁。 如果总线上只有一个主机,BUSY检测和仲裁也是不需要的,因为所有的通信都是由它发起的, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2020-12-29 11:11:01 | 显示全部楼层
BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。

I2C总线规定所有通信都由主机发起,且I2C总线是支持同时挂载多个主机的(多个从机更不在话下,从机用器件地址区分,同一条I2C总线上的从机器件地址不得冲突)

因为从机只需要被动响应主机的请求,且从机都有唯一器件地址区分,因此从机侧不需要做BUSY检测和仲裁。

如果总线上只有一个主机,BUSY检测和仲裁也是不需要的,因为所有的通信都是由它发起的,所以总线忙不忙它自己是十分清楚的(这里不讨论主机里面多个线程同时发起I2C操作),自然也没有别的主机跟它争控制权,也不需要仲裁。

如果总线上有多个主机,由于主机之间事先互相没有沟通,因此有可能某一个主机想要发起通信时,另一个主机已经在通信中了,因此需要检测总线忙状态,避免打乱正在进行的通信。
而极端情况下有这么一种情况:总线目前空闲,有两个主机同时(绝对意义的同时)想发起通信,它们也同时事先进行忙状态检测,结果都认为是空闲,都开始了新一轮通信,那这种情况肯定是会有问题的。
因此需要引入仲裁机制,仲裁的方式很简单:主机每发送一个bit,同时也读取总线状态,看看它跟我发送出去的bit是不是一致,如果不一致就仲裁失败,立即退出,而另一方发送的每一个bit都跟总线上输出的一致,因此通信得以正常进行。由于I2C总线是开漏输出的,因此谁先输出低电平谁就控制了总线,获得了控制权。

通常情况下,你很难见到同一条I2C总线上有多个主机的情况,而且实际产品上有时为了简化程序设计,甚至一条I2C总线上只挂一个从机(如果主机的I2C接口和管脚够用的话)。
因此,你说你写的程序用起来完全没有问题,那只是针对你自己的情况而已。程序运行出错了能说明程序一定有问题,但程序运行正常却说明不了任何问题,哪怕它已经正常运行了一百年。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
发表于 2020-12-29 13:04:43 | 显示全部楼层
IIC总线挂了5个设备,然后IIC需要把数据放到flash里面。
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-30 15:36:25 | 显示全部楼层
你使用的使st提供的IIC库函数吧,在原子这里推荐的是自写的IIC驱动(实测没问题,挂了3个设备)。你可以去SCDN问问。
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2020-12-30 16:39:53 | 显示全部楼层
本帖最后由 聚东风 于 2020-12-30 16:41 编辑

BUSY是检查自身IIC是不是在使用中的,而仲裁是针对多个IIC进行裁决决定哪个设备获得通讯权利的
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2020-12-31 10:32:04 | 显示全部楼层
聚东风 发表于 2020-12-30 16:39
BUSY是检查自身IIC是不是在使用中的,而仲裁是针对多个IIC进行裁决决定哪个设备获得通讯权利的

我的经验是:如果busy,说明i2c的两条线被拉低,正在被占用。并不是自身i2c
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2020-12-31 10:33:09 | 显示全部楼层
我的经验是:如果busy,说明i2c的两条线被拉低,正在被占用。并不是自身i2c
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2020-12-31 11:11:08 | 显示全部楼层
wycoal 发表于 2020-12-31 10:33
我的经验是:如果busy,说明i2c的两条线被拉低,正在被占用。并不是自身i2c

返回去看了下说明数,确实是总线检测到开始后,这个BUSY就置位,检测到停止位就清零.
This flag indicates that a communication is in progress on the bus. It is set by hardware when a START condition is detected. It is cleared by hardware when a Stop condition is detected, or when PE=0
仲裁应该说的是一对多时,在发送数据时检测到发送与回读不一致,从而发送1的自动退出.
An arbitration loss is detected when a high level is sent on the SDA line, but a low level is sampled on the SCL rising edge.
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2021-1-2 22:55:02 | 显示全部楼层
xkwy 发表于 2020-12-29 11:11
BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。

I2C总线规定所有通信都由主机发起, ...

我的观点:busy检查是主动最佳的回避干扰方式,使用它即可不需要仲裁。因为电路中如果是电压信号先后,应该不会发生两个主器件自然时间意义的同时启动

而仲裁的意义在于无法发动主动回避干扰的情况,比如一些外设主器件没有回避干扰功能。

回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2021-1-2 22:55:32 | 显示全部楼层
xkwy 发表于 2020-12-29 11:11
BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。

I2C总线规定所有通信都由主机发起, ...

我的观点:busy检查是主动最佳的回避干扰方式,使用它即可不需要仲裁。因为电路中如果是电压信号先后,应该不会发生两个主器件自然时间意义的同时启动

而仲裁的意义在于无法发动主动回避干扰的情况,比如一些外设主器件没有回避干扰功能。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2021-1-2 22:56:39 | 显示全部楼层
xkwy 发表于 2020-12-29 11:11
BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。

I2C总线规定所有通信都由主机发起, ...

我的观点:busy检查是主动最佳的回避干扰方式,使用它即可不需要仲裁。因为电路中如果是电压信号先后,应该不会发生两个主器件自然时间意义的同时启动

而仲裁的意义在于无法发动主动回避干扰的情况,比如一些外设主器件没有回避干扰功能。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-11-10
在线时间
4 小时
 楼主| 发表于 2021-1-2 22:59:09 | 显示全部楼层
xkwy 发表于 2020-12-29 11:11
BUSY跟仲裁只针对同一条I2C总线上有多个主机(host, master)的情况。

I2C总线规定所有通信都由主机发起, ...

我的观点:busy检查是主动最佳的回避干扰方式,使用它即可不需要仲裁。因为电路中如果是电压信号先后,应该不会发生两个主器件自然时间意义的同时启动

而仲裁的意义在于无法发动主动回避干扰的情况,比如一些外设主器件没有回避干扰功能。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 11:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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