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.

[参考译文] TM4C1290NCPDT:如何使用 FIFO 在主模式下发送 I2C 从地址?

Guru**** 2463330 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/656776/tm4c1290ncpdt-how-to-send-the-i2c-slave-address-in-master-mode-using-the-fifo

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:TM4C1294NCPDT

尊敬的社区:

我使用 TM4C1294NCPDT、以便(除其他外)使用 I2C 从磁力计传感器读取数据。

在繁忙等待中读出传感器效果很好、我还可以在示波器上看到 I2C 时钟和数据线、因此我确信 MCU、传感器和印刷电路板都可以正常工作。

当我使用 MCU 通过以太网发送数据时、我希望将 FIFO 和 UDMA 与 I2C 一起使用以更快。 对于启动器、我只使用 FIFO (不带 DMA)。

我的问题是、为什么以下代码在线路上为我提供两个字节的信号(即"写入从器件0x0E"后跟数据字节0x01)

//设置写入
I2CMasterSlaveAddrSet 的从器件地址(I2C2_base、0x0E、0);

//发送一个字节(将其放置在 I2C 数据寄存器中)
I2CMasterDataPut (I2C2_base、0x01);
I2CMasterControl (I2C2_base、I2C_MASTER_CMD_SINGLE_SEND); 

但使用以下代码

//设置写入
I2CMasterSlaveAddrSet 的从器件地址(I2C2_base、0x0E、0);

//使用 FIFO 发送0x37 = 55
I2CFIFODataPutNonBlocking (I2C2_base、55);
I2CMasterControl (I2C2_base、I2C_MASTER_CMD_FIFO_SINGLE_SEND); 

仅在行上为我提供0x37 (但不提供显示"发送到 slave0x0E"的字节)。

我已经查看了 I2CMSA、I2CMCS 和 I2CMDR 寄存器说明中的所有位。 事实证明、单次发送命令之间的唯一区别是 FIFO 的 BURST 位被置位、而不使用 FIFO 的 RUN 位被置位。 这符合数据表。 不过、这不应影响将从器件地址放在线路上、是否应该这样做? 我在数据表中找不到此信息。

如何确保即使使用 FIFO、从器件地址也被放置在线路上? 毕竟、我需要它来与特定的从器件通信。

谢谢!

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

    您是否有机会阅读我们的 I2C 应用手册? 网址是 :www.ti.com/.../spma073.pdf

    软件文件夹中包含一个使用 UDMA 和 FIFO 的 I2C 主设备示例。 我想这将是您想要开始的地方。

    查看提供的示例代码并将其与您的代码进行比较、对于 FIFO 操作、从器件地址的传输方式会有所不同、而是将寻址分解为高位和低位、并使用 I2C_MASTER_CMD_BURST_SEND_START 和 I2C_MASTER_CMD_BURST_SEND_CONT 选项进行地址传输。 然后使用与 FIFO 相关的命令。

    我所看到的确切示例是 spma073软件文件中的 ektm4c129_i2c_master_udma_udma_fifo、我认为这将是一个非常有用的参考。

    阅读应用手册时、通常情况下、即使使用 FIFO/UDMA、也可以使用非 FIFO 命令来查找地址。 尽管您是否确实需要像软件示例那样使用高位/低位、我不确定、但在任何情况下、您都应该尝试设置数据传输以复制示例并从此处执行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    非常感谢您提供 I2C 应用手册指针。 我已经在处理这个问题了、很抱歉我没有指出这个问题。

    是的、具有 uDMA 的 FIFA 就是一个很好的例子! 实际上、如果没有这个示例、我可能会完全迷路。 但是、该示例包含太多无法开始的内容。 由于缺少用于应用手册的板、不可能只尝试一下、但只需将其复制到我的示例中并调整一些东西-希望一切都能正常工作-也不能工作。 这就是我想要简单启动、而不使用 UDMA 的原因。 该应用手册实际上还包含一个仅适用于 FIFO 的示例。

    我认为上/下8位的值只是表示这是数据。 从机地址始终为7位加上读/写位。

    但您是对的:从地址问题始终使用非 FIFA 命令来处理。 因此、我认为我也必须这样做。 我只是对这种情况的原因感兴趣。

    感谢您的回答。 如果没有人能告诉我“为什么”,我会接受这个答案。

    最棒的
    菲律宾

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

    浏览 API 和数据表、我认为这是因为从器件地址不是 TivaWare 加载到 FIFO 中的内容。 相反、它有自己的专用寄存器(I2CMSA)、因此、当使用 I2CMasterSlaveAddrSet API 时、从地址寄存器被加载到该寄存器中、并且它必须作为正常 I2C 字节从 I2C 主机进行传输、而不是从 FIFO 传出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Ralph 再次查看它。
    是的、我同意。 这也是我在器件上观察到的结果。
    最棒的
    菲律宾