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.

[参考译文] TMS320F28379D:如何在 I2C 上仅发送控制字节并检测 ACK (是否停止)?

Guru**** 2589280 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

我开发了 EEPROM 24LC01B 的驱动程序。 轮询检测到写入数据的结束。 出于此目的、只应发送无数据的控制字节。 测试结果取决于 ACK 是否存在。

有两种情况:
1) 1) 当未完成 EEPROM 的内部写入时-在本例中、我可以处理、我正确检测 NACK 并强制在 i2c 上生成 STOP、

2) 2)写入操作完成后-这就是问题所在:

   a.即使存在 ACK 和空数据缓冲区、i2c 也不会生成 STOP、

   b.没有 ARDY 信号、因此我无法检测到它并强制停止

由于软件要求、我不能使用中断、所以我定期检查 I2CSTR 寄存器。
在这个感兴趣的区域中、我已经读取了以下寄存器值序列:

 0:   i2c 传输开始、
~0:   0x410 (XSMT =发送移位寄存器为空、XRDY =发送数据就绪)
39us: 变速器结束
44us: ACK  

i2c 行上无进一步活动

68us:  0x1010 (BB =总线忙、XRDY)
101us:0x0410  (XSMT、XRDY)
164us:0x1010
202us:0x0410
(笑声)

I2C 配置

我使用 fifo 进行 i2c 传输:
i2cregs->I2CFFTX.bit.I2CFFEN = 1;
i2cregs->I2CFFTX.bit.TXFFRST=1;

传输开始:

i2cregs->I2CCNT = 0
此消息没有写入 FIFO
i2cregs->I2CMDR.all = I2CMDR_MST_MASK
  | I2CMDR_IRS_MASK
  | I2CMDR_TRX_MASK
  | I2CMDR_STT_MASK
  | I2CMDR_STP_MASK;

为什么停止条件和 ARDY 都不会生成?

