引言

  多年以来,一直存在标准泛滥的现象,而我们电子业尤其严重。您是否曾经想过,为什么我们对有些奇怪的数字或测量计的东西建立标准?关于航天飞机的固体燃料火箭推进器的直径是否真的源自于马屁股的宽度的讨论非常激烈。2相当的稀奇和有趣。但是,接受事实会更有成效:总是会有很多标准,我们必须找到使其很好配合的途径。工程师和制造商均涉及到一个共同领域,其中标准的不兼容特别麻烦:原型平台。幸运的是,有些方法可以缓解这些不兼容性。下文中我们将进一步分析讨论。

  开发板扩展标准

  多年来,元件制造商一直提供开发系统,帮助其客户采用其元件设计应用。对于可编程器件,例如FPGA和微控制器,始终存在与其它元件的接口,以便能够与硬件同步或者早于硬件进行软件开发。随着时间推移,涌现出了关于这些“扩展接口”的非常松散的伪标准,其中有些标准的一致性相对较好。Xilinx等FPGA厂商推动这些标准,例如FMC,使客户尽可能简单地迁移到最新平台。Xilinx也采用第三方标准,例如Digilent制定的Pmod标准,用于该接口的外围设备选择较广。微控制器制造商的标准化略慢,许多采用自身的专用接口。然而,制造商动向和Arduino平台普及等市场力量正驱使其也向伪标准靠拢。

  Pmod非常适合FPGA

  Pmod接口是将外设与FPGA开发板进行组合和匹配的很好方式,可利用方便、可手工焊接的连接器连接八个引脚以及电源和地。FPGA的灵活性允许将其八个信号引脚用于几乎所有功能。尽管这提高了其对于FPGA的实用性,但也造成该接口难以配合那些外设功能分配给特定引脚的微控制器。为解决这一问题,Digilent定义了多种不同的Pmod引脚排列类型,不同的功能分配给特定的引脚(图1)。

  图1. Pmod引脚排列类型将不同的功能分配给特定引脚。

  类型定义使得微控制器板较容易使用Pmod接口标准,但仍然存在挑战。利用许多微控制器有限的引脚复用能力,难以实现真正的通用接口,已被废弃的Type 3 UART接口就是很好的例子。然而,即使存在局限性,对于原型或教育目的,Pmod接口是一种非常有用的扩展端口。

  Arduino伪标准

  Arduino伪标准是一个完全不同的老顽固,是出于各种原因为不同群体开发的不同平台。最初的Arduino开发板仅提供简单微控制器引脚,然后增加足够的支持器件,从而使编程变得简单,并且爱好者仍然可承受。由于其简单性,原始引脚排列按照微控制器的性能定义。

  随着平台发展到支持功能更多的处理器,该伪标准逐渐碎片化,具有各种引脚复用组合,可以说是例外多于规则。有些问题,例如支持不同的I/O电压以及I2C信号的不一致性,在第3版的UNO板中得到了解决。然而,在将扩展板与Arduino开发板(或任何Arduino衍生产品)配对使用时,必须仔细检查兼容性。并且可供选择的Arduino衍生产品很多(图2),即使仅限于Arduino网站提供的官方开发板,引脚兼容性也并不简单。但是,一般而言,每个具有特殊功能的Arduino引脚也可用作通用I/O (即GPIO)。

  图2 .Arduino开发板配置为多种衍生产品,以支持不同的设计和应用。

  与Pmod接口中一个引脚可用作多种特殊功能不同,大多数Arduino引脚通常执行单一的特殊功能。从根源上讲,Arduino伪规范比Pmod接口更适合于微控制器。所以,这就是Arduino规格的微控制器板比Pmod连接器的微控制器板更容易找到的原因。

  Pmod与Arduino接口之间的映射

  我们可以采用Pmod接口和Arduino伪标准,两者各有众多来源可供使用。是否能够使某个平台的外设与另一平台的控制器进行通信呢?当然,一切皆有可能,但有时候治疗比疾病本身更糟糕。

  如果将Arduino UNO第3版引脚排列与Pmod规范进行比较,您马上会发现Arduino板上有22个信号引脚,而Pmod连接器上只有8个引脚。从技术上讲,有可能将全部22个引脚串行化,使其通过Pmod提供的8个引脚,然后在另一侧对其进行解串,但我们将这一工作留给读者。将22个Arduino信号自适应映射到Pmod规范定义的不同类型(见图1),是可以做到的,但仍不轻松。以上图1所示为5种不同类型的Pmod接口。许多信号采用电平触发,可由软件通过GPIO引脚控制。然而,有些信号采用时间触发协议,利用微控制器内部的外设更容易控制。所以,困难在于将微控制器的所有专用引脚映射到Pmod规范定义的引脚。

  建议方案:使用串行控制交叉点开关

  解决映射问题的一种途径是在电路板上安装配置跳线阵列。这种方法尽管很简单明了,但既不美观也不人性化。适合Arduino板尺寸的说明文字字体会非常模糊难辨。许多引脚可能是双向的,所以简单的逻辑门不是信号连接的好选择。模拟开关能起作用,但没有足够的附加引脚来对其进行独立控制。利用I2C端口扩展器,可解决引脚短缺的问题。诚然,这种方法不比跳线更巧妙,但可通过软件配置。

  如果没有串行控制16:2多路复用器,MAX14661,这种方法似乎毫无希望。咋一看,支持所有不同类型的Pmod好像需要四片器件,那么这种方法很难说比端口扩展器方案好多少。实际情况真的会是这样,除非…MAX14661具有特殊功能。该器件允许同时激活任意开关组合,所以可用作8:8交叉点开关。

  至此为止,一切顺利。但是,不可否认,8:8交叉点配置有一个局限性:同时只能传输两路独立信号,每个COM引脚一路。但同时两路信号有什么好处?如上所述,大多数信号可由GPIO驱动,只有少数信号要求内部外设控制器。如果每个引脚分配一路GPIO,只有时间触发的串行线路需要通过复用器连接。UART和I2C为2线总线,所以不适合通过复用器的唯一串行总线是SPI.SPI只有一种接口定义,所以将SPI信号直接连接至连接器,作为这些接口的GPIO连接。当其中某个引脚需要用作时间触发功能时,只需将GPIO置于三态。

  信号电平怎么样呢?最初的Arduino设计及许多后来者使用5V信号电平,但现在5V信号没有以前那么常见。为解决这一问题,后来的Arduino版增加了IOREF引脚,以表示基于较低电压微控制器的衍生品。Pmod连接器没有IOREF引脚,但其绝大多数模块支持3.3V信号。幸运的是,MAX14611等双向电平转化器解决了这一问题。只需将Arduino信号连接至由IOREF供电的电平转换器的一侧。然后将另一侧连接至由Arduino板上专用3.3V电平供电的Pmod连接器。MAX14661多路复用器采用1.8V至5V的电源供电时可承受及传输-5V至+5V的任何信号,所以可安装在电平转换器的任何一侧。由于至多路复用器的Arduino连接多于Pmod连接,所以将MAX14611安装在电平转换器的Arduino很有意义。按照这种方式,Pmod连接器处只需要两片4通道器件(图3)。

  图3. 建议方案的逻辑图。

  方案评估

  该方案的关键是每个通道支持同时多个连接。COM引脚不连接,但在复用器内部用于选择连接。MAX14661的16个复用连接中的8个专用于Pmod连接器,也连接至4路支持SPI的信号和4路其它GPIO(图3)。其它8个复用连接绑定至2线串行总线和其它时间关键信号,例如PWM或定时器引脚。例如,为实施I2C类型,只需配置复用器,在通道A上使能SDA引脚和Pmod引脚4,在通道B上使能SCL和Pmod引脚3.通道A和B是任意选择的,可随意交换。实际上,甚至可以使能Pmod连接器上第二排的引脚3和4,以访问另外的6引脚I2C Pmod.如果I2C器件的地址不同,甚至可使两个端口保持工作状态,或者动态激活,以支持相同地址的两个器件。使用跳线方法,根本不可能在两个具有相同地址的器件之间进行动态切换。使用MAX14661,能够以编程方式配置所有指定的Pmod类型,甚至非标准类型,而只需单片尺寸仅为4mm X 4mm的有源器件。

  为什么有人设计非标准Pmod?原因之一是与微控制器相同的引脚复用问题。例如,MAX14661支持I2C和SPI控制,取决于配置引脚的状态。MAX14661的外设模块的引脚排列与SPI Pmod类型相匹配,但时钟和数据引脚与Digilent Pmod规范规定的I2C引脚不匹配。适配卡上的MAX14661可将SDA和SCL信号映射到任意Pmod引脚,可用于支持非标准MAX14661外设模块、I2C引脚映射。MAX14661也有两个地址引脚,以支持4个不同的I2C器件地址。因此,可将系统设计为支持同一总线上的多个器件。

  使用MAX14661复用I2C总线时,在带内发送命令。切换将与I2C总线同步生效。当然,在带外复用I2C总线具有挑战性,因为如果不小心,会在从机将SDA线拉低时断开;下次选择该总线分支时,分支可能锁死。MAX14661始终在I2C写命令结束时转换总线,此时开关另一侧的器件应为空闲。

  结论

  据考证,没有证据表明Pmod规范或Arduino伪标准源自于马屁股。然而,导致其产生的遗留问题和因素却深深根植于其DNA.尽管两种标准之间的分歧看起来不可调和,但MAX14661支持我们将Arduino-Pmod转换变为现实。

  作者:Greg Steiert

  Maxim Integrated,技术团队资深成员

