0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 来源:microchip 作者:microchip 2023-05-05 10:31 次阅读

面对不断发展和多样化的应用程序需求,数据中心面临着提高运营效率并最大化其在硬件基础设施中的 IT 投资的艰巨任务。仅去年一年,全球数据中心在服务器和存储基础设施上的支出就超过140亿美元,但仍然没有以最高效率运行。

需要新的架构来更好地利用和优化跨越计算、内存和存储的硬件资产。在将物理计算、内存和存储资源视为可组合构建块的情况下,实现资源敏捷性是提高效率和消除闲置和未充分利用资产的关键。

微控制器MCU) 最基本的元素之一是 I/O – 引脚数量、灌电流和拉电流强度以及可用的功能。在某些情况下,系统的I/O需求与微控制器的内存大小之间可能会出现不匹配。通常,可用的I / O越多,包含的内存就越多,这使得微控制器更加昂贵。

I/O 扩展器通过串行通信(通常为 I 2C 或 SPI)为主微控制器提供额外的 I/O 组。I/O扩展器的常见用例包括简化PCB布线、改善功耗和物理缩小主微控制器。

poYBAGRUakmAMyPYAACkSoONLpA941.png

参见图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驱动器,以便在切换到弱上拉之前快速对该电容进行充电。

pYYBAGRUalGAVZHiAAEUJzpWLDA580.png

参见图2。I/O 线的转换

高端 I/O 驱动程序的运行时间可在软件中配置,如果需要,可以禁用。下图显示了使用这种方法增强的上升时间 - 注意图像中时间尺度从20μs/div到40ns/div的变化。注意:我们不建议在任何配置下直接驱动电容器。

pYYBAGRUalaATDocAAEC3MteAgA112.png

参见图 3。无高端 I/O – 1nF 负载

poYBAGRUalyAKIBPAADpiiOMkG4753.png

参见图 4。高端 I/O 开启 – 1nF 负载

简单的 I/O 扩展器 – 通信

I2C与这个例子的通信也非常简单。完整的I 2 C通信只需要2个字节的读写。在I2C写入中,数据的第一个字节是一个位图,它将每个I/O行(由单个位表示)设置为输入或输出。发送的所有其他数据字节都将被丢弃,开发人员可以省略。

pYYBAGRUakCAYHvaAADdHHDnJkw877.png

参见图 5。简单的 I/O 扩展器,I2C 写入

在I2C读取中,从器件读取的字节是一个位图,表示每个I/O行的数字值,可通过PORT寄存器在内部访问。

pYYBAGRUajaAFeIkAAE5gTkWTBI354.png

参见图 6。简单 I/O 扩展器,I2C 读取

高级 I/O 扩展器

开发高级 I/O 扩展器的目标是提供比上面显示的简单变体功能更全面的程序。由于串行通信极其简单,简单的I/O扩展器具有许多局限性,并且无法利用PIC16F15244系列中可用的以I/O为中心的功能,例如输入电平控制、漏极开路输出、变化时可屏蔽中断和弱上拉使能。

相比之下,这个更复杂的示例可以配置板载I/O的几乎所有功能。为了实现此功能集,程序使用查找表来确定要访问的寄存器或要执行的功能。图7显示了一个示例应用,其中微控制器充当键盘控制器,在按下按键时通知主微控制器。(此示例将在以后的帖子中展开。

pYYBAGRUajKAaeYwAAEC2_cjFrU648.png

参见图 7。高级 I/O 扩展器作为带锁定指示器的键盘控制器

高级 I/O 扩展器 – 程序结构

图8是器件中“寄存器”的查找表。表中的某些寄存器实际存在于每个PIC16F15244系列器件上,例如TRIS和LAT,而其他寄存器(如ERROR)是“虚拟的”。虚拟寄存器特定于此程序,仅存在于RAM中。

poYBAGRUai2AQ-0fAAC7hNMX7MU949.png

参见图 8。I/O 高级扩展器的寄存器映射

这种查找表结构的一个好处是可以灵活地重新排列寄存器,这可用于优化串行通信或减少软件故障干扰关键设置的机会。

查找表分为两个单独的函数,用于读取和写入。这将创建一个简单可靠的权限方案,但代价是代码大小。例如,要创建只读函数,只需从写入查找表中省略地址即可。

高级 I/O 扩展器 – 通信

与此示例的通信比简单的 I/O 扩展器更复杂。在执行读取或写入之前,控制器必须指示要开始读取或写入的地址。

I2C 写入使用第一个数据字节来设置要开始的地址。然后,下一个字节用于加载该地址的数据。然后,地址将递增以发送数据的下一个字节。只要地址仍然可写且有效,此过程就可以重复,如下所示。如果写入了无效或只读地址,则地址不会递增,并且设备不会确认 (NACK) 以指示发生了错误。

pYYBAGRUaiiAS6nUAACGE0suM5M585.png

参见图 9。高级 I/O 扩展器,I2C 写入流程图

poYBAGRUaiCALSsDAADfusIPsRs775.png

参见图 10。高级 I/O 扩展器,I2C 写入

对于 I2C 读取,必须首先设置要读取的地址。通常,这是通过写入设备的单个数据字节完成的,尽管某些操作可能会为方便起见自动设置地址。I2C 总线停止,然后在读取模式下再次启动。

读取的第一个数据字节发生在地址集。读取此字节后,地址将递增,因此下一次读取发生在地址 + 1、地址 + 1 处,依此类推。如果遇到无效区域或只写区域,则程序将停止递增地址并返回2x0,直到停止读取。图00显示了两个寄存器的示例读取。

pYYBAGRUahSADXP2AADNTkYJe34491.png

参见图 11。高级 I/O 扩展器,I2C 读取流程图

poYBAGRUahCAV1kxAAEEHftm8GU020.png

请参见图 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)标记为不可执行。

