如何将PIC16F15244系列用作I/O扩展器以提高设计灵活性

面对不断发展和多样化的应用程序需求,数据中心面临着提高运营效率并最大化其在硬件基础设施中的 it 投资的艰巨任务。仅去年一年,全球数据中心在服务器和存储基础设施上的支出就超过140亿美元,但仍然没有以最高效率运行。
需要新的架构来更好地利用和优化跨越计算、内存和存储的硬件资产。在将物理计算、内存和存储资源视为可组合构建块的情况下,实现资源敏捷性是提高效率和消除闲置和未充分利用资产的关键。
微控制器 (mcu) 最基本的元素之一是 i/o – 引脚数量、灌电流和拉电流强度以及可用的功能。在某些情况下,系统的i/o需求与微控制器的内存大小之间可能会出现不匹配。通常,可用的i / o越多,包含的内存就越多,这使得微控制器更加昂贵。
i/o 扩展器通过串行通信(通常为 i 2c 或 spi)为主微控制器提供额外的 i/o 组。i/o扩展器的常见用例包括简化pcb布线、改善功耗和物理缩小主微控制器。
参见图1。i/o 扩展器的使用示例
i/o扩展器asic是一种常见的商品,但是每个asic的功能和用例略有不同,这可能会在设计过程中引起头痛。然而,i/o扩展器是一种相对简单的数字设备,可以使用微控制器进行仿真,例如新的pic16f15244系列。与相关的基于 asic 的解决方案相比,这可以产生更大的设计灵活性、功能,甚至更低的物料清单 (bom) 成本。然而,由于更专业的硬件,基于asic的解决方案在空间和功率效率方面占上风。
为了演示此概念的灵活性,我们创建了 2 个单独的代码示例。第一个代码示例是一个非常简单的 i/o 扩展器。与该项目相关的固件可以轻松定制,以进一步简化通信。第二个代码示例是一个非常灵活的“高级”i/o 扩展器,它旨在允许通过 i2c 控制几乎所有 i/o 设置,而不是依赖于预设功能。
两个 i/o 扩展器示例具有共同的功能和大部分代码库。与许多i2 c器件一样,寻址线分配给一些未使用的i/o,以设置i2c地址的一些位,这提供了设计灵活性,无需额外编程。与asic不同,这些分配可以在软件中更改,重新路由或重新排序。此外,该器件还提供一条外部中断线 (int),以发出 i/o 电平变化的信号。对于公共线路,int 可以是漏极开路,也可以是推挽式(如果该线路是专用的)。
简单的 i/o 扩展器
在深入了解高级 i/o 扩展器之前,让我们看一下简单的扩展器。在此示例中,每个 i/o 线都有两种连续状态(假设代码未修改):弱上拉输入或输出 low。弱上拉允许i/o扩展器在用作输入时定义逻辑电平,并且它还关闭通常会将电流吸收到扩展器中的连接电路。该器件内部弱上拉的强度约为 10 或 100 μa。
低输出是一个更强大的驱动器,每个i/o能够吸收高达25ma的电流,整个器件的电流为300ma(-40c至+85c)。有关这些限制的更多信息,请参阅器件数据表的电气特性部分。从输出状态转换到输入状态时可能遇到的一个问题是i/o线路上寄生电容的充电时间。该电容会导致从0到1的转换延迟,这可能会触发变化时中断电路。为了将这些影响降至最低,可以将简单的i/o扩展器配置为暂时打开高端i/o驱动器,以便在切换到弱上拉之前快速对该电容进行充电。
参见图2。i/o 线的转换
高端 i/o 驱动程序的运行时间可在软件中配置,如果需要,可以禁用。下图显示了使用这种方法增强的上升时间 - 注意图像中时间尺度从20μs/div到40ns/div的变化。注意:我们不建议在任何配置下直接驱动电容器。
参见图 3。无高端 i/o – 1nf 负载
参见图 4。高端 i/o 开启 – 1nf 负载
简单的 i/o 扩展器 – 通信
i2c与这个例子的通信也非常简单。完整的i 2 c通信只需要2个字节的读写。在i2c写入中,数据的第一个字节是一个位图,它将每个i/o行(由单个位表示)设置为输入或输出。发送的所有其他数据字节都将被丢弃,开发人员可以省略。
参见图 5。简单的 i/o 扩展器,i2c 写入
在i2c读取中,从器件读取的字节是一个位图,表示每个i/o行的数字值,可通过port寄存器在内部访问。
参见图 6。简单 i/o 扩展器,i2c 读取
高级 i/o 扩展器
开发高级 i/o 扩展器的目标是提供比上面显示的简单变体功能更全面的程序。由于串行通信极其简单,简单的i/o扩展器具有许多局限性,并且无法利用pic16f15244系列中可用的以i/o为中心的功能,例如输入电平控制、漏极开路输出、变化时可屏蔽中断和弱上拉使能。
相比之下,这个更复杂的示例可以配置板载i/o的几乎所有功能。为了实现此功能集,程序使用查找表来确定要访问的寄存器或要执行的功能。图7显示了一个示例应用,其中微控制器充当键盘控制器,在按下按键时通知主微控制器。(此示例将在以后的帖子中展开。
参见图 7。高级 i/o 扩展器作为带锁定指示器的键盘控制器
高级 i/o 扩展器 – 程序结构
图8是器件中“寄存器”的查找表。表中的某些寄存器实际存在于每个pic16f15244系列器件上,例如tris和lat,而其他寄存器(如error)是“虚拟的”。虚拟寄存器特定于此程序,仅存在于ram中。
参见图 8。i/o 高级扩展器的寄存器映射
这种查找表结构的一个好处是可以灵活地重新排列寄存器,这可用于优化串行通信或减少软件故障干扰关键设置的机会。
查找表分为两个单独的函数,用于读取和写入。这将创建一个简单可靠的权限方案,但代价是代码大小。例如,要创建只读函数,只需从写入查找表中省略地址即可。
高级 i/o 扩展器 – 通信
与此示例的通信比简单的 i/o 扩展器更复杂。在执行读取或写入之前,控制器必须指示要开始读取或写入的地址。
i2c 写入使用第一个数据字节来设置要开始的地址。然后,下一个字节用于加载该地址的数据。然后,地址将递增以发送数据的下一个字节。只要地址仍然可写且有效,此过程就可以重复,如下所示。如果写入了无效或只读地址,则地址不会递增,并且设备不会确认 (nack) 以指示发生了错误。
参见图 9。高级 i/o 扩展器,i2c 写入流程图
参见图 10。高级 i/o 扩展器,i2c 写入
对于 i2c 读取,必须首先设置要读取的地址。通常,这是通过写入设备的单个数据字节完成的,尽管某些操作可能会为方便起见自动设置地址。i2c 总线停止,然后在读取模式下再次启动。
读取的第一个数据字节发生在地址集。读取此字节后,地址将递增,因此下一次读取发生在地址 + 1、地址 + 1 处,依此类推。如果遇到无效区域或只写区域,则程序将停止递增地址并返回2x0,直到停止读取。图00显示了两个寄存器的示例读取。
参见图 11。高级 i/o 扩展器,i2c 读取流程图
请参见图 12。高级 i/o 扩展器,i2c 读取
高级 i/o 扩展器 – 功能
该程序存储 8 个 i/o 相关设置,所有这些设置都更详细地记录在器件数据表中。唯一未保存的 i/o 设置是模拟选择 (ansel) 和端口。假设 i/o 扩展器始终是数字的,因此 ansel 是一个常量值。port 值是 i/o 组的逻辑电平,取决于电路条件。
当引用这些寄存器时,“x”(例如:trisx)是指可以分配的可选i/o组。默认情况下,此示例使用银行 c。
• 三态方向控制 [trisx] – 控制线路是输出 (0) 还是输入 (1)。
·锁存器 [latx] – 设置 i/o 驱动程序的输出值。
·更改时中断正边沿 [iocxp] – 启用所选引脚上的上升沿是否生成中断。
·更改时中断负边沿 [iocxn] – 启用所选引脚上的下降沿是否生成中断。
·弱上拉 [wpux] – 为每个选定的 i/o 启用弱上拉。
• 输入电平控制 [inlvlx] – 为每个引脚选择 ttl 或施密特触发器 cmos 输入阈值。
• 漏极开路控制 [odconx] – 为所选引脚启用漏极开路输出功能。
• 压摆率控制 [slrconx] – 启用压摆率限制,以提高所选引脚的 emi 性能。
高级 i/o 扩展器 – 内存操作
作为附加功能,此代码示例支持还原默认设置、保存、加载或保存并将其设置加载到内部非易失性存储器的功能。pic16f15244系列没有eeprom,但是通过启用存储区域闪存(saf),可以将一小部分程序闪存(pfm)标记为不可执行。
参见图 13。内存存储
图 13 显示了内部存储配置的方式。仅使用单个内存行(32 个 14 位字)来存储设置。此配置简化了内存管理,并将剩余的不可执行内存留给其他用途。
可配置的 i/o 设置与简单的(软件创建的)crc-8 校验和一起保存到 pfm 中,以验证配置的完整性。为了将crc打包到可用空间中,它被分成2位的块,并附加到每个配置的前4个设置。
参见图 14。内存操作字节
如果加载的配置未通过校验和验证,则不会将其加载到相应的寄存器中。对于内存负载,i/o引脚行为可以在内存操作字节中指定,如图14所示。如果负载失败,引脚将保持该状态,直到重新配置。
i/o 设置可以保存并加载到运行时四种配置中的任何一种。作为编译选项,开发人员或设计人员可以将设备设置为在启动时尝试加载配置 0,而不是默认值,这可以用作不需要完全重新编程操作的简单固件更新。如果配置 0 未通过 crc 验证,程序将使用默认 i/o 设置启动。
设备上的默认 i/o 设置定义为常量,开发人员可以根据应用程序的需要设置这些常量。程序不会修改这些默认值,并被视为已知的良好值。运行内存操作“加载默认值”将使用这些默认值加载寄存器。
作为故障保护,所有内存操作(不包括启动时的负载)都需要特定的字节序列来“解锁”操作。这减少了软件故障擦除或覆盖设置的可能性。
结论
如本文所示,在需要i/o配置灵活性或在单个系统中利用大量i/o扩展器的应用中,简单的8位微控制器可以合理地替代通用i/o扩展器asic。这两个示例所需的固件可通过以下链接在 github 上找到。github中还提供了使用arduino uno的高级i / o expander的演示库和代码。


钟产生芯片GM5351A 精准可靠的本土时钟产生芯片解决方案
2019“黑锋”创造了无人机竞速比赛的多项奇迹
实战用华硕AX86U解决家庭网络卡顿痛点
8K播放设备必须具备哪些条件
高速电路PCB“地”、返回路径、镜像层和磁通化
如何将PIC16F15244系列用作I/O扩展器以提高设计灵活性
经纬恒润以ODX格式为数据中心的整车诊断系统
Simulink是什么?
打造安全道路:C-V2X解决方案助您安心畅行!
线束测试仪要怎么调试才能检测线材
Rd-01雷达模组固件烧录与可视化工具配置
多声道超声波流量计在排水管网监测中的应用
高通与苹果的专利诉讼大战已正式落下帷幕
5月全球新能源汽车销量对比:中国车企销量同比增长128%,预计未来会持续走高
如何定义全栈工程师和DevOps
行业 | 全SiC模块正在加速,SiC功率器件走向繁荣
全球43000余家餐厅已经使用普渡的服务机器人
中国台湾面板厂商重心开始转向Mini/MicroLED
台达自动化技术在精密带刀片皮机上的解决方案
dfrobot模拟烟雾传感器 (MQ2)简介