查看: 145|回复: 0

[原创] 【MCX-N947分享】3、感受I3C

[复制链接]
  • TA的每日心情
    开心
    昨天 11:10
  • 签到天数: 539 天

    [LV.9]以坛为家II

    6

    主题

    2856

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4699
    最后登录
    2024-5-3
    发表于 2024-4-4 14:47:31 | 显示全部楼层 |阅读模式
    MCX N947-Brk板上自带有I3C的数字温度传感器,不需要额外去找相关器件


    一、I3C学习
    1、I2C与I3C
    I2C全称是 Inter Integrated Circuit
    I3C全称是 Improved Inter Integrated Circuit ,I3C 就是改进型的 I2C

    I3C 仍然采用 2 根通信线,一根数据线 SDL ,一根时钟线 SCL ,I3C 向下兼容 I2C ,也就是说 I3C 的总线下是可以挂载传统的 I2C 接口的(但是不兼容 10 bit 的 I2C 扩展地址)
    I3C总线协议,包括SDR(Single Data Rate)模式和HDR(High Data Rate)模式
    24b99eb74b1e00ce7a168a54d65f50c9.png


    2、电路结构
    I3C与I2C不同之处在于SCL和SDA线两根线分别使用了推挽与开漏:SCL(推挽输出时钟线),SDA(开漏输出数据线),而I2C则全部使用开漏输出,则全部需要外接上拉电阻,这就降低了时钟频率。
    SCL电路:
    a7d4dc9049ca4ddbb8f2f9bb1cc89728.png
    SDA电路:
    5c5210d872c04ae58a81d5209ff181a6.png

    问题来了,不是只有两个控制端吗,但板子上还有一个I3C_PUR,这又是什么端子?
    屏幕截图 2024-04-04 055810.png
    在MCXN947_ 用户手册中,第3418页有说明,大意为SDA已内部上拉电阻如果内部上拉不够,PUR可以用于主动控制SDA上的外部上拉电阻。
    屏幕截图 2024-04-04 140958.png

    二、建立工程
    打开MCUXpressoIDE,导入例子mcxn9xxbrk_i3c_master_read_sensor_p3t1755
    屏幕截图 2024-04-04 063304.png
    工程中已开启I3C,并带有p3t1755驱动
    编译后发现一个问题——我板子上没有焊针、也没有调试设备,但工程并没有在USB口输出数据。

    三、USB数据输出
    翻看大师们的教程,找到了:MCX先手尝鲜--2.USB串口,里面提到demo_apps\hello_world_virtual_com中的例程实现这功能。
    我尝试参考例程实现通过USB串口方式输出温度值
    1、在原有工程中增加模块
    在工程右键菜单中找到下图的菜单,打开进行配置
    屏幕截图 2024-04-04 110353.png
    我对比两个工程增加了以下模块
    屏幕截图 2024-04-04 114514.png 屏幕截图 2024-04-04 125755.png

    2、拷贝hello_world_virtual_com例程utilities目录中的的三个文件到本工程相应位置,替代原来文件
    这三个文件差异有点大
    屏幕截图 2024-04-04 142616.png

    3、修改i3c_master_read_sensor_p3t1755.c文件
    增加引用
    1. #include "fsl_common.h"
    2. #include "usb_device_config.h"
    3. #include "usb.h"
    4. #include "usb_device.h"
    5. #include "usb_phy.h"
    6. #include "fsl_component_serial_port_usb.h"
    复制代码
    建立USB时钟初始化程序
    1. void USB_DeviceClockInit(void);

    2. void USB_DeviceClockInit(void)
    3. {
    4. #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)
    5.     usb_phy_config_struct_t phyConfig = {
    6.         BOARD_USB_PHY_D_CAL,
    7.         BOARD_USB_PHY_TXCAL45DP,
    8.         BOARD_USB_PHY_TXCAL45DM,
    9.     };
    10. #endif
    11. #if defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)
    12.     SPC0->ACTIVE_VDELAY = 0x0500;
    13.     /* Change the power DCDC to 1.8v (By deafult, DCDC is 1.8V), CORELDO to 1.1v (By deafult, CORELDO is 1.0V) */
    14.     SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK;
    15.     SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) |
    16.                         SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u);
    17.     /* Wait until it is done */
    18.     while (SPC0->SC & SPC_SC_BUSY_MASK)
    19.         ;
    20.     if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK))
    21.     {
    22.         SCG0->TRIM_LOCK = 0x5a5a0001U;
    23.         SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK;
    24.         /* wait LDO ready */
    25.         while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK))
    26.             ;
    27.     }
    28.     SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK;
    29.     SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK);
    30.     /* xtal = 20 ~ 30MHz */
    31.     SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT);
    32.     SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK;
    33.     while (1)
    34.     {
    35.         if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)
    36.         {
    37.             break;
    38.         }
    39.     }
    40.     SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK;
    41.     CLOCK_EnableClock(kCLOCK_UsbHs);
    42.     CLOCK_EnableClock(kCLOCK_UsbHsPhy);
    43.     CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U);
    44.     CLOCK_EnableUsbhsClock();
    45.     USB_EhciPhyInit(kUSB_ControllerEhci0, BOARD_XTAL0_CLK_HZ, &phyConfig);
    46. #endif
    47. }

    复制代码

    4、修改usb_device_config.h
    屏幕截图 2024-04-04 113700.png

    并在文件最后“#endif /* _USB_DEVICE_CONFIG_H_ */”之前增加
    1. /*! @brief Whether the device charger detect feature is enabled or not. */
    2. #define USB_DEVICE_CHARGER_DETECT_ENABLE (0U)
    复制代码

    5、编译工程,写入N947

    四、效果
    USB接入电脑后增加一个USB串口设备
    屏幕截图 2024-04-04 144704.png

    温度测试:

    屏幕截图 2024-04-04 134801.png





    开心
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-4 03:30 , Processed in 0.110498 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表