pYYBAGRUagqAML5WAAF5rQYJ_7o970.png

参见图 13。内存存储

图 13 显示了内部存储配置的方式。仅使用单个内存行(32 个 14 位字)来存储设置。此配置简化了内存管理,并将剩余的不可执行内存留给其他用途。

可配置的 I/O 设置与简单的(软件创建的)CRC-8 校验和一起保存到 PFM 中,以验证配置的完整性。为了将CRC打包到可用空间中,它被分成2位的块,并附加到每个配置的前4个设置。

pYYBAGQzf6iAVVeHAACHdNFsvWA136.png

参见图 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的演示库和代码。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147659
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16022

    浏览量

    343680
  • 扩展器
    +关注

    关注

    0

    文章

    88

    浏览量

    15059
收藏 人收藏

    评论

    相关推荐

    Vishay推出最新系列高压厚膜片式电阻 进一步提高设计灵活性

    Vishay 宣布,推出最新系列高压厚膜片式电阻---CRHP系列,额定功率1.5 W,工作电压高达3000 V,从1206到2512包括五种小外形尺寸。为提高设计灵活性,Vishay
    的头像 发表于 03-07 15:55 4670次阅读

    实现汽车测功应用的灵活性

    实现汽车测功应用的灵活性本文向您介绍运用National Instruments产品建立灵活的汽车测功测试平台。目录:? 简介? 汽车
    发表于 10-06 15:07

    Altera设计坊第一期如何通过FPGA提高工业应用灵活性

    现企业最不想看到的现象:时间成本、劳动力成本、系统总成本的流失。可是,如果你为您的来工业系统设计及应用选择FPGA解决方案,你就可以根据需要修改你的设计、降低设计的复杂度、大大提高工业应用的灵活性
    发表于 10-11 10:43

    通过FPGA提高工业应用灵活性的5种方法

    可编程逻辑器件(PLD)是嵌入式工业设计的关键元器件。在工业设计中,PLD已经从提供简单的胶合逻辑发展到使用FPGA作为协处理。该技术在通信、电机控制、I/O模块以及图像处理等应用中支持 I
    发表于 11-05 14:03

    通过应用外部设备解决MCU I/O扩展问题

    设计的灵活性,因此开发人员可以选择PCA8574的从地址,并在一个设计中使用多个地址。图2:NXP的PCA8574是一个准双向的8位I / O I2C
    发表于 02-23 16:00

    使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点

    PWM生成,因此关闭32 kHz时钟节省功耗。每个单独的GPIO可以PWM占空比强度配置为1至16,其中16是100%占空比,插槽设置
    发表于 06-16 14:10

    如何去提高电源管理的灵活性

    有什么方法可以提高电源管理的灵活性吗?
    发表于 04-23 06:24

    开放式FPGA能否增加测试的灵活性

    在测试应用中使用FPGA的关键特性有哪些?开放式FPGA能否增加测试的灵活性
    发表于 05-11 06:40

    嵌入式Linux的灵活性

    嵌入式Linux的灵活性,为嵌入式计算而设计的高效、节能的处理的可用性,以及新处理的低成本,使许多工业公司在嵌入式处理的基础上开发新的产品成为可能。现在的工程师虽然可以用强大的工
    发表于 11-04 08:51

    PIC16F15244的8位单片机功能简析

    XC8、XC16和XC32对应8位、16位和32位PIC单片机,按实际使用的单片机选择下载最新版本即可。这次活动发的开发板是PIC16F15244的8位单片机,所以下载XC8编译
    发表于 11-24 07:04

    基于PIC16F15244单片机怎样去新建工程

    IDE软件和编译都下载之后就可以开始新建工程了。输入你的单片机型号,所以这里要输入PIC16F15244选择编译,这里有点儿疑惑,我明明XC8、XC16、XC32都安装了,为什么这
    发表于 11-24 06:04

    ATtiny GPIO扩展器的资料下载

    描述ATtiny GPIO 扩展器(0 系列 1 系列 MCP23017)这款 ATTiny GPIO 控制器具有板载 16 位 MCP23017
    发表于 07-12 06:44

    如何将TCA9535与LPC55S16微控制连接?

    我正在使用带有 LPC55S16 微控制的 TCA9535(I/O 扩展器)接口。我们使用 I
    发表于 05-22 08:19

    弹性块存储的灵活性怎么样

    弹性块存储(Elastic Block Storage)是近年来利用云存储的灵活性和简单性如何得到改善的一个例子。
    发表于 03-21 17:33 920次阅读

    带有PIC16F15244的DIY I/O扩展器(第1部分,共3部分)

    电子发烧友网站提供《带有PIC16F15244的DIY I/O扩展器(第1部分,共3部分).zip》资料免费下载
    发表于 11-18 11:46 1次下载
    带有<b class='flag-5'>PIC16F15244</b>的DIY I/O<b class='flag-5'>扩展器</b>(第1部分,共3部分)