此致、
Piotr Romaniuk

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

    您好、Piotr、

    我尝试将您的代码与我们在 C2000Ware 中提供的 I2C 示例之一进行比较、我注意到您将计数设置为0、但我无法判断您是否正在使用重复模式。 如果您使用 FIFO 进行无重复模式的 I2C 传输、我认为您的计数模式应设置为要传输的字节数。 您可以按照以下示例操作来验证配置是否正确、 该示例应提供使用 EEPROM 运行 I2C 轮询程序所需的所有设置:

    C2000Ware_4_XX_XX_XX\driverlib\f2837xd\examples\cpu1\i2c (示例称为 i2c_ex4_EEPROM_Polling)

    此示例使用 driverlib 函数、但这不应影响程序的性能。 如果您需要有关将某些函数转换为位字段的帮助、请告诉我。

    此致、

    Omer Amir

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

    您好!

    [报价 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4402598 #4402598"]我注意到您将计数设置为0,但我无法判断您是否正在使用重复模式[/quot]

    否、我不使用重复模式。  

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4402598 #4402598"]如果您使用 FIFO 进行无重复模式的 I2C 传输,我相信您的计数模式应设置为要传输的字节数

    您能否确认 TI 实施的 I2C 不允许使用零计数? 我需要确定。
    对于轮询、我不希望发送任何数据字节、仅发送状态字节。

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4402598 #4402598"]

    您可以按照以下示例操作来验证配置是否正确、 该示例应提供使用 EEPROM 运行 I2C 轮询程序所需的所有设置:

    C2000Ware_4_XX_XX_XX\driverlib\f2837xd\examples\cpu1\i2c (示例称为 i2c_ex4_EEPROM_Polling)

    [/报价]

    该示例非常简单、对我来说不有用、更不用详细地介绍我在 i2c 总线上使用任务和多个器件的情况。  我需要有关硬件行为的信息以正确实现其支持。  

    我需要知道:
    1) 1)如何检测 i2c 状态字已传输且已接收 ACK、
    2) 2)如何在 i2c 上生成停止

    此致、
    Piotr Romaniuk

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

    您好、Piotr、

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403605 #4403605"]您是否可以确认 TI 实施的 I2C 不允许使用零计数? 我需要确定。
    对于轮询、我不希望发送任何数据字节、仅发送状态字节。

    我不清楚您的意思、 状态字节与数据字节有何不同? 除非我弄错了、否则您使用 I2C 传输的字节是一个数据字节。 如果要传输某些字节、则需要将计数值设置为要发送的多个字节。

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403605 #4403605"]如何检测 i2c 状态字已传输且已收到 ACK

    正如您在初始帖子中所述、您可以使用 NACK 来执行此操作。  对于该状态位、需要牢记几个因素、即 每当发生以下情况之一时、NACK 位都会被清零(接收到确认):

    • 接收器已发送确认位(ACK)
    • NACK 被手动清除。 要清除该位、请向其写入1
    • CPU 读取中断源寄存器(I2CISRC)、该寄存器包含 NACK 中断的代码。 仿真器对 I2CISRC 的读取不影响该位
    • I2C 模块复位

    但是、在 I2C 模块执行常规调用传输的情况下、NACK 位不会被清除;NACK 保持为1、即使一个或多个从器件发送确认也是如此。 我不确定这是否适用于您的案例。

    [引用 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403605 #4403605"]如何停止 在 i2c[/quot]上生成

    器件手册中关于 I2CMDR 寄存器中的 STOP 位的说明如下:"在非重复模式中、必须至少传输一个字节才能产生 STOP 条件。" 我 将需要做一些研究来确定是否使用计数值来确定架构中的停止条件、 但如果只是测试设置计数值是否会清除该位、可能会更快; 阅读有关该寄存器的详细信息也可能很有帮助、因为它包含有关如何使用该寄存器的更多详细信息。

    如果您有更多问题、或者手册中的内容解释不好、请告诉我。

    此致、

    Omer Amir

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

    您好!

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403952 #4403952">我不清楚您的意思、 状态字节与数据字节有何不同? [/报价]

    我使用了错误的字节名称。 在 START 条件之后发送的第一个字节称为控制字节。
    它与数据字节不同:

    1. 包含 i2c 器件的地址、
    2. 包含 i2c 传输的方向(读取或写入)
    3. 不会被微控制器中的 FIFO 传递
    4. 它的值是根据包含[1]和[2]的寄存器构建的
    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403952 #4403952"]“在非重复模式下,必须至少传输一个字节才能生成停止条件。” [/报价]

    请确认此要求中的字节不包括控制字节。

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4403952 #4403952"]正如您在初始帖子中所述,您可以使用 NACK 来执行此操作[/引用]

    我真希望我能这样做。 当从器件发送 ACK 时、NACK 位实际上被清零、但我看不到 ARDY。  

    让我重新提出以下问题:

    如何在 I2C 上仅发送控制字节并检测是否存在 ACK? (请参阅我在开头引用的 EEPROM 文档)

    我需要一个可靠的解决方案、但我观察到奇怪的 I2C 模块行为。
    我编写的软件是工业高能器件的一部分、每月销售1K/月。 不接受任何问题。  

    此致、
    Piotr Romaniuk

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

    您好、Piotr、

    [报价 userid="64714" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4404760 #4404760"]请确认此要求中的字节不包括控制字节

    我已经与另一位专家确认了这一点、您确实需要确保 I2CCNT 设置为1以发送控制字节、并且在执行此操作时可以自行发送控制字节。 请告诉我、这是否仍然对您无效。

    此致、

    Omer Amir

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

    您好!

    [报价 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4405912 #4405912"]我已经与另一位专家确认了这一点,您确实需要确保 I2CCNT 设置为1以发送控制字节,并且可以在执行此操作时自行发送控制字节。

    当我将 I2CCNT=1写入 TX FIFO 时、该值在控制字节之后传输(EEPROM 发送 ACK 的情况)。  

    这不是解决方案。  

    此致、
    Piotr Romaniuk

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

    您好、Piotr、

    只需确认、您要将 I2CCNT 设置为1、设置目标地址、并使用控制字节填充 FIFO、然后设置 I2CMDR 中的 START 和 STOP 位(可以同时设置)、对吧? 如果您在非重复模式下执行此操作、它应该仅发送此消息、包括 R/W 位。

    此致、

    Omer Amir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1169899/tms320f28379d-how-to-send-only-control-byte-on-i2c-and-detect-ack-have-stop/4406284 #4406284"]要确认,您要将 I2CCNT 设置为1,设置目标地址,并使用控制字节填充 FIFO,然后在此设置 I2CMDR 中的 START 和 STOP 位(可以同时设置),请更正?

    不完全是。  我从不向 FIFO 写入控制字节-它由硬件从目标地址和方向位构建。

    此致、

    Piotr Romnaiuk

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

    Piotr、

    您的控制字节=目标地址+方向位吗?

    此致、

    曼诺伊

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

    是的。

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

    Piotr、

    如果您希望获得开始条件+发送目标(从器件)地址+ R/W 位(控制字节)+停止条件、则不能使用非重复模式。 您必须使用重复模式。 下面是伪代码:

    1) 1)将 I2C 配置为发送模式+重复模式

    2) 2)配置 I2C 目标(从器件)地址

    3) 3)生成启动条件

    4) 4)等待寄存器访问就绪位被置位

    5) 5)生成停止条件

    此致、

    曼诺伊

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

    您好、Manoj、

    我想避免重复模式、恐怕无法控制控制控制字节的传输频率。
    这是 i2c 模块硬件实现的限制。

    无论如何、感谢您的澄清。

    此致、
    Piotr Romaniuk