I.MX6U设置I2C复用和电气特性函数IOMUXC_SetPinMux和IOMUXC_SetPinConfig解析

1.

在【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 第627页中有提到bsp_ap3216c.c中IO初始化,配置 I2C IO属性函数如下:
unsigned char ap3216c_init(void)
{
IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x70B0);
IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0X70B0);
}

2.

要看懂这四句话,先到fsl_iomuxc.h文件中找到宏和函数的定义:

#define IOMUXC_UART4_TX_DATA_I2C1_SCL 0x020E00B4U, 0x2U, 0x020E05A4U, 0x1U, 0x020E0340U
#define IOMUXC_UART4_RX_DATA_I2C1_SDA 0x020E00B8U, 0x2U, 0x020E05A8U, 0x2U, 0x020E0344U

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t inputOnfield)
{
*((volatile uint32_t *)muxRegister) =
IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);

if (inputRegister)
{
    *((volatile uint32_t *)inputRegister) = IOMUXC_SELECT_INPUT_DAISY(inputDaisy);
}

}

static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t configValue)
{
if (configRegister)
{
*((volatile uint32_t *)configRegister) = configValue;
}
}

上面四句话展开为:
IOMUXC_SetPinMux(0x020E00B4U, 0x2U, 0x020E05A4U, 0x1U, 0x020E0340U,1)
IOMUXC_SetPinMux(0x020E00B8U, 0x2U, 0x020E05A8U, 0x2U, 0x020E0344U,1)
IOMUXC_SetPinConfig(0x020E00B4U, 0x2U, 0x020E05A4U, 0x1U, 0x020E0340U,0x70B0)
IOMUXC_SetPinConfig(0x020E00B8U, 0x2U, 0x020E05A8U, 0x2U, 0x020E0344U,0x70B0)

2.1

不难看出函数IOMUXC_SetPinMux(0x020E00B4U, 0x2U, 0x020E05A4U, 0x1U, 0x020E0340U,1)设置下面muxRegister寄存器,inputRegister寄存器
寄存器地址:0x020E00B4U
寄存器名称:SW_MUX_CTL_PAD_UART4_TX_DATA SW MUX Control Register
(IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA)

IOMUXC_SetPinMux函数中设置语句为:
*((volatile uint32_t *)muxRegister) =
IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);

上面两个宏的定义在MCIMX6Y2.h中

#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK)

#define IOMUXC_SW_MUX_CTL_PAD_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_SION_MASK)

最终设置 muxRegister value为0010 既手册中:
ALT2 — Select mux mode: ALT2 mux port: I2C1_SCL of instance: i2c1

在这里插入图片描述

2.2

寄存器地址:0x020E05A4U
寄存器名称:I2C1_SCL_SELECT_INPUT DAISY Register
(IOMUXC_I2C1_SCL_SELECT_INPUT)
IOMUXC_SetPinMux函数中设置语句为:
*((volatile uint32_t *)inputRegister) = IOMUXC_SELECT_INPUT_DAISY(inputDaisy);

上面IOMUXC_SELECT_INPUT_DAISY这个宏的定义也在MCIMX6Y2.h中
#define IOMUXC_SELECT_INPUT_DAISY(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SELECT_INPUT_DAISY_SHIFT)) & IOMUXC_SELECT_INPUT_DAISY_MASK)

最终会设置 inputRegister value 为01,既UART4_TX_DATA 设置为ALT2:

在这里插入图片描述
UART4_TX_DATA 设置为ALT2,既复用为I2C1:
在这里插入图片描述

2.3

函数IOMUXC_SetPinConfig(0x020E00B4U, 0x2U, 0x020E05A4U, 0x1U, 0x020E0340U,0x70B0)设置configRegister寄存器
寄存器地址:0x020E0340U
寄存器名称:SW_PAD_CTL_PAD_UART4_TX_DATA SW PAD Control Register
(IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA)

IOMUXC_SetPinConfig函数中设置语句为:
*((volatile uint32_t *)configRegister) = configValue;
set configRegister value with: 0x70B0
既设置了引脚的电气特性:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

另外两个函数同理推导。

上面是裸机操作,下面讲下linux中的设备树是如何设置I2C端口复用和电气特性的:
1 pinctrl_i2c1: i2c1grp {
2 fsl,pins = <
3 MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
4 MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
5 >;
6 };

在imx6ul-pinfunc.h函数中定义如下:
#define MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x00B4 0x0340 0x05A4 0x2 0x1

0x00B4是寄存器地址:0x020E00B4U
寄存器名称:SW_MUX_CTL_PAD_UART4_TX_DATA SW MUX Control Register
(IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA)

0x0340是寄存器地址:0x020E0340U
寄存器名称:SW_PAD_CTL_PAD_UART4_TX_DATA SW PAD Control Register
(IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA)

0x05A4是寄存器地址:0x020E05A4U
寄存器名称:I2C1_SCL_SELECT_INPUT DAISY Register
(IOMUXC_I2C1_SCL_SELECT_INPUT)

下面这个同理
#define MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x00B8 0x0344 0x05A8 0x2 0x2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值