当前位置: 首页 > article >正文

开漏输出(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信号上,这倒是比较节省成本。

http://www.lryc.cn/news/2416512.html

相关文章:

  • C++编程学习50个经典网站 强力推荐
  • 备战数学建模48-数学规划模型终结篇(全)(攻坚战13)
  • C# 使用cefsharp点播m3u8在线视频流
  • Shellshock
  • invalidateRect解析
  • 【域名购买到备案及公安备案,全流程解析】
  • (五十一)时间序列分析二:平稳时间序列分析(ARMA)
  • 6to4隧道和6in4隧道的区别
  • 高分一号影像处理流程
  • postgresql 设置执行命令超时时间
  • nginx + lua环境配置
  • 【Excel系列9】-- 28个基础图表
  • 在JavaEye晃了一个来月真的感慨。
  • 从零开始搭建 reviewboard 环境(四) -- reviewboard 的安装过程中的问题解决
  • IP欺骗
  • 使用NE555制作多谐振荡器
  • MFC的坐标转换GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient
  • Collections.synchronizedMap()与ConcurrentHashMap的区别
  • C++中critical section的使用
  • 高等数学学习笔记——第九十九讲——一阶线性微分方程组
  • 初学C语言以及C语言的常见概念
  • Sublime text 3最新注册码
  • Windows Installer Clean Up 软件正常卸载不了时,请它帮忙!
  • cocostudio使用基本要点汇总
  • AIS(自动识别系统)介绍
  • 【.NET】.NET 框架概述
  • fastDB个人使用心得
  • 进化算法——多目标优化
  • MNE溯源fieldtrip官网教程
  • JDK1.6安装详解、环境变量设置、测试安装及注意事项