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.

[参考译文] MSP430F2013:闪存擦除后 I2C 传输期间意外复位

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/838103/msp430f2013-unexpected-resets-during-i2c-transfer-after-flash-erase

器件型号:MSP430F2013

我有一个自定义引导加载程序使用 I2C 与主机通信、并在 FC00-FFFF 地址空间中运行。 I2C 从设备由中断驱动。 要对闪存进行编程、将发送 I2C 命令以擦除应用空间 F800-FBFF。 在执行擦除命令之前、代码会验证应用空间中是否包含非0xFFFF 字。 如果找到非0xFFFF 字、该扇区将被擦除、并检查以下扇区是否存在非0xFFF 字。 由于擦除是从 ISR 执行的、因此 I2C 总线在闪存被擦除后释放、从而防止主机发送下一条命令。

 在闪存被擦除并且 USIIFG 标志被清除之后、释放 I2C 总线、主机发出命令来编辑闪存、在一个 I2C 传输中8个字(16字节)。 在接收到命令的最后一个字节后、在 ACK 位被发送回主器件之前、闪存被编程。 编程 I2C 总线释放后、准备好接收下一段数据。

我注意到的是、在 I2C 传输期间、微控制器似乎在 USI 中断时跳转到复位矢量。

在上图中、当检测到启动条件时、P1.4和 P1.5在 USI ISR 内以相同的频率切换。 在加载栈指针之前、P1.5本身被切换为_c_int00 ()内复位后的第一条指令。 P1.4被切换为我的 USI ISR 内的第一条指令、并且当这些位被成功处理并且 USI 为下一个传输做好准备时、它也被切换。 在图的中间、您可以看到 P1.5在指示我的 MCU 开始从复位矢量执行时自行切换。 在这之前大约0.1ms、您可以看到 P1.4行切换两次、这是第一次 USI ISR 在第二次加载 USI 控制器中的位计数器以接收接下来的8位时开始执行。 8位到达后、不会产生中断、I2C 总线不会保持低电平。 但是、MCU 开始从复位矢量执行。 必须注意的是、在 I2C 传输过程中、在接收到所有16字节数据并执行"闪存写入"之前很久就会发生"复位"。 有时、它在接收 I2C 地址字节时发生。

但是、如果仅使用引导加载程序对 MCU 进行编程(应用地址空间0xF800-FBFF 全部为0xFFs)、则当从主机接收到"擦除闪存"命令时、擦除操作不会执行、因为所有字节都已在0xFF 处。 之后、所有到编程闪存的 I2C 传输都在没有"复位"的情况下发生。

某种程度上、擦除闪存会导致 USI 中断(这些中断在很晚时发生)缺火、从而导致 MCU 从复位矢量启动。 但是、编程闪存不会影响 USI 中断、并且应用程序已成功加载。 平均而言,大约13个 I2C 传输成功编程13*16=208字节,在“重新启动”发生之前,会导致 I2C 传输失败(收到 NACK)。

在 SP 初始化后立即禁用看门狗。 没有其它中断被启用并且 NMI 中断指向一个复位陷阱(无限循环)。 什么可能导致 MCU 从复位矢量执行?

谢谢

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

    你(们)好,Gennadiy

    您是否使用了应用手册 http://www.ti.com/lit/an/slaa600d/slaa600d.pdf 中的演示代码 作为参考?  

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

    否 但是、在查看您提到的示例后、我注意到它们有一个用于禁用外设中中断的函数、其中包含一条注释:"以下例程禁用由 POR 清除但不是由 PUC 清除的中断"。

    我的应用程序正在使用 Timer A 中断、它还使用看门狗寄存器上的无效密码来复位并进入引导加载程序。 看门狗生成 PUC (上电清零)事件并重新启动处理器、但 PUC 不做的是复位计时器寄存器(仅由 POR 复位、上电复位)。 当我的引导加载程序启用中断时、计时器会触发、导致周期性中断发生并导致"跳转至任何地方"。

    我只需清除 TACCTL0、 TACCTL1和 TACTL 寄存器、一切都按预期开始工作。