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.

[参考译文] TMS320F280037C:链接 TMS320F280037C (FreeRTOS) 上的闪存 API 库后 I2C 中断停止工作

Guru**** 2874030 points

Other Parts Discussed in Thread: TMS320F280037C, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1625914/tms320f280037c-i2c-interrupt-stops-working-after-linking-flash-api-library-on-tms320f280037c-freertos

器件型号: TMS320F280037C
主题: C2000WARE 中讨论的其他器件

尊敬的团队:

我正在使用 TMS320F280037C (C2000) 微控制器 FreeRTOS

我的固件包含多个外设:

  • I2C(与进行通信 BQ769x2 电芯平衡器 )

  • SPI(LCD 通信)

  • 挑战

  • PWM

  • FreeRTOS 任务

对系统的影响 添加闪存 API 支持之前正常工作


问题

添加之后 闪存 API 库 成本更低 NVM 存储 我的 与 BQ769x2 的 I2C 通信停止工作

重要观察结果:

  • 出现问题 链接闪存 API 库后立即进行

  • 是的 尚未调用任何闪存擦除/写入函数

  • 简单 添加闪存 API.lib 和包含路径会导致问题


症状

  • I2C ISR 从不执行

  • 电芯平衡器任务卡在初始化逻辑中

  • ADC 中断继续正常工作

  • SPI 和其他任务继续有效

问题似乎出在这里 特定于 I2C 中断 (PIE 组 8)


相关的 ISR 代码

中断无效 i2cFIFO_ISR (void) 

currentResponderPtr (Write_Read_);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group8);
}
中断无效 i2c_isr (void)

uint16_t STATUS = I2C_getInterruptStatus (I2CB_BASE);

IF (STATUS 和 I2C_INT_STOP_Condition)

while (I2C_getStopConditionStatus (I2CB_BASE)));
I2C_DONE = 1;
I2C_MODE = I2C_MODE_IDLE;
}

handleI2C_ErrorCondition(&BQ);

I2C_clearInterruptStatus (I2CB_BASE、STATUS);
INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_group8);
}

中断配置

INTERRUPT_REGISTER (INT_I2CB_FIFO、&i2cFIFO_ISR); 
INTERRUPT_ENABLE (INT_I2CB_FIFO);

INTERRUPT_REGISTER (INT_I2CB、&i2c_ISR);
INTERRUPT_ENABLE (INT_I2CB);

观察结果

  • ADC ISR 仍正常工作

  • 启用全局中断

  • PIE 初始化正确

  • 在链接闪存 API 库之前、I2C 运行良好


闪存 API 集成

我从 C2000Ware 添加了以下库:

F021_API_F28003x_FPU32_EABI.lib 

包含路径:

C2000Ware/库/FLASH_API/f28003x/include/FlashAPI 

闪存 API 函数放置在.TI.ramfunc链接器文件的部分中。


链接器 RAM 配置

最初、我合并了 LS RAM 块:

RAMLSx:origin = 0x00008000、长度= 0x00004000 

后来我又把他们分开了:

RAMLS0 
RAMLS1
RAMLS2
RAMLS3
RAMLS4
RAMLS5
RAMLS6
RAMLS7

.TI.ramfunc存储在 RAMLS5/6 中。

但是问题仍然存在。


问题

是否有人遇到以下情况:

  • 添加闪存 API 库可中断 I2C 中断

  • 即使未执行闪存函数也是如此?

这可能与以下各项有关:

  • 存储器放置更改

  • .bss重定位

  • FreeRTOS 堆放置

  • RAMFUNC 重叠

  • 或闪存 API 库段会影响中断行为?

如果有任何关于如何进一步调试此问题的建议、将不胜感激。


如果需要、我还可以分享:

  • .map添加到工程

  • 链接器脚本

  • I2C 驱动程序代码


微控制器

TMS320F280037C


工具

Code Composer Studio 12.8.
C2000Ware 5.x
FreeRTOS

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

    您好:

    您的代码是从 RAM 还是从闪存运行? 如果您可以共享.map、链接器脚本和非常有用的代码、

    我还邀请了我们的 I2C 专家。

    此致、

    Alex

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

    感谢您的答复。

    代码当前正在从运行 闪存中

    根据请求、我附上以下资料供您参考:

    • 连接器命令文件

    • .map 文件

    • 相关应用程序代码(包括 I2C ISR 和初始化)

    此外、我还使用 C2000Ware 中的闪存 API 库:

    如果您需要了解任何其他详细信息或具体部分、敬请告知。

    此致、
    Prashanth

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

    尊敬的 Prashanth:

    闪存 API 独立于任何 I2C 通信、因此我认为链接器命令文件和工程的存储器分配存在问题。 首先、您在项目中运行的优化级别是什么? 您是否尝试过调整此优化级别并了解它如何影响项目中的功能?

    对于链接器命令文件、您能否重新启动并使用我们 C2000WARE 中预先存在的链接器命令文件之一? 这有助于确保您使用的是已知正常工作的内存设置、如果由此导致任何构建问题、则可以根据需要进行调整。 我认为 device_support 文件夹中应该有一个闪存 API 链接器命令文件、以此为基础

    此致、

    彼得

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

    此外、由于您使用 RTOS 来处理此问题、您能否仔细检查所有任务功能以确保不发生冲突。 尤其是对于任务或任务处理程序? 如果您可以使用性能分析 GPIO 来了解每个任务的执行时间以及每个任务的频率、那么您可以了解这是否可能与 RTOS 设置有关

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

    您好、Peter、

    感谢您的意见。

    我能够解决这个问题。 根本原因是我添加了一个额外的包含路径:

    C:\ti\C2000Ware_5_04_00_00\device_support\f28003x\common\include

    这引入了旧版器件支持标头(如 PIE 和中断定义)、这与我的项目中使用的基于 Driverlib 的实现相冲突。

    删除此包含路径并仅保留 Driverlib 标头后、I2C ISR 开始正常工作。

    似乎将 Driverlib 与旧位字段标头混合会影响中断配置、特别是对于 I2C (PIE 组 8)。

    再次感谢您的指导。

    此致、
    Prashanth