基于RT1170 支持EEPROM访问(五)

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发

MCUXpresso SDK I2C API 接口链接
  在MCUXpresso SDK 框架下提供了对I2C设备进行操作的接口。针对I2C当作输出使用,一般只需要设置I2C总线通讯的速率(如100khz或者400khz)。确认I2C设备的地址及其位数即可对I2C设置进行操作。从下面的截图可以看出来I2C总线可选择的时钟源以及其所对应的最大值。有助于对系统级别时钟初始化代码的理解。本文将使用MCUXpresso Config Tools v9来生成相关的代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXJs2xkn-1614932015774)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-04/6040864f0bfaf.png)]





在这里插入图片描述

1. 首先阅读原理图

  设计I2C总线引脚,如下所示:
AT24C02_SCL----LPI2C6_SCL----GPIO1_LPSR_11
AT24C02_SDA----LPI2C6_SDA----GPIO1_LPSR_10



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bOluX9Ha-1614932015799)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-04/60406e6e9e626.png)]

2. SDK api 应用

2.1 I2C 引脚配置

需要将对应的引脚复用I2C 功能引脚



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-90qBasSM-1614932015803)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e8029d332.png)]

生成的代码如下所示:

/*
 * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
BOARD_InitLPI2C5Pins:
- options: {callFromInitBoot: 'true', coreID: cm7, enableClock: 'true'}
- pin_list:
  - {pin_num: R5, peripheral: LPI2C6, signal: SDA, pin_signal: GPIO_LPSR_10, pull_up_down_config: Pull_Down, pull_keeper_select: no_init, open_drain: Enable, drive_strength: Normal}
  - {pin_num: T5, peripheral: LPI2C6, signal: SCL, pin_signal: GPIO_LPSR_11, pull_keeper_select: no_init, open_drain: Enable, drive_strength: Normal}
 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********
 */

/* FUNCTION ************************************************************************************************************
 *
 * Function Name : BOARD_InitLPI2C5Pins, assigned for the Cortex-M7F core.
 * Description   : Configures pin routing and optionally pin electrical features.
 *
 * END ****************************************************************************************************************/
void BOARD_InitLPI2C5Pins(void) {
  CLOCK_EnableClock(kCLOCK_Iomuxc_Lpsr);      /* LPCG on: LPCG is ON. */

  IOMUXC_SetPinMux(
      IOMUXC_GPIO_LPSR_10_LPI2C6_SDA,         /* GPIO_LPSR_10 is configured as LPI2C6_SDA */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
  IOMUXC_SetPinMux(
      IOMUXC_GPIO_LPSR_11_LPI2C6_SCL,         /* GPIO_LPSR_11 is configured as LPI2C6_SCL */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
  IOMUXC_SetPinConfig(
      IOMUXC_GPIO_LPSR_10_LPI2C6_SDA,         /* GPIO_LPSR_10 PAD functional properties : */
      0x24U);                                 /* Slew Rate Field: Slow Slew Rate
                                                 Drive Strength Field: normal driver
                                                 Pull / Keep Select Field: Pull Enable
                                                 Pull Up / Down Config. Field: Weak pull down
                                                 Open Drain LPSR Field: Enabled
                                                 Domain write protection: Both cores are allowed
                                                 Domain write protection lock: Neither of DWP bits is locked */
  IOMUXC_SetPinConfig(
      IOMUXC_GPIO_LPSR_11_LPI2C6_SCL,         /* GPIO_LPSR_11 PAD functional properties : */
      0x20U);                                 /* Slew Rate Field: Slow Slew Rate
                                                 Drive Strength Field: normal driver
                                                 Pull / Keep Select Field: Pull Disable
                                                 Pull Up / Down Config. Field: Weak pull down
                                                 Open Drain LPSR Field: Enabled
                                                 Domain write protection: Both cores are allowed
                                                 Domain write protection lock: Neither of DWP bits is locked */
}

2.2 I2C 时钟配置

点击时钟模块可以看到LPI2C6时钟模块的根时钟为24Mhz,如下图所示:

从上图可以很清楚地知道LPI2C6模块的时钟路径。
相关的初始化代码在clocl_config.c文件当中可以找到。

    /* Configure LPI2C6 using OSC_RC_48M_DIV2 */
    rootCfg.mux = kCLOCK_LPI2C6_ClockRoot_MuxOscRc48MDiv2;
    rootCfg.div = 1;
    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c6, &rootCfg);

2.3 I2C 外设配置

点击外设配置选项

结果如下所示:


点击上图所示


结果如下所示:

按上图所示序号依次操作,结果如下所示:

按上图所示序号依次操作,结果如下所示:

按上图所示序号依次操作,结果如下所示:


这是一个驱动接口初始化配置界面,只要按需填写即可生成对应的驱动初始化代码,驱动的初始化跟外设接口紧密结合,有些功能芯片本身才有的,所在在初次使用时先按简单、简化的方式来配置,满足对外设的操作需求即可。


如上图所示我们先自定义了名称,这个名称会决定生成的代码中变量和函数相关。具体的效果到时,可以手动修改比较。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


设置I2C总线的工作在主模式下


关联对应的I2C总线的接口


选择模块的时钟源及设置其时钟频率


接下来看一下主模式下的配置选项:


传输方法选择最简单的轮询方式


点击更新源代码


即可生成对应的初始化代码。如下图所示:


4. 验证

SDK自带的I2C EEPROM访问工程代码是可用的。将通过工具生成的引脚初始化代码及驱动初始化代码替换原来对应的代码进行验证。最终验证是可行的。





4. 总结

通过图形工具的辅助之后,针对I2C从设备只需要调用LPI2C_MasterTransferBlocking就可进行主机读写操作。

举报
评论 0