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.

[参考译文] MSP430F5438A:MSP430 BSL I2C 通信问题

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1029423/msp430f5438a-msp430-bsl-i2c-communication-issue

器件型号:MSP430F5438A

使用 MSP430 BSL。 尝试在两个 MSP430器件、一个器件上的主应用程序以及另一个器件上的从应用程序和 BSL 之间进行 I2C 通信。   向 BSL 发送命令(例如密码、加载 PC)。 BSL 不处理命令。   I2C 中断(开始、发送、停止)在连接到主器件的控制台上被检测到。   还可以看到 NACK。   这至少告诉我们 I2C 消息正在从主器件获取到 BSL。   

现在 BSL 具有用于检测 I2C 中断的代码,称为 pi_receivePacket()。  我认为这会像 ISR 一样工作。   此代码未执行(例如看不到起始位)。   我在该函数中输入代码来打开 LED、不会发生任何情况。   另一个函数是 interpretCommand(),由于上述原因,无法访问该函数。  因此、我们发送的命令永远不会被处理。   

在更多的上下文中、从器件侧的 MSP430应用程序作为我们的目标软件运行、而主器件侧的 MSP430应用程序向其发送一条消息来调用 BSL 以刷写新映像。   

存在可疑行为。  在我们的从器件上、我们的应用程序在主器件发出命令后进入 BSL、但当 I2C 命令从主器件发送到 BSL 时、与从器件应用程序关联的 ISR 代码正在执行、在这里、我们可以在连接的控制台上看到中断(接收、启动、停止)。   这是令人困惑的、因为我们禁用中断并将程序计数器移动到 BSL 地址0x1000。   但闪存中的应用 ISR 正在执行?

从应用有其自己的从地址、不同于 BSL 从地址(0x48)。

我们使用了来自 TI 网站的专为 MSP430F5438A 设计的 BSL、但它仅包含 UART 功能。   因此、我们将 TI BSL 的 I2C 代码用于不同的芯片 (MSP430F522x)。   修改此代码以匹配我们的硬件(例如端口、I2C 引脚)。   

这里可能缺少什么?

谢谢

Jeff

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

    尊敬的 Jeff:

    很抱歉,我有点困惑。

    BSL 是否是主存储器 BSL (我假设它是这个)。 或保存在 ROM 中的文件。

    您能否在调试模式下调试 I2C BSL 从设备代码?

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

    您好、伊斯迅、

    我们使用的是闪存存储器、而不是 ROM。  我们能够在调试模式下设置 BSL 并单步执行代码。  但是、很难以这种方式重现我们的问题、因为主器件也需要处于调试模式、或者以某种方式进行同步、这样 I2C 总线不会混乱(锁定或 msg 超时)。   

    Jeff

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

    您能否检查 I2C 寄存器是否已正确初始化。 您可以在调试模式下看到它。

    当您进入 BSL 模式时、不应进入中断。 可能是因为您在进入 I2C BSL 时没有清除 I2C 中断使能寄存器。 由于您没有重新为器件供电、RAM 中的寄存器将保持该值。

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

    您好、伊斯迅、

    我们将通过以下行从我们的应用中执行 BSL、如 TI 示例中所示:

    _disable_interrupt ();
    (((void (*)()) BSL_START_ADDR)();

    由于我们的应用在 BSL 之前首先运行、因此我们不知道如何在跳转到起始地址后通过单步调试代码行来调试 BSL。   我们无法独立调试 BSL、因为我们需要运行应用来初始化和启用 I2C 电源。   此外、我们的主应用程序向我们的从应用程序发送 I2C 消息、告知它启动 BSL。   不确定是否有任何简单的方法来对所有移动部件进行 BSL 调试。  由于 BSL 存储器很小、添加打印功能不可行。

    应检查哪个 I2C 寄存器以进行正确初始化?   中断使能寄存器 UCB0IE 被初始化以启用我们想要捕获的中断。  现在、我在进入 BSL 之前将该寄存器清零。   BSL 将重新初始化它。   

    用于捕捉中断的寄存器是 UCB0IV。   当通过 I2C 从主应用程序发送数据时、 UCB0IV 始终为0、这意味着未检测到中断。   

    还有中断标志寄存器 UCB0IFG 。  I2C 代码会清除该寄存器、我还添加了一行代码来清除该寄存器。   

    到目前为止、BSL 仍不在 UCB0IV 寄存器中捕获中断。   

    回想一下我原来的电子邮件、我们的 BSL 的 I2C 部分来自不同芯片的 BSL 代码。  看不到任何明显的 I2C 初始化问题。

    在主应用程序上、当我们发送诸如密码之类的命令时、I2C 会确认每个字节。  因此、数据由 BSL 接收、但不会反映在 UCB0IV 寄存器中。

    谢谢

    Jeff

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

    很抱歉,我有点困惑。 您的问题是您可以从应用程序进入 BSL。 您确定 BSL 可以接收 I2C 数据、但无法响应正确 的命令。

    您只下载 BSL 代码、而不下载应用代码。 然后您可以对其进行调试。

    我认为它可能与 I2C 设置没有关系、也可能与逻辑控制有关系。

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

    您好、伊斯天、

    我不确定在没有应用程序或主应用程序的情况下如何使用 BSL 的 I2C。   我们的从应用实际上会将电源应用到硬件、包括 I2C。   

    我不知道你是否知道这个问题的答案。  当我们在主应用程序上初始化 I2C 时、我们可以选择将其设置为400Kbps 或100Kbps 的速度。   但是、I2C init 会将速度设置为8MHz。   UCSCTLx (其中 x = 0 - 5)根据 TI 示例代码进行设置。   对于我们的应用、我们将使用 TI driverlib。  BSL 直接设置寄存器。   

    对于 MSP430FRXXX 系列、TI 说必须在进入 BSL 之前在应用中设置8MHz。   但我们的器件是 MSP430F5438A。   

    令人不安的是、从应用正在捕获从主应用程序到 BSL 的 I2C 消息中断!   BSL 和从应用程序的从地址是完全不同的。  但我现在想知道、看到中断的从应用 ISR 是否意味着从应用、而不是 BSL 获取 I2C 数据。  但我们在进入 BSL 之前禁用了中断。  我按照您的建议清除中断使能寄存器。

    Jeff

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

    1.您能否将电源控制放入 BSL 代码中、然后移除应用程序。

    2.我认为它将 CPU 设置为8MHz、而不是 I2C 时钟。 在这里、您会发现"我说必须在进入 BSL 之前在应用中设置8MHz "

    3. 当从应用捕获从主应用到 BSL 的 I2C 消息中断时、器件处于 BSL 模式? 您如何知道它是由 Salve 应用捕获的。 您在 I2C ISR 中添加信号?

    4.我真的建议您调试 BSL 代码、任何猜测都不会有帮助。