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.

[参考译文] MSPM0G3507:CCS 监视窗口寄存器与运行时结果不匹配

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1445670/mspm0g3507-ccs-watch-window-register-not-match-with-runtime-result

器件型号:MSPM0G3507

工具与软件:

hi champs、

我是为我们的客户提出这个问题。

用户使用了该示例并使用 API DL_I2C_getTargetStatus ()对其进行了一点修改。

C:\ti\mspm0_sdk_2_02_00_05\examples\nortos\LP_MSPM0G3507\driverlib\i2c_target_rw_multibyte_fifo_interrupts\ticlang

在第116-119行中、 CCS 监视窗口的 u32temp 结果 右上角为0xB240、不同于右下角的0xB245 (CCS 监视窗口寄存器查看 I2C1_SSR)。

用户在下面的循环中添加了代码(第116-119行)、并再次运行到 第123行、用户发现结果变为正确的0xB244、与 I2C_SSR1匹配(见下文)。

为什么 上图中使用 DL_I2C_getTargetStatus ()的运行时结果与监视窗口寄存器 I2C_SSR1不同?

为什么 在监视窗口寄存器 I2C_SSR1中使用上图中的 DL_I2C_getTargetStatus ()得到的运行时结果正确 ?

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

    尊敬的专家:  

    我们可以复制它。  

    这是我的测试、我创建了三个变量、以采用不同的方式和时间获取 I2C 从器件寄存器。  

    u32temp1 =>从 API 中

    u32temp2 =>寄存器的内存位置

    u32temp3 =>在运行100个周期后、通过 API

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DL_I2C_flushTargetTXFIFO(I2C_INST);
    u32temp1 = DL_I2C_getTargetStatus(I2C_INST); //API read slave register
    u32temp2 = *(uint32_t *)0x400F325C; //read the slave register memory location value
    for(int i=0;i<100;i++)
    {
    __NOP();
    }
    u32temp3 = DL_I2C_getTargetStatus(I2C_INST); //the value stabled
    __NOP();
    break;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    • 运行 for 循环之前的断点
      • u32temp1和 u32temp2 = 0x0009040、
      • 地址0x400G325C = 0x00009000
      • I2C_SSR = 0x00009000
          

    • 断点运行 for 循环后、它将变为实例化
      • u32temp1和 u32temp2 = 0x00009040、
      • u32temp3 = 0x00009000
      • 地址0x400G325C = 0x00009000
      • I2C_SSR = 0x00009000


    我们从存储器中获取的值是否应该与从存储器浏览器中看到的值相同?

    此致、

    Eric Chen

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

     i2c_controller_rw_multibyte_fifo_interrupts 示例似乎不会读取任何目标端状态(因为它作为控制器运行)。

    假设这实际上类似于 i2c_target_rw_multibyte_fifo_interrupts、我想您会在目标端 I2C 单元和调试器之间看到一种竞态。 即使 PDBGCTL=0、我也希望 I2C 单元可能需要一些有限的时间在断点处停止、因此非常动态的东西(例如 BUSBSY (0x0040)可能会在此期间发生变化。

    我建议您在比较之前屏蔽您不感兴趣的字段。

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

    Bruce、您好!

    这里有一个拼写错误。 是的、我们讨论的是目标侧(G3507 I2C 充当目标)、而不是控制器侧、并且我已经在第一个帖子中更改了路径。

    您能否更清楚地说明:"目标侧 I2C 单元和调试器之间发生竞争"?

    您是说我们甚至在 var = DL_I2C_getTargetStatus (I2C_INST)之后立即设置断点、但调试器仍无法同时获取它吗?

    也就是说、您意味着 CCS 窗口结果在断点处不正确?

    您提到"我建议您在比较之前屏蔽不感兴趣的字段。" 事实上、我们只是试图在地址之后获取 R/W 位、发现通过比较代码和 CCS 观察窗口很难识别它。

    如果我们想获得 R/W 位、您有什么建议我们应该如何做? 您能否详细说明一下?

    这是 CCS 错误还是调试器(XDS110)限制?

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

    这里有两个可分离的东西:

    1) 1)动态位:这些位由于程序之外的事件而变化。 通常、它们的状态可以在寄存器的两次连续读取之间变化。 并非所有引脚都是这样的、但根据 TRM 快速阅读结果、哪一个并不总是很明显。

    2) 2)不相关的位:这些位是您不感兴趣的位、可能会也可能不会= 1;这些位会阻止使用简单比较、例如"(u32temp = 0x80)"、因为也可能会设置其他一些(不相关)位。

    这样的测试看起来应该更像

    > if ((u32temp & 0x80)== 0x80)  // Tx mode?

    或更正式地说:

    > if ((u32temp & I2C_SSR_TXMODE_MASK)== I2C_SSR_TXMODE_SET) // Tx mode?

    ---

    通常、固定(2)也会固定(1)。

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

    Bruce、您好!

    这可以通过上述方法+基于循环的语句来解决。

    感谢您提供的信息。