i.MX8MP平台开发分享(IOMUX篇)- 硬件原理

专栏目录:专栏目录传送门

平台内核
i.MX8MP5.15.71

1.前言

我们都知道,芯片包含数量有限的引脚,其中大部分有多种信号选择。这些信号到引脚和引脚到信号的选择是由输入输出多路复用器称为IOMUX。IOMUX也被用来配置其他引脚的特性,比如说电压水平和驱动强度等等。

2.IOMUX原理

以下面的MUX选项为例,Instance为芯片内部设备IP,Port为这个设备IP的引脚(在内部),Pad是芯片上我们能看到的引脚;Mode是指复用模式,最多支持8种复用模式。

image-20221227105756296

IOMUX有四类寄存器,它们分别是mux控制寄存器、pad控制寄存器,input选择寄存器和GPR通用控制寄存器。

对于模块的引脚输出功能,参考红色的路径。对于一个MUX单元来说,有6个模块的引脚连接到这个MUX单元,它们可能是模块1,2,3…6这6个模块中的某一根引脚。这个MUX单元连接到唯一的PAD,这个PAD就是我们在芯片外部能看到的引脚。现在我们想要让模块1的引脚输出信号,会遇到哪些问题?下面我们按照信号流动方向往前推,从红色路径可以看到,首先是会遇到MUX单元,这里有6个信号混合,需要设置这个MUX寄存器让其选中输出我们想要的信号。现在这个PAD已经链接到了模块1的引脚,然后我们也许还需要配置这个输出引脚的上下拉和电压值,这个时候就需要配置PAD控制寄存器。最后我们想要的信号就从芯片内部走出来了。

iomux.drawio

对于模块的引脚输入功能,参考蓝色的路径。现在模块1想从上面相同的外部引脚获取输入信号,那么这个信号又该如何从芯片外部流入内部的模块1呢?首先会经过PAD,然后又会经过MUX单元(这里的MUX单元和上面是反向的),这里我们也还需要设置MUX寄存器,经过MUX单元后,会来到INPUT SELECT输入选择单元。对于这个输入选择单元来说,链接有多个模块引脚。我们则需要配置这个输入选择寄存器,选择数据输入的MUX单元。

上面的引脚输入功能,我们称之为菊花链。对于模块X的引脚输入,由INPUT SELECT输入选择寄存器控制输入源,这个输入源来自多个IOMUX单元,比如cell1,cell2和cell3都能将外部信号输入到模块X的输入引脚。

image-20221227125627485

使用不同的PAD,对应不同的MUX控制寄存器。

PAD命名规则:IOMUXC_SW_PAD_CTL_PAD_,

MUX命名规则:IOMUXC_SW_MUX_CTL_PAD_

Input select寄存器命名规则比较复杂,一般是IOMUX___SELECT_INPUT ,例如RX引脚的输入选择寄存器就是IOMUXC_UART1_UART_RXD_MUX_SELECT_INPUT。

3. 寄存器实例:UART1_RX

下面以串口1的TX和RX引脚为例,对于TX引脚,可以选择三个PAD,UART1_RXD,SD1_CMD和SAI2_RXC;对于RX,可以选择UART1_TXD,SD1_CLK和SAI2_RXFS。

image-20221227131732714

3.1 PAD: UART1_RXD

PAD电气属性控制寄存器:IOMUXC_SW_PAD_CTL_PAD_UART1_RXD,MUX控制寄存器:IOMUXC_SW_MUX_CTL_PAD_UART1_RXD。

3.2 PAD: SD1_CMD

PAD电气属性控制寄存器:IOMUXC_SW_PAD_CTL_PAD_SD1_CMD,MUX控制寄存器:IOMUXC_SW_MUX_CTL_PAD_SD1_CMD。

3.3 PAD: SAI2_RXC

PAD电气属性控制寄存器:IOMUXC_SW_PAD_CTL_PAD_SAI2_RXC,MUX控制寄存器:IOMUXC_SW_MUX_CTL_PAD_SAI2_RXC。

3.4 Input select

RX引脚的输入选择寄存器:IOMUXC_UART1_UART_RXD_MUX_SELECT_INPUT。

3.5 功能实现

以PAD SD1_CMD为例分析RX功能的实现过程,电气属性寄存器就不分析了,对于MUX控制寄存器来说,MUX_MODE应该选择100,

image-20221227134615566

对于输入选择寄存器,DAISY应该选择001。

image-20221227134712195

4.SION

IOMUX有一个有限的选项可以覆盖默认的焊盘功能,并强制输入路径激活(ipp_ibe==1’b1),而不考虑相应模块驱动的值。这可以通过设置SION(软件输入开)位来实现。IOMUXC_SW_MUX_CTL寄存器中的SION(软件输入开启)位(如果有的话)设置为 “1”。

使用场景:

  1. LoopBack - 模块x驱动PAD,同时接收PAD的值作为输入。
  2. GPIO捕获 - 模块x驱动垫子,值由GPIO捕获。
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫游嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值