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.

[参考译文] RF430FRL152H:I2C 在翻转 VDDSW 后挂起

Guru**** 2563590 points
Other Parts Discussed in Thread: RF430FRL152H, RF430FRL152HEVM, MSP-FET

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/891810/rf430frl152h-i2c-hangs-after-flipping-vddsw

器件型号:RF430FRL152H
Thread 中讨论的其他器件:MSP-FET

您好!

我将 RF430FRL152H 用作具有单个从器件(MAX5395)的 I2C 主器件。 我遇到的问题是、I2C 写入将在 UCB0IFG 中无限等待要设置的中断标志、仅在翻转 VDDSW 之后(通过从 VDDSW 物理断开 VDDB、或通过将器 件暴露在射频字段并导致 BS_VR_VBN 发生更改)。

我的 I2C 初始化代码:

//将引脚设置为 I2C (请参阅数据表第33-34页)
// SDA
P1DIR |= BIT0;
P1SEL0 |= BIT0;
P1SEL1 &=~BIT0;
// SCL
P1DIR |= BIT1;
P1SEL0 |= BIT1;
P1SEL1 &=~BIT1;

//初始化 USCI
UCB0CTL1 |= UCSWRST; //软件复位被启用
UCB0CTLW0 |= UCMODE_3 + UCMST + UCSYNC + UCTR; // I2C 模式、主模式、同步、发送器
UCB0CTLW0 |= UCSSEL_2; //选择2MHz 的 SMCLK
UCB0CTLW1 |= UCASTP_1 + UCGLIT_0; //自动停止生成,抗尖峰脉冲时间
UCB0BRW = 40; // 2MHz/40=50kHz
UCB0CTL1 &=~UCSWRST; //退出复位模式 

我的 I2C 写入代码:

UCB0CTL1 |= UCSWRST; //软件复位被启用
UCB0I2CSA = MAX5395_I2C_ADDR; // I2C 从地址
UCB0CTLW1 = UCASTP_1;
UCB0TBCNT = 0x0002;

UCB0CTL1 &=~UCSWRST; //使 eUSCI 退出复位状态

UCB0CTL1 |= UCTXSTT + UCTR; //启动 i2c 写入操作
while (!(UCB0IFG & UCTXIFG0));//发送 I2C 地址
UCB0TXBUF =命令; //发送命令
while (!(UCB0IFG & UCTXIFG0));//等待命令被发出
UCB0TXBUF = txData; //发送 LSB
while (!(UCB0IFG & UCBCNTIFG));//等待它被发送
UCB0CTL1 |= UCTXSTP; //发送停止条件
while (!(UCB0IFG & UCSTPIFG));//等待它被接收
UCB0CTL1 |= UCSWRST; //将 eUSCI 置于复位模式 

我的主循环设置为在循环中重复运行初始化和编写代码。 它可以工作、直到我翻转 VDDSW、之后它在写入 I2C 地址后一直停止、如下面的逻辑分析仪捕获中所示。 但我知道器件会保留电源、因为其他功能正常工作(例如、如果我禁用 I2C 代码、程序会继续执行... 另一个引脚上的 PWM 输出仍然有效... 等)。

请告诉我要解决的任何建议。

谢谢、

