开漏输出(open drain)与推挽输出(push pull)学习详解及某个踩到的坑分享

推挽输出和开漏输出是单片机的两种基本状态,实际的性质有所区别,下面是个人的分析,若有不对之处敬请指正。

(1)推挽输出:有确定的输出状态(非0即1)
推挽输出
(2)开漏输出(OD):不附加上拉电阻时没有高电平输出能力,线与逻辑实现方案
开漏输出
当多个OD共享一个上拉电阻Rp时,只要有任意一个输出为0,其他所有的输出也都会被拉到地,因此假定逻辑输入为A、B,一般为了控制逻辑和实际输出的电平逻辑一致,会在控制端附加反相器,因此会出现图片里逻辑功能函数L = ~B · ~A的情况。

(3)踩到的坑
算是SPI的不规范用法吧,F4一个SPI上挂了4个F103,通过片选对4个103的数据进行周期查询。
只开启一路103的SPI时,没问题,但是多路103的SPI开启后,啥数据都读不到了。

最后考虑可能是103的MISO每次被读取结束后,输出状态依然保持,导致把其他正常通信的SPI输出给干扰了。

最后不得以,通过片选信号外部中断输入来周期性关掉未被使用的103的SPI,这才正常通信。
一般SPI要带多个从机需要用菊花链,但是菊花链多个从机之间,MOSI串联会存在一个周期的延迟,在一主多从高速通信时会存在指令延迟丢包。

目前的解决方案是牺牲性能为代价的,目前还没有想到更好的办法,也欢迎各位给出意见。

/2021.07.20更新/
踩到的这个坑得到了解释,虽然来得比较晚,但是能有ADI的官方解释还是很有意义的。
ADI带使能的数据隔离器 多SPI从机示例
当连接多个从设备时,为了避免多根线与的MISO争用总线,通常需要对每个MISO的信号进行单独的开关控制,在这里,在隔离方案中,这里变成了带使能端的数据隔离器ADum1401,因此可以在改变CS信号时就同步变更活跃的MISO信号源,使得不至于争用总线;而我们实际用的比较多的TI的ISO7762系列,是不带使能功能的普通高速数据隔离器。

器件上的坑还是很多,现在回头看,通过测量仪器确定了问题的原因,也采用软件/硬件的方式临时性解决了这个问题,但始终没能为其给出特别让人信服的解释(或者说,不敢认为SPI挂接多个从设备的方式是对的),实际上真正有ADI/TI早就在器件外围上给出了对应的提醒。

解决方案:要么就用带使能端的数据隔离器,如果不用数据隔离器,那么就加一个CS控制的三态门在MISO信号上,这倒是比较节省成本。

  • 22
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值