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.

[参考译文] TMS320F2809:I2C 模块 ARDY 或停止中断?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption

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

您好!

 

我们已对 MCU I2C 模块进行设置、该模块配置为 主模式、380kbps、Rm=0、并连接到一些传感器。

 

我们仍在努力 了解 ARDY 和停止中断。 我们 计划使用它们 、以了解 通信何时 完成。 这是正确的方法吗? 这两种中断意味着相同的事情? 我想我缺少一些东西。

 

我们知道 、当我们设置 I2CMDR 位 STP= 1时、I2CSTR 的 ARDY 位不受影响(如下所示)。 我想 不 会产生 ARDY 中断、对吧?  请、当 我们需要知道通信何时 完成时、有人能就哪种中断更好地使用 SCD 或 ARDY 提供一些建议吗? 我们有一个闭环控制、它将等待信号(来自 I2C)可用于更新输出。 我们使用 FIFO 中断来处理数据、因为我们的代码对时间非常敏感、使用延迟轮询数据不是一个选项。

 

I2CMDR 位 ARDY: 寄存器已准备好访问。  在非重复模式下(I2CMDR 中为 RM = 0):如果 I2CMDR 中的 STP = 0、 则当内部数据计数器减至0时 ARDY 位被置位。 如果 STP=1、ARDY 不受影响(相反、当 计数器达到0时、I2C 模块生成一个停止条件)。  在重复模式中(RM = 1):在 I2CDXR 传输的每个字节的末尾设置 ARDY。

 

谢谢、