Jason

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

    为了增加更多细节、当我使用调试器进行研究时、我可以看到 UCB0IFG 中的 UCTXIFG0位实际上被置位。 所以我不知道为什么它会在这里停止。

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

    您好 Jason、

    当电源翻转或施加射频能量时、I2C 线路上是否可能出现毛刺脉冲?

    逻辑分析仪上可能不可能出现的噪声?

    应用复位后该部件是否正常工作、或者是否需要重启电源才能使其运行?

    同样不容易看到从器件是否发送 ACK?

    如果您使用中断处理程序而不是轮询标志、则会出现另一个问题、即相同的行为?

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

    您好、Dietmar、

    感谢您的回答。

    • 当开关翻转时、I2C 线路上肯定会出现一些噪声/干扰。 但是、即使 I2C 事务延迟远超过开关翻转点、也会出现此问题。 例如-如果我在每个事务之间插入2秒的延迟、并在延迟期间翻转开关-下一个事务是停止的事务。 因此我每次(使用 UCSWRST)都复位总线、但问题仍然存在。
    • 如果我在开关关闭时应用复位、固件会重新启动、但第一个 I2C 事务也会以类似的方式停止。 如果我在打开开关的情况下应用复位、固件 将重新启动并工作。
    • 根据我的逻辑分析仪、从器件确实发送 ACK。
    • 关于使用中断处理程序、奇怪的是、我似乎无法使 USCI_B0_Vector 在该部分工作。 如果我使用启用中断
      UCB0IE = UCTXIE0 + UCRXIE0; 

      并在 ISR 中放置一些代码

      #pragma vector = USCI_B0_vector
      __interrupt void USCI_B0_ISR (void)
      {
      P1SEL0 &=~(BIT0);
      P1SEL0 &=~(BIT1);
      
      UCB0CTLW0 |= UCSWRST;//复位
      UCB0CTLW0 &=~UCSWRST;
      
      P1SEL0 |=(BIT0 | BIT1);
      } 

      并在 ISR 中放置一个断点、我永远不会看到达到的断点。

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

    Jason、

    感谢您提供更多详细信息。

    由于状态机始终处于启用状态、并且可能对 SCL 和 SDA 上的信号做出反应、因此干扰也会影响 I2C 状态机在传输之间产生延迟。 但是、如果您使用示波器进行跟踪以检测干扰、则可以确认或排除此理论。 不确定您的逻辑分析仪是否能够触发干扰。 但射频项目指向它。

    2、UCSWRST 不起作用、这有点奇怪。 但是、您不知道卡滞何时发生正确。 因为如果发生从重新初始化到 ADR 传输的情况、UCSWRST 将不会产生影响、因为器件会在标志轮询时挂起。
    有趣的是、如果您连接到调试器以将 PC 重置为 I2C 初始化并再次执行以查看另一个 SWRST 是否有帮助、您可以尝试一下吗?

    3.在开关关闭/打开时应用复位是什么意思? 但是、尤其是在关闭开关时、I2C 初始化将第二次执行、然后第2点得到正确的回答?

    关于中断、如果未完成、我建议启用全局中断使能(GIE)。 否则、我们需要找出中断不起作用的原因。

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

    您好、Dietmar、

    1. 不幸的是、我目前无法访问范围(由于隔离区!) 但下次我能更仔细地看一下。 我几乎假设存在一些瞬时干扰、并想知道如何正确复位 I2C 状态机来处理这种干扰。
    2. 如何使用 Code Composer Studio 将 PC 重置为 I2C 初始化?
    3. 我将讨论如何在 CCS 中使用软复位按钮、在 VDDSW 和 VDDB 之间关闭(ON)或打开(OFF)之间进行外部开关。 虽然我使用的是定制板、但基本上是 EVM 上的 SV7。
    4. 是的、我已经启用了 GIE、但仍然无法使中断处理程序工作。 您是否有任何建议需要进一步调查?

    感谢您的帮助!

    Jason

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

    您好 Jason、

    关于#2。)
    -在您设置 SWRST 位的行插入一个断点,然后打开寄存器视图并转到 CPU 寄存器,在您到达断点时检查 PC 值(程序计数器)
    -然后删除 BP 并执行、触发故障并停止调试器,您应该会看到它在标志轮询循环中挂起
    -进入寄存器视图打开 PC 值窗口,然后输入您之前记下的地址

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

    Jason、

    抱歉我的浏览器出现问题


    关于#2。)
    -在设置 SWRST 位的行中插入一个断点,然后打开寄存器视图并转到 CPU 寄存器,在您到达断点时检查 PC 值(程序计数器)
    -然后删除 BP 并执行、触发故障并停止调试器,您应该会看到它在标志轮询循环中挂起
    -进入寄存器视图打开 PC 值窗口,然后输入您之前记下的地址

    关于#3)
    因此、当电源方案出现并消失时、尝试了解它
    -意味着您将开关"BS_VR_VBN"连接到 VDDBSW、以便直接通过电池供电?
    -然后、您在复位(ON)期间关闭开关"EN_BATSWITCH"、-->在复位后、行为消失
    -如果在复位(关闭)期间开关"EN_BATSWITCH"打开、-->行为仍然存在?
    -我是说、如果您通过电池供电(连接到 VDDBSW 的"BS_VR_VBN")、您必须将其关闭、否则您通过 JTAG 的后门电源是对的?

    关于#4)
    -这是奇怪的 GIE 被启用并且 I2C 中断被启用、标志被置位->表示中断必须被执行
    -您能否共享二进制十六进制文件以查看相应的中断矢量和 ISR 是否正确生成?

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

    您好、Dietmar、

    (2)这似乎无法解决问题、实际上似乎会导致调试器出现某种问题-我录制了一个屏幕截图、以便您可以看到发生了什么: https://www.youtube.com/watch?v=MqG0rOgseW4&feature=youtu.be

    (3) EN_BATSWITCH 在整个时间内被置位。 BS_VR_VBN 也会一直保持关闭状态、就我所能说的那样。 我不是更改 EN_BATSWITCH、而是翻转一个将 VDDSW 引脚与 IC 上的 VDDB 短路的物理开关。 就像 RF430FRL152HEVM 上的 SV7一样。 我发现您需要使用此开关来通过 JTAG 刷写芯片。 但理想情况下、我们不希望在生产过程中安装此开关。


    (4)请参阅随附的文件并告知我。

    e2e.ti.com/.../s3_2D00_firmware.zip


    谢谢、

    Jason

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

    与中断相关、UCB0IE 的值似乎没有改变。 即使在经过类似的一行代码后也是如此

    UCB0IE = UCTXIE0 | UCRXIE0; 

    当 UCSWRST 位被置位时、根据 CCS 寄存器视图、UCB0IE 的值保持在0x0000。

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

    您好、Dietmar、

    很抱歉多篇文章、但我想提供一些示例代码来重现 EVM 上的问题、这可能对您有所帮助。

    • 对于所连接的项目、我在 RF430FRL152HEVM 上构建并运行它(没有连接从器件或任何东西-只连接裸 PCB)。
    • EVM 由连接到 SV2的 MSP-FET 供电。 S6设置为电源。 SV7已跳线。
    • 当运行程序时、它被捕获在 max5395.c 的第56行上、这是一个 while 循环、等待 UCTXIFG0位被置位。 如果我理解正确、当 USCI 完成发送字节时、该位应该被置位、而不管总线上是否存在外部从器件。
    • 我注意到 UCB0IE = 0x0000、即使我尝试在 max5395.c 的第49行中设置 UCTXIE0标志
    • 我的问题是-为什么代码卡在第56行-为什么 UCB0IE 寄存器的值不更新?

    希望这对您有所帮助、再次感谢您的帮助。

    e2e.ti.com/.../rf430frl152h_2D00_issue.zip

    最棒的

    Jason

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

    Jason、

    好的、感谢您提供的所有信息、让我们逐步工作
    关于调试,很难理解您在 YouTube 视频中所做的工作。 我认为这不是我所建议的。

    2.您发送的二进制映像在地址0xFFF0处的 eUSCIB 矢量位置定义了值0xFEAA。 这就是 ISR 所在的位置。
    至少在0xFEAA 处找到代码。

    如果模块特定中断使能未被置位、那么中断处理不正确的原因就是这样。
    设置这些位或仅在出现故障时才起作用吗?

    因此、我认为我们需要首先找出无法设置中断使能的原因、这与您的项目或 JTAG 连接类似、这是很奇怪的。

    我尝试导入您的 CCS 工程、但在使用的编译器版本上出现故障。 那么、您能否告诉我您使用的是哪种编译器、以便我可以在 CCS 上安装它?

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

    您好 Jason、

    我的同事有 RF430FRL152HEVM。 他编译了您提供的项目、我们能够看到中断使能位无法设置。 我们控制了反汇编代码(机器代码)、并可以确认编译器已将其正确转换为 mov 指令。 寄存器0x66A 的地址也是正确的。

    因此、我们现在将重点介绍这一点、并尽快提供更新。 由于当前的新冠疫情、我们进行物理实验的能力目前有点有限、因此请理解一些延迟、谢谢!

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

    您好 Jason、

    Dietmar 让我看一下包含 IRQ 的 RF430FRL152H 固件示例。

    将代码放入我的目标后、我会看到与您相同的问题、但这是因为您的代码必须进行大量更改才能使用中断。

    UCB0IE 寄存器似乎不可写、这不是一个故障、因为该寄存器只能在 UCSWRST 被设定为"0"时被写入、否则它将把 UCB0IE 寄存器保持在复位状态。 起初我也想知道这种行为 、但我了解到这是可以的。

    在详细阅读该主题后、我将返回到有关您电路电源的问题。

    您能 解释  一下电路板 在电源方面的工作原理吗? 它是否会始终由 VDDB 供电? 它是否也应该仅由射频供电?

    MAX5395由哪个电源供电?  I2C 上拉电阻连接到哪个电源?  FET 工具是否在 调试期间为电路板供电?

    您是否已检查是否所有 电源电压电容器 均符合建议?

    在 这种情况下、当您打开 VDDB 和 VDDSW 之间的开关时、器件应该由 VDDB 供电? 提出问题的原因是我看不到任何关闭电池开关的代码。

    很抱歉、所有这些问题、但由于 存在所有 不同的电源(电池、射频、调试工具)以及在之间切换的可能方法、因此需要了解有点复杂的电源。

    当您的代码滞留在等待 TXIFG 的循环中时、您是否尝试查看反汇编窗口并执行汇编器步骤?

    让我们看看我们是否能 找到您的电路出现奇怪行为的原因。

    此致、
    Helfried  

        

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

    您好、Helfried、

    感谢您的回复并确认 UCB0IE 不可通过 UCSWRST 写的问题已清除。 要回答您的问题:

    • 该电路板由 VDDB 供电。 但是、我们有一个连接到 VDDR (RFPMMIEVR)的中断、我们将其用作某种"写入唤醒"功能(理想情况下、我们希望在更改为 NDEF 有效载荷时唤醒-但发现在这个芯片上不能代替整个 NFC 堆栈-所以这是一个折衷方案)。 我发现、如果 VDDB 短接至 VDDSW、该中断不起作用。
    • MAX5395由 VDD2X 供电。 I2C 总线的 VDDB 和 VDD2X 之间有一个电平转换器。
    • 所有电源电压电容器均遵循数据表建议。
    • 是的、我的示例中未显示、但我按如下方式关闭电池开关:
      RFPMMCTL0 = PMMPW | RFPMM_EN_BATSWITCH | RFPMM_EN_V_doub;//启用电池开关和内部电荷泵 

      就在 main()的开头。

    • 我没有看过反汇编、如果我在接下来的几天内有时间、我会尝试这样做并报告。

    最棒的

    Jason