Pmod使用的4种模式的更多相关文章

  1. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  2. javascript面向对象系列第二篇——创建对象的5种模式

    × 目录 [1]字面量 [2]工厂模式 [3]构造函数[4]原型模式[5]组合模式 前面的话 如何创建对象,或者说如何更优雅的创建对象,一直是一个津津乐道的话题.本文将从最简单的创建对象的方式入手,逐 ...

  3. javascript创建对象的几种模式

    在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...

  4. SQL Server 2012复制教程以及复制的几种模式

    简介 SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护 ...

  5. git push :推送本地更改到远程仓库的三种模式

    摘要:由于在git push过程中,no-fast-forward 的push会被拒绝,如何解决git push失败的问题?这里面有三种方法,分别会形成merge形式的提交历史,线性形式的提交历史,覆 ...

  6. App开发三种模式

    APP开发三种模式 现在App开发的模式包含以下三种: Native App 原生开发AppWeb App 网页AppHybrid App 混合原生和Web技术开发的App 详细介绍: http:// ...

  7. [转]VMware Workstation网络连接的三种模式

    经常要使用VMWare Workstation来在本地测试不同的操作系统,以前也搞不清楚网络连接三种模式,最近看了几篇文章才算明白.现总结如下: 1. VMware Workstation的虚拟网络组 ...

  8. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  9. (转)深度分析Linux下双网卡绑定七种模式

    现在一般的企业都会 使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多.而一般企业都会使用linux操作系统下自带的网卡绑定模式,当然现在 网卡产商也会出一些针对window ...

