zoukankan      html  css  js  c++  java
  • 基于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,如下图所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yg9d4RGd-1614932015805)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e11f75484.png)]

    从上图可以很清楚地知道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 外设配置

    点击外设配置选项[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HKpWw0O8-1614932015807)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/604186d918c3f.png)]

    结果如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS71Pm3M-1614932015809)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/604187c7c28a5.png)]

    点击上图所示
    结果如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-reKBI7Ot-1614932015812)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e3c7297f9.png)]

    按上图所示序号依次操作,结果如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibbRIvfX-1614932015814)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/60418aa5a102c.png)]

    按上图所示序号依次操作,结果如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vE4ztYO2-1614932015816)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/60418b3f99bf9.png)]

    按上图所示序号依次操作,结果如下所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOiwGXag-1614932015818)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/60418b7e88502.png)]

    这是一个驱动接口初始化配置界面,只要按需填写即可生成对应的驱动初始化代码,驱动的初始化跟外设接口紧密结合,有些功能芯片本身才有的,所在在初次使用时先按简单、简化的方式来配置,满足对外设的操作需求即可。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSqdHwfy-1614932015820)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e479c6167.png)]

    如上图所示我们先自定义了名称,这个名称会决定生成的代码中变量和函数相关。具体的效果到时,可以手动修改比较。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZZniuGPo-1614932015822)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e4a127e34.png)]

    设置I2C总线的工作在主模式下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpnzUWT4-1614932015824)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/60419638416c7.png)]

    关联对应的I2C总线的接口
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnryasuA-1614932015827)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e4c02b7f7.png)]

    选择模块的时钟源及设置其时钟频率
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lIz8Bsn-1614932015829)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/604196fe35729.png)]

    接下来看一下主模式下的配置选项:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PbrQUmyp-1614932015831)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041a3f15673a.png)]

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

    点击更新源代码

    即可生成对应的初始化代码。如下图所示:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uoXBuQ1d-1614932015840)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e53bc7ed1.png)]

    4. 验证

    SDK自带的I2C EEPROM访问工程代码是可用的。将通过工具生成的引脚初始化代码及驱动初始化代码替换原来对应的代码进行验证。最终验证是可行的。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lEV42JCr-1614932015842)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e6433aa5e.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XB8JrKzF-1614932015844)(http://139.224.41.215:4999/server/../Public/Uploads/2021-03-05/6041e6848ec80.png)]

    4. 总结

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

  • 相关阅读:
    字符串
    zval结构体
    需要优化代码的leetcode
    删除字符串中的字符
    python 目录
    文件
    awk 复习
    链表和数组的说法
    在linux服务器新添加硬盘,如何识别、挂载。
    Linux 的 date 日期的使用
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169540.html
Copyright © 2011-2022 走看看