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.

[参考译文] LP-MSPM0L2228:I2C 停止条件启用/禁用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469025/lp-mspm0l2228-i2c-stop-condition-enable-disable

器件型号:LP-MSPM0L2228

工具与软件:

您好!

我尝试使用 I2C 总线与目标进行通信、但我需要澄清一些奇怪的内容。

如何使用 I2C 从目标器件读取字节:发送启动、发送器件地址(写入)、接收确认、发送寄存器地址、接收确认、发送重复启动、 发送器件地址(读取)、接收确认、接收字节、发送 NACK、发送停止。

从 driverlib 的角度来看、我要使用来设置此事务、DL_I2C_startControllerTransferAdvanced(I2C_ACCELEROMETER_INST,writeAddress,DL_I2C_CONTROLLER_DIRECTION_TX,0x01,DL_I2C_CONTROLLER_START_ENABLE,DL_I2C_CONTROLLER_STOP_DISABLE,DL_I2C_CONTROLLER_ACK_ENABLE),但没有得到回复。 通过分析总线、我发现仍然发送了停止条件:

我采用了 MSPM0 SDK 2.02.00.05中提供的 i2c 轮询示例。

目标器件是 NXP 的 FXLS8964AF ( 在此评估板上)。

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

    您将收到 NACK、以便 I2C 单元自动终止事务。 根据 FXLS8964AF 数据表(版本3.4)第12.1节、其 I2C 地址为0x18 (如果 SA0=1、则为0x19)。

    未经请求:在大多数情况下、这样一个分段交易可使用 RD_ON_TXEMPTY 特性来完成(减少麻烦)。 [参考 TRM (SLAU847D)第 21.2.4.1.3节]

    简要:

    1) 1)启用该功能:

    Fullscreen
    1
    2
    DL_I2C_resetControllerTransfer(I2C_INST); // Set MCTR=0 to avoid enableControllerReadOnTXEmpty hazard
    DL_I2C_enableControllerReadOnTXEmpty(I2C_INST); // Write then read
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    2) 2)将寄存器地址写入 Tx FIFO

    3) 3)使用  DL_I2C_startControllerTransfer ()执行 Rx 事务[不要将 Tx FIFO 内容计入长度]

    4) 4)禁用功能[我不确定这是需要的、但似乎是正确的]

    [与上述内容相同、但使用 DL_I2C_disableControllerReadOnTXEmpty ()]

    Fullscreen
    1
    2
    DL_I2C_resetControllerTransfer(I2C_INST); // Set MCTR=0 to avoid disableControllerReadOnTXEmpty hazard
    DL_I2C_disableControllerReadOnTXEmpty(I2C_INST); // Turn off Repeated Start feature
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    [编辑:插入(4)的代码、因为 E2E 在(?)之前不允许这样做]

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

    尊敬的 Daniele:
    Bruce 的解决方案应该能帮助您解决这个停止条件。 我还建议下载并安装最新版本的 SDK。
    此致、
    Diego Abad

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

    Bruce、您好!
    我误解了 API、因此我传递了已设置 R/W 标志的8位地址。

    建议的功能运行正常、我刚刚在 DL_I2C_startControllerTransfer 调用和后续 DL_I2C_receiveControllerData 调用之间添加了一个等待周期、否则我会错过读取的字节。

    非常感谢您的支持!!