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.

[参考译文] MSP432E401Y:I2C-如何发送任意 I2C 有效载荷?

Guru**** 2548000 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1543134/msp432e401y-i2c---how-to-send-arbitrary-i2c-payloads

器件型号:MSP432E401Y


工具/软件:

您好!

我当前正在尝试使用 MSP432 与 I2C 器件进行通信、我想知道如何建议实现此例程、以按以下格式发送自定义 I2C“事务“:

  1. 信号开始
  2. 向总线写入 1-N 个任意字节
  3. 从总线读取 0-N 个任意字节
  4. 信号停止

为了实现此行为、我必须向 FSM 发送哪种命令?  

我遇到了以下问题:

  • 如果外设未确认初始字节、则 I2C 外设似乎被捕获。
  • 我不确定如何在不读取的情况下只向总线写入一个字节。

即 GCC 编译器、无 RTOS 和 DriverLib。

谢谢!

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

    您好、

     本应用报告演示了如何使用 MSP432E4 微控制器上具有 I2C 主 器件、与系统中的从器件进行通信。  

    https://www.ti.com/lit/pdf/slaa776

     MSP432E 适用于 I2C 模块的 SDK 中也有许多示例。 我将建议您先从 i2c_mastermode_simple_transfer 开始、然后是 ic2_mastermode_repeateststart_transfer。  

    如果外设未确认初始字节、则似乎会捕获 I2C 外设。

    如果从器件没有 ACK、则从器件很可能未正确寻址。 我假设您在 SCL 和 SDA 总线上都有适当的上拉电阻器、对吧? 你有什么奴隶? 如果您可以在 I2C 总线上显示逻辑分析仪捕获结果、我可以帮您查看一下。  

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

    尊敬的 Charles:

    我在 SCL 和 SDA 上有适当的上拉电阻。 我不能分享与哪个器件通信、但我可以说、它有一个初始化序列、需要将一个字节写入 I2C 总线和 NACK

    我知道这是一种非标准行为、但我想知道 I2C FSM 的工作原理、以及如何让它仅发送一个字节。

    • 当 I2C 外设接收到 NACK 时、传输是否停止? 我是否需要执行任何操作来“清除“该错误标志?
    • 您发送的文档表明我应该使用 I2C_MASTER_CMD_SINGLE_SEND/RECEIVE 或 I2C_MASTER_CMD_BURST_SEND/RECEIVE_START 来获取写入总线的地址和方向位。 之后我应该怎么做才能将 FSM “复位“到空闲状态?

    编辑:此外、突发模式是否可用于实现与单字节命令等效的行为?

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    、要求将单个字节写入 I2C 总线和 NACK。
    [quote userid=“607192" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1543134/msp432e401y-i2c---how-to-send-arbitrary-i2c-payloads/5939780
    • 当 I2C 外设接收到 NACK 时、传输是否停止? 我是否需要执行任何操作来“清除“该错误标志?
    [/报价]

    您好 Shranav、

     我在这里只能很清楚。 您是否希望收到从动器件的 NACK、这是真正的预期行为? 如果是这种情况、FSM 将收到错误。 如果主器件接收到 NACK、则它将停止并中止传输。  

    18.3.1.4 确认
    所有总线事务都有一个所需的确认时钟周期、该时钟周期由主器件生成。 期间
    在确认周期中、发送器(可以是主器件或从器件)会释放 SDA 线。
    为了确认事务、接收器必须在确认时钟期间下拉 SDA
    占空比。 在确认周期内、接收器发出的数据必须符合
    第 1280 页的“数据有效性“中描述了数据有效性要求。
    当从接收器没有确认从器件地址时、SDA 必须由从器件保持为高电平
    以便主器件可以生成停止条件并中止当前传输。 这一点很重要
    器件在传输期间充当接收器、负责确认每次传输
    所做的。 由于主器件控制传输中的字节数、因此它会向发出信号
    通过不在最后一个数据字节上生成确认来向从发送器结束数据。 。
    然后、从发送器必须释放 SDA 以允许主器件生成停止或重复结果
    启动条件。
    如果从器件需要提供手动 ACK 或 NACK、则为 I2C 从器件 ACK 控制
    (I2CSACKCTL) 寄存器允许从器件否定确认无效数据或命令、或确认有效
    数据或命令。 启用此操作后、MCU 从模块 I2C 时钟被拉至低电平
    在最后一个数据位之后、直到该寄存器写入指示的响应。

    [引述 userid=“607192" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1543134/msp432e401y-i2c---how-to-send-arbitrary-i2c-payloads/5939780
    • 您发送的文档表明我应该使用 I2C_MASTER_CMD_SINGLE_SEND/RECEIVE 或 I2C_MASTER_CMD_BURST_SEND/RECEIVE_START 来获取写入总线的地址和方向位。 之后我应该怎么做才能将 FSM “复位“到空闲状态?

    [/报价]

    如果在突发期间数据为 NACK 且设置停止位
    在 I2CMCS 寄存器中、传输终止。 如果停止位未置位、则为软件应用程序
    当 NACK 中断有效时、必须发出重复的停止或启动条件。 如果是 NACK、
    I2CMBCNT 寄存器可用于确定之前传输的数据量
    突发终止。 如果在传输过程中该地址为 NACK、则发出停止条件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否希望从设备收到 NACK、这是真正的预期行为?

    是的、这就是对器件的预期。 对不起,如果这使事情复杂化。

    因此、根据您发送给我的信息、我将执行以下操作:

    I2CMasterSlaveAddrSet (...、deviceAddr、false); 
    while (I2CMasterBusy (...)) {}
    I2CMasterDataPut (...、0x00);// 0x00 永远不会发送、因为我们期望 NACK
    I2CMasterControl (I2C_MASTER_CMD_SINGLE_SEND);// addr 已发送且无应答

    使 I2CMasterErr (...) 生效 == I2C_MASTER_ERR_ADDR_ACK;

    为了之后发送数据、我可以根据 DriverLib SDK 中的示例代码重试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要在之后发送数据、我可以根据 DriverLib SDK 中的示例代码重试

    是、请在主器件因 NACK 而中止后重试此操作、查看这样是否解决了问题。