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.

[参考译文] CC1310:传感器控制器单元上的 I2C 温度传感器帮助:读数延迟问题

Guru**** 2468460 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1461221/cc1310-help-with-i2c-temperature-sensor-on-sensor-controller-unit-delayed-readings-issue

器件型号:CC1310

工具与软件:

我目前正在使用传感器控制器单元(SCU)通过 I2C 读取温度传感器。 不过、我遇到了一个我一直难以解决的问题。

当我使用命令手动触发 SCU 执行时"scifSwTriggerExecutionCodeNbl(1 << SCIF_TEMP_TASK_ID);"、传感器控制器单元的输出返回0。 但是、当我使用逻辑分析仪检查 I2C 信号时、我可以看到0正在读取的值(请参阅随附的图)。

这是它的特殊之处:当我再次执行代码时、SCU 会将上次执行期间读取的值输出至主 MCU。 本质上、我始终从先前的执行中获取读取(n-1读取)。

我的代码

scifSwTriggerExecutionCodeNbl(1 << SCIF_TEMP_TASK_ID);
uint16_t readingFromSCU =
	scifTaskData.Temp.output.temperature;

Sensor Controller Studio 中的代码

i2cStart();
i2cTx((0x48 << 1) | I2C_OP_WRITE);
i2cTx(0x00);

if (state.i2cStatus == 0x0000) {
    U16 MSB;
    U16 LSB;
    i2cRepeatedStart();
    i2cTx((0x48 << 1) | I2C_OP_READ);
    i2cRxAck(MSB);
    i2cRxNack(LSB);
    output.temperature = ((MSB << 8) | LSB);
}
i2cStop();

根据我到目前为止的理解、SCU 似乎正在启动非阻塞 I2C 操作。 在第一次执行时、该值不可用(因此0)、而在后续执行时、我收到在先前执行期间读取的值。

我正在尝试确定是否有方法在同一执行周期中检索当前值。 这种行为是否是 SCU 如何处理 I2C 操作的固有行为?如果是、是否有实现我的目标的权变措施?

如果有任何帮助、将不胜感激

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

    您好!

    所以我能够使用传感器控制器单元的"fwGenAlertInterrupt ();"函数来解决这个问题。 当 i2c 读取完成时、SCU 会触发中断。


    在 MAN MCU 上、在执行 SCU 任务的"执行代码"后、不要立即读取输出变量、而是等待至接收 SCU 发出的唤醒调用、然后读取 SCU 的输出。

    总之、如果不主动等待 i2c 读取完成、则根据代码的实现方式、您将从传感器获得0或最后读取的值。 每个 I2C 读取操作都是如此、但通常您可以在阻塞方法和非阻塞方法之间进行选择。 但是、由于 SCU 仅支持非阻塞方法、因此我使用 SCU 有效地实施了阻塞机制。

    大家好

    RLB