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.

[参考译文] TMS320F28069:从闪存执行时 I2C 模块的行为与从 RAM 执行时的行为不同。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/592229/tms320f28069-difference-in-behavior-of-i2c-module-when-executing-from-flash-compared-to-executing-from-ram

器件型号:TMS320F28069
主题中讨论的其他器件:BQ34Z100

我们有一个在连接调试器并在 CCS 中执行时工作良好的应用程序。  从闪存执行10次中的3次时、应用程序也可以在没有调试器的情况下工作。 我们的 F28069通过 I2CA 模块从 BQ34z100电量监测计中检索数据。  首先、将 BQ 的地址放置在 I2C 总线上 、然后放置相关的数据寄存器。

当从闪存执行时、在第二个时钟高电平转换后、模块将时钟线保持为高电平、而不会返回到完成将寄存器地址放在总线上的操作。  
从 RAM 执行时从未发生过这种情况。

下面是从 RAM 执行和闪存执行之间的屏幕截图。

在 RAM 下正常运行

从闪存执行时的操作

 


请注意、捕获右侧的数据寄存器地址只有2个时钟、并且保持高电平的时间超过100ms、这是不可接受的。  

此外、 由于 BQ 之外的其他器件也使用 I2C 模块进行通信、因此 I2C 模块由以下器件调用。、  

uint16 get_I2C_data (struct I2C_MSG_Xcvr * I2C_Config_Msg、uint16 * PTR_I2C_st填 充)

其中 I2C_Config_Msg 指向配置模块的结构–器件地址(buste 有多个器件)、读取/写入、字节的首选方式等  ptR_I2C_填 充 指针只是来自 I2C 寄存器的接收数据。

I2caRegs.I2CSAR = tempaddr;

I2caRegs.I2CCNT = I2C_Config_Msg->NumOfBytesTX;

I2caRegs.I2CMDR.ALL = 0x2E20;              //开始条件、主发送器、7位地址、自由运行数据模式                  

 

正在等待数据的循环内部... 这是 I2C 模块停止计时数据。  

I2caRegs.I2CDXR =*(I2C_Config_Msg->MsgBufferTX+I);
while (!(I2cRegs.I2CSTR.bit.XRDY)&&!(CPU_Timer_Status.PTO_Flags = TIME_OUT_FLAG))

                                                                                                                       

此外、我们还验证了由于在2K 的堆栈末尾写入了一些预定义符号、我们没有堆栈溢出。

除了这个 I2C 问题、我们的应用中的所有其他功能都可以正常工作–SPI、UART、ADC、中断、CPU 计时器、 等等

什么会导致 I2C 模块停止移动数据? 我们可以在哪里以及如何继续查找此模块故障的路径原因?

如果能在这方面提供任何帮助,将不胜感激。 提前非常感谢!

b/r

Matt

 

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

    Matthew、

    虽然与您的问题不完全相同、但以下文章提供了一些见解、说明为什么在连接调试器的情况下代码运行良好、但在冷启动时不运行:

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

    非常感谢您的快速响应。 我确实阅读了您发布的链接、但在深入探讨该主题后、我有更多问题:

    1) 我已将一些 SARAM 和 DPSARAM 块集中到更大的存储器块中、以适应程序的.ebss 部分(全局变量)。 即 L4 -L6已合并为以下内容:

    RAML4L6:origin = 0x00A000,length = 0x006000//组合的 RAM 块 L4-L6
    …μ A
    ebss :> RAML4L6 PAGE = 1.

    根据 F28069数据表(SPRS698F)第49页的存储器映射、L4是安全 RAM、L5和 L6是 DMA RAM、在此特定情况下不用作外设 DMA。 器件未被保护或锁定、我也不会进行任何特殊调用或执行代码来写入或读取安全 RAM。 在没有调试器的情况下从闪存引导时、使用此安全闪存位置是否会导致问题?

    2) 关于.ebss 主题并进一步挖掘您推荐的帖子、我发现了以下主题:
    e2e.ti.com/.../194968

    我编写了一个小的汇编代码、将其链接到闪存特殊段中的某个段中、以便在程序内容执行之前初始化所有.ebss–但没有结果。

    您或 TI 团队中的某个人能否提出指导原则、以及在初始化不同类型的变量、数组、模块、 等、以便从闪存系统进行独立引导的行为与连接调试器进行引导的系统完全相同?

    非常感谢您在这方面提供的任何支持或指导!

    b/r

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

    1) 1)如果您不打算保护 L4、那么将这些 RAM 段一起使用没有问题。 如果您曾经使用 DMA 单独访问 L5或 L6、则如果两个主器件尝试在同一周期写入存储器、则可能会看到一些仲裁、但 I2C 代码不太可能看到这种情况。
    问题:您是否考虑过转移到 L5-L7以避免安全 RAM 区域? 我不认为这会导致任何问题、但是如果内存占用量的改变会导致问题的消失、我们需要跟进。

    2) 2)这可能是我们未来可以做的事情。 我会向团队推荐这种方法。

    我看到您也在轮询 CPU 计时器标志。 您是否已确认未设置此字并阻止下一个字被传输?
    数据在 I2C 传输过程中是否停止传输、或者是否由主器件在不同的数据字之间保留?
    基本上、我想验证 I2C 本身是挂起的、而不是应用中的其他东西。 您能否在示波器捕获中添加一些注释、以便知道我要查看哪个信号?
    这个问题是在10次传输中出现3次还是3/10个循环通电?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Matt、

    这仍然是个问题吗?

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

    Mark、您好!  

    1) 我将存储器段 L5至 L7 ( 不包括可安全存储器段 L4)组合到.ebss 被分配、得到的控制器行为保持不变。 在安全存储器块未受保护时、我们可以正确访问这些存储器块。  

    图1.  连接到调试器时、使用功能 I2C 模块进行标准读取的特写视图(SDA-顶部、SCL -底部)。

    图2. 从闪存引导 I2C。

    图3. 模拟 启动捕捉。  

    最后、我们后退了一步、并观察了启动的发生方式。 当从调试器运行时、 I2C 器件在加电后连接几秒钟、可能几分钟、然后目标运行。   在独立模式下运行时、会加电、大约65ms 后、C2000会与 errant BQ 器件的 I2C 通信。  BQ 从器  件从初始上电开始有一个250ms 的通信超时,如果尝试读/写时,它显然会将时钟线拉低--拉低它。 在示波器上、通过从器件附近的 I2C 线路上的串联电阻器验证了这种行为  

    我找到了这个时钟拉伸线程、但很惊讶 C2000 I2C 模块不支持它。  

    http://e2e.ti.com/support/microcontrollers/c2000/f/171/p/323066/1125666

    您会注意到、我们已经在进行伸展动作时超时的情况下对其进行管理。 我们已采取进一步措施来减轻这种拉伸、尽管这种拉伸更为复杂、但我们已能够避免这种行为。  

    感谢您帮助减少此公式中的变量!

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

    很高兴您能够解决此问题。 是的、I2C 不支持时钟扩展。 我会将其作为反馈进行捕获、并将其反馈给我们的设计团队。

    这是我没有想到的一条路。 如果两个模块都上电、您会看到主器件在能够传输时立即尝试传输、但从节点尚未准备就绪(并将时钟拉低)。 通过强制主节点等待所需的加电时间、您可以缓解问题并正常启动。

    此致。
    标记