This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3507:MSPM0G3507

Guru**** 2390755 points
Other Parts Discussed in Thread: MSPM0G3507

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1447574/mspm0g3507-mspm0g3507

器件型号:MSPM0G3507

工具与软件:

您好、TI 团队。

我正在使用 MSPM0g3507控制器、用于连接 i2c 传感器、这些传感器是 SHT35和 HS300、在从该传感器获取数据之前、我想探测并检查传感器是否存在、

我已将传感器地址分别设置为0x45和0x44。

我需要写入地址并从传感器读取 ACK。 那么、我应该使用哪个驱动程序函数来捕获并返回 ACK  

那么、可以使用该 ACK 来探测传感器存在吗?

此致  

Prajesh karmalkar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Prajesh、您可以使用逻辑分析仪作为一个选项、以确保返回正确的 ACK。 如果您希望 在代码中实现这一点、可以使用 技术参考手册中 概述 ACK/NACK 的第18.2.3.4节。 看起来 I2C 数据格式包括 ACK/NACK、因此您也应该能够从该特定位位置提取此数据。

    -Brian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    探测的意思是,我想使用固件探测传感器,在 TI 库或驱动程序中是否有任何函数返回 ACK。所以我可以使用 ACK 来确认存在哪个传感器,以便我可以从该传感器接收 ACK。

    实际上、我想要传感器 ack、这样我就知道我有正确的传感器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    • true:I2C 事务成功完成。 这意味着位于指定地址(本例中为 SHT35)的器件已确认通信。
    • false: I2C 事务失败。 这可能表明器件未确认该地址或 I2C 总线上出现问题。

    添加了示例  

    if (I2C_transfer(i2c, &i2cTransaction))
    {
        // If true, the sensor acknowledged its address.
        printf("SHT35 is active and responded to the address.\n"); }
    else
    {
        // If false, the sensor did not acknowledge.
        printf("SHT35 did not respond to the address. Check wiring and power.\n");
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    例如上述 i2c_transfer 函数、该函数会返回。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有看到 DriverLib 函数可以执行您需要的探测、因此我想您必须自己编写。

    您需要的是"快速指令"。  [参考 TRM (SLAU846A)第 18.2.4.1节、接近结尾。] 这只是一个具有 START+STOP 的事务、长度为0。 也可以是读取或写入;通常这种类型的探针是通过读取完成的、但(请参阅下文)您可能需要使用写入。

    我不使用 DriverLib、但我认为您可以  用类似的东西做这样的探针(未经测试):

    DL_I2C_startControllerTransferAdvanced(I2C_n_INST, Target_I2C_Addr,
                 DL_I2C_CONTROLLER_DIRECTION_TX,
                 0u,   // Length=0
                 DL_I2C_CONTROLLER_START_ENABLE, 
                 DL_I2C_CONTROLLER_STOP_ENABLE , 
                 DL_I2C_CONTROLLER_ACK_DISABLE);
    uint32_t msr;
    do {
        msr = DL_I2C_getControllerStatus(I2C_n_INST);
    } while ((msr & I2C_MSR_IDLE_SET) == 0);
    uint32_t OK = 1;
    if (msr & I2C_MSR_ERR_SET)
        OK = 0;
    return(OK);

    我认为您需要使用写入、因为:

    1) 1)如果 SHT35获得读取请求且数据未就绪、则 SHT35将不确认[参考 SHT35数据表(版本7)第4.6节]、因此结果不明确。

    2) 2)勘误表 I2C_ERR_02对作为读取的快速命令提出了严格限制。

    您可能需要检查 HS300以查看是否对发送(空)写入有任何保留。

    请告诉我们事实是怎样的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨,我也检查过这个实现,但我唯一简单的要求是我只想检查我的目标传感器是否发送 ack 到地址。 我对 SDK 中针对目标器件使用的命名有点困惑(我认为 SDK 中的目标在配置为用作 target/i2c 从器件时用于 MSPM0)。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     DL_I2C_startControllerTransferAdvanced 或 DL_I2C_startControllerTransfer 如何处理从从器件接收的 ACK (在我的案例中为传感器)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些函数只会启动事务;您必须等待它完成。 对于0长度的事务、无论在哪种情况(ACK 或 NACK)下、它都将在地址(SLA)字节之后完成。

    除了 ERR 位、MSR 还具有 ADRACK 位、如果在 SLA 字节上看到 NACK、则为=1。 [我的驱动程序使用 RIS。 而是 MNACK、但我没有找到一种从 DriverLib 中获取它的简单方法。]