Other Parts Discussed in Thread: TMS320F280037C, C2000WARE
器件型号: 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