主题中讨论的其他器件:MSPM0G3507、 BQ25798、 BQ4050
尊敬的 TI SDK 合作伙伴:
我有关于您最新 SDK 的几个问题。
1.未记录的问题解决方案
最近、我们将 SDK 升级到了1.30.00.03、发现了回归问题。 如果 I2C 器件未连接、MCU 将触发。
我想我在 1.30.00.03中找到了原因的根本原因、 smbus_phy.c:
case DL_I2C_IIDX_CONTROLLER_NACK:
ret_state = SMBus_NWK_controllerProcessNACK(smbus);
__BKPT(0); /* Placeholder for debugging purposes */
break;
如果未连接调试器、可能__BKPT (0)会锁定 MCU。 这可以解释为什么如果调试器连接到它、我会在我没有放置的位置看到断点停止(实际上、由于我们使用的是库、因此我们只在反汇编中看到断点、没有与其相连的源代码符号链接)
我很高兴看到这个问题在最新的版本中得到了解决 2.00.00.03。但未在 SDK 发布页面中披露。 您能否在以后的 SDK 版本中附加有关该(回归)问题的简要说明?
2.不确定这段代码的目的,是一个 bug 吗?
smb_phy.c:
SMBus_PHY_controllerStartRx(){
...
while (timeout &&
( (DL_I2C_getControllerStatus(smbus->phy.SMBus_Phy_i2cBase) |
DL_I2C_CONTROLLER_STATUS_BUSY) ==
DL_I2C_CONTROLLER_STATUS_BUSY ) )
{
timeout--;
}
...
}
在我的本能中,是否应该像( get_FLAGS ()& bitfield_mask == bitfield_mask )那样检查 bitfield 来确定是否设置 bitfield_mask ?
但为什么这段代码看起来起作用呢? 是否确实要确保所有其他位字段必须为0? 代码让我感到困惑。
你能解释一下这件事的意图吗?
3. makefile 的建议
此外、我很高兴看到在 2.00.00.03 SDK 中提供了一些构建选项、如下所示。
#ifndef SMB_TARGET_SUPPORTS_HOST_NOTIFY #define SMB_TARGET_SUPPORTS_HOST_NOTIFY (true) #endif ... #ifndef SMB_CONTROLLER_SUPPORTS_HOST_NOTIFY #define SMB_CONTROLLER_SUPPORTS_HOST_NOTIFY (true) #endif
CFLAGS = $USER_CFLAGS -I$(TICLANG_ARMCOMPILER)/include ....... AFLAGS = $USER_AFLAGS rc ASMFLAGS = $USER_ASMFLAGS -I$(TICLANG_ARMCOMPILER)/include .....
SDK_INSTALL_DIR ?= $(MSPM0_SDK_DIR) TICLANG_ARMCOMPILER ?= $(TI_TOOL_DIR) GCC_ARMCOMPILER ?= $(GCC_TOOL_DIR) override NAME=$(SDK_LOCAL_BUILD_SMBUS_DIR)/smbus override OBJ_DIR=$(SDK_LOCAL_BUILD_SMBUS_DIR)/obj override SRC_DIR=$(SDK_INSTALL_DIR)/source/ti/smbus USER_CFLAGS = -DSMB_TARGET_SUPPORTS_HOST_NOTIFY=false -DSMB_CONTROLLER_SUPPORTS_HOST_NOTIFY=false include $(SRC_DIR)/lib/ticlang/m0p/Makefile
目标和控制器共享相同的 init
我看到 smbus 模块引用了外部函数 SYSCFG_DL_SMB_I2C_init ()来初始化底层 I2C 外设。 但是、由于具有命名空间、如果我们在同一项目中同时使用 smbus 主机和目标(是的、我们有两个 I2C 桥臂、我们将设计一个特殊的 I2C smbus 网关)、它无法实现我们的目标。
我建议更改 SMBus_controllerInit ()和 SMBus_targetInit ()函数原型,以允许传递函数指针 void *p ( void )。 然后、在内部实现中、您可以通过这种方式
SMBus_PHY_targetEnable(){
...
if(smbus->phy.init_fun){
smbus->phy.init_fun();
}
....