Andrias Matheus

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

    Andrias、您好!

    我建议查看下面 C2000WARE 安装目录中提供的示例代码、我认为 I2C 驱动程序文件会有所帮助。 我意识到它适用于 F2806x、但这两种器件具有几乎相同的 I2C 模块。

    C:\ti\c2000Ware_4_01_00_00\device_support\f28066\examples\c28\i2c_Lib_EEPROM_INTERRUPT

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption ]我们知道、 当我们将 I2CMDR 位 STP 设置为1时、I2CSTR 中的 ARDY 位不受影响(如下所示)。 我想 不 会产生 ARDY 中断、对吧?  请、当 我们需要知道通信何时 完成时、有人能就哪种中断更好地使用 SCD 或 ARDY 提供一些建议吗? 我们有一个闭环控制、它将等待信号(来自 I2C)可用于更新输出。 我们使用 FIFO 中断来处理数据、因为我们的代码对时间非常敏感、使用延迟轮询数据不是一个选项。

    我认为您正确的做法是、在这种情况下、应预先将 STP 设置为1。 应该使用 SCD 中断来知道在这种情况下通信已完成。 如果 STP 设置为0、则可以使用 ARDY 中断、然后写入/读取更多数据或生成停止条件(即设置 STP=1)。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    感谢您的关注。

    很抱歉、我的延迟、但您可能理解、在开发中工作就像每天要解决的新问题、它永不结束。

    嗯、我听从了您的建议并使用了 C2000WARE 的 F2806x 示例。 我使用了中断模式、唯一改变的是 I2C 通信的开始。 在我们的固件中、通信在每1ms 发生一次的时间中断中开始。 我正在从流量传感器读取数据、根据传感器制造商、可以使用1KHz 的采样率。

    我非常担心、我要计算已发起通信的数量和返回有效数据的通信数量、比如成功/尝试率。 当我的器件处于待机状态时、该比率为~80%、但当我的器件正在运行时、该比率下降至~60%。 发生的问题是第64行文件 i2cLib_FIFO_INTERRUPT.c 中的总线忙(BB)、因此通信会提前终止。

    我检查了示波器、最后一个有效数据相应地生成了停止位(已连接)。


    使用断点、我知道程序没有在 handleNACKandTimeout 或 handleNACK 处通过。

    在 BB=1发生后、我立即检查了寄存器:

    • I2CMDR 和后续位为1:IRS、MST、FREE。
    • I2CSTR 和后续位为1:NACK、ARDY、XRDY、SCD、XSMT、 BB、NACKSNT。

    根据 I2C 数据表、BB 被下列任一事件清零:

    • I2C 模块接收或发送一个停止位(总线空闲)。
    • I2C 模块复位。

    问题:

    1. 请,您能给我一些提示,说明为什么我在经过适当的停止位(I2CSTR.SCD=1)后仍使用 BB=1?
    2. 有一种方法可以测试传感器(发送器)是否产生了问题?
    3. 有一种良好的做法或标准可确定 I2C 通信中的成功率/尝试率?
    4. 我能否解释将 成功/尝试率降低至60%与我的 DSP 过载有关? 如果我使用 FIFO 中断模式来处理数据、那么它不应该被最小化、甚至不存在?

    再次感谢!!!

    Andrias

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

    Andrias、您好!

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4199154 #4199154"]我检查了示波器,最后一个有效数据相应地生成了停止位(随附)。[/引用]

    您的波形中似乎有一个 NACK。 是这样吗?

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4199154 #4199154"]请告诉我一些有关为什么即使在适当的停止位(I2CSTR.SCD=1)之后我仍然使用 BB=1的提示吗?

    是否确定在停止条件发生后看到 BB=1? 您是否在 CCS 中进行调试并在运行时检查寄存器位?

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4199154 #4199154"]有一种方法可以测试传感器(发送器)是否产生了问题?

    我认为、只有当传感器出于某种原因将 I2C 线路保持在低电平时。

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4199154 #4199154"]
    • 有一种良好的做法或标准可确定 I2C 通信中的成功率/尝试率?
    • 我能否解释将 成功/尝试率降低至60%与我的 DSP 过载有关? 如果我使用 FIFO 中断模式来处理数据、那么它不应该被最小化、甚至不存在?
    [/报价]

    您会提到在正常运行时间内情况更糟。 这使我认为您的 I2C 代码/中断正被项目中的其他内容所取代。 可能其他中断正在被处理、I2C ISR 无法尽快得到处理。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    是的,我希望有一个 NACK,我从我的传感器接收5个字节,根据 数据表“在主接收器模式下:I2C 模块在每个应答周期发送一个 ACK 位,直到内部数据计数器减至0。 此时,I2C 模块向发送器发送 NACK 位。”

    是的,我正在使用具有总线忙状态断点的 CCS 进行调试(第68行示例文件 i2cLib_FIFO_INTERRUPT.c)。 此时、寄存器 I2CSTR 具有: I2CSTR.Nack=1、I2CSTR.SCD=1和 I2CSTR.BB=1。

    我尝试在 checkBusStatus 函数中包含一个超时、所以代码将等待100ns 以使总线空闲、但仍然无法正常工作。 在整个100ns 内、I2CSTR.SCD=1 (生成的停止位)。 在我的应用中、每1ms 将开始从我的传感器读取新数据。 我不能再等太久来检查总线是否空闲。

    嗯,我正在使用 FIFO 中断示例,希望 DSP 过载将被最小化,甚至不存在,令人失望的是 DSP 无法处理运行的几个中断。

    我坚持认为、您是否知道任何确定 I2C 通信成功/尝试比率的良好做法或标准?

    如果 SCD=1、您对 BB=1有什么建议吗? 如何使用 C2000WARE 中的 F2806x 示例测试我的通信过程? 同样,我没有从示例中更改一行,唯一的区别是,在我们的固件中,通信在每1ms 发生一次时间中断时开始。 您认为我应该创建一个单独的帖子、询问 F2806x 示例的帮助吗?

    我非常感谢您的任何评论、建议和提示。

    谢谢、

    Andrias

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

    Andrias、您好!

    您连接的是什么 I2C 器件? 您应该将协议和代码与器件规格相匹配。 请注意、我共享的示例用于连接 I2C EEPROM 器件。 您可以根据您的设备对其进行调整并使用底层功能/框架。

    您能否提供 I2C 器件的器件型号?

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4213192 #4213192]Yes,我正在使用 CCS 进行调试,并在总线忙状态设置断点(第68行示例文件 i2cLib_FIFO_INTERRUPT.c)。 此时、寄存器 I2CSTR 具有: I2CSTR.Nack=1、I2CSTR.SCD=1和 I2CSTR.BB=1。[/引用]

    在一个停止条件被生成后、BB 应该被清除。 您已经确认当您达到此断点条件时、总线上实际上是使用示波器生成停止条件的? 如果在断点后继续执行某些周期的代码、这些寄存器位是否会被清除? 我认为该寄存器位行为可能与配置 I2CMDR.FREE = 0有关(即、在遇到断点时立即停止)。

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4213192 #4213192"]我坚持认为,您是否知道在 I2C 通信中建立成功/尝试比率的良好做法或标准?

    您是否清楚地确定 I2C 通信的哪一部分通常发生故障? 它是在从机地址部分、读取、写入等期间吗? 了解这一点会有所帮助。

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4213192 #4213192"]您认为我应该创建一个单独的帖子,询问 F2806x 示例的帮助吗?

    无需、我是编写和测试示例代码的人。 我们可以在该主题上继续讨论。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    是的、我更改了一些定义以适应我的传感器和 TMS320F2809 I2C 模块:

    #define EEPROM_SLAVE_ADDRESS    0x20

    #define EEPROM_LOW_ADDR            0x2E

    #define EEPROM_DATA_Bytes          5.

    #define I2C_FIFO_LEVEL                   16

    我正在使用配置为主模式的 TMS320F2809 I2C 模块,380 kbps,Rm=0从流量传感器读取数据(5字节)。 流量传感器的数据表不是英文的(已随附)。

    是的,在断点之后,我在示波器中检查了断点(9月5日的开机自检屏幕),我有一个 NACK,然后是一个 STOP。 即使在断点后100ns、寄存器仍然:I2CSTR.Nack=1、I2CSTR.SCD=1和 I2CSTR.BB=1。

    我将更改 I2CMDR.FREE = 1并查看发生了什么。 你有其他建议吗?

    非常感谢您、

    Andrias

    e2e.ti.com/.../Datasheet_5F00_FlowTEX_5F00_v1_5F00_0-_2800_1_2900_.pdf

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

    Andrias、您好!

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4216371 #4216371")是的,在断点之后,我在示波器中检查了断点(9月5日的开机自检屏幕),我有一个 NACK,然后停下来。 即使在断点后100ns、寄存器仍然:I2CSTR.Nack=1、I2CSTR.SCD=1和 I2CSTR.BB=1。[/引用]

    这种行为对我来说毫无意义。 在传输开始前 BB 位为0、对吧?

    我将查看数据表、并告诉您我是否考虑任何其他原因或尝试的事情。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    关于您的最后一个问题、"在传输开始前 BB 位为0、对吧?"、答案是否定的、这是我的问题、BB 不是0。 即使在适当的停止位(I2CSTR.SCD=1)之后,我仍有 BB=1? 自9月 5日发布以来、我一直在报告这一情况。

    谢谢、

    Andrias

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

    Andrias、您好!

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4216371 #4216371"]断点后即使是100ns、寄存器仍然:I2CSTR.nack=1、I2CSTR.SCD=1和 I2CSTR.BBB=1。

    如果您在断点处停止前等待的时间超过100ns、寄存器是否会被清除?

    [引用 userid="530906" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1128156/tms320f2809-i2c-module-ardy-or-stop-interruption/4367801 #4367801"]关于您的最后一个问题:"在传输开始前 BB 位为0、对吧?"、答案是否定的、这是我的问题、BB 不是0。 即使在适当的停止位(I2CSTR.SCD=1)之后,我仍有 BB=1?[/quot]

    I2C 传输发生之前、我的意思是、 在开始新的通信之前、您是否检查 BB 位以确保其在代码中为0? 当 BB=1时、启动新的通信仅针对重复起始条件情况。

    请参阅以下信息、了解 I2C 处于复位状态(IRS=0)后剩余的 BB 状态。 I2C 模块可能会对总线的状态感到困惑、具体取决于您如何处理此情况以及 I2C 代码中的内容。

    您能否与我共享 I2C 代码以供审核? 如果您不愿意在论坛上分享、您可以通过私人 E2E 消息发送。

    最棒的

    Kevin