随机推荐

  1. C语言序列点问题总结(大多数高等教育C语言教学课程的漏洞)

    C语言序列点总结 2013年11月21于浙大华家池 C 语言副作用: (side effect)是指对数据对象或者文件的修改. 例如,语句 v = 99;的副作用是把 v 的值修改成 99. C语言序 ...

  2. MySQL5.7.18 备份、Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份,数据导入导出

    粗略介绍冷备,热备,温暖,及Mysqldump,mysqlpump,xtrabackup,innobackupex 全量,增量备份 --备份的目的 灾难恢复:意外情况下(如服务器宕机.磁盘损坏等)对损 ...

  3. 关于EasyRTSPClient、EasyPlayer RTSP流重连问题的解释

    EasyPlayer.EasyRTSPClient是如何设计重连的 首先大概解释一下EasyRTSPClient与EasyPlayer间的关系:EasyRTSPClient是一个专门用于与RTSP流媒 ...

  4. 使用@Scheduled注解编写spring定时任务

    import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframewor ...

  5. 响应式布局【3】 --- bootstrap

    本片文章主要讲解Bootstrap中如何实现响应式布局的. 参考资料&内容来源: https://code.ziqiangxuetang.com/bootstrap/bootstrap-gri ...

  6. JavaScript 四种显示数据方式

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '88888888' for key 'PRIMARY'

    严重: Servlet.service() for servlet jsp threw exceptioncom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityC ...

  8. swift中反向循环

    First of all, protocol extensions change how reverse is used: for i in (1...5).reverse() { print(i) ...

  9. 原生Base64编码/解码(OC与Swift)

    Objective-C NSString *plainString = @"foo"; Encoding NSData *plainData = [plainString data ...

  10. 理解SQL原理,写出高效的SQL语句

    我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还 ...