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.
尊敬的 TI SDK 合作伙伴:
我有关于您最新 SDK 的几个问题。
最近、我们将 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 版本中附加有关该(回归)问题的简要说明?
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? 代码让我感到困惑。
你能解释一下这件事的意图吗?
此外、我很高兴看到在 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
我看到 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(); } ....
你好、Tiger、
1.未记录的问题解决方案
[/报价]错误修复通常包含在 SDK 随附的 MSPM0 SDK 发行说明中。 发行说明中有一条关于删除这些断点的说明。 为了清楚起见、您是否在寻找比这更详细的内容?
[/quote][/quote][/quote]2.不确定这段代码的目的,是一个 bug 吗?
[/报价]这对我来说也是错的。 我认为在这种情况下、它应该是按位运算而不是"或"运算。 我在内部提交了这方面的错误以获取更新。 我希望它能起作用、因为无论出于超时倒计时的原因、您最终都会退出该循环。
[/quote][/quote]3. makefile 的建议
[/报价]我不太熟悉我们的 makefile、但我会将其转发给软件团队以征求他们的意见。
[/quote]目标和控制器共享相同的 init
[/报价]是的、当前这种写入方式假定存在该 SYSCFG 函数以便启用整个外设复位。 在我看来、传递函数似乎是一个更具动态性的解决方案。
此致、
布兰登·费舍尔
只是想跟进第二个问题:
对于较旧版本的 SDK、它没有超时。 但仍然成功。 这就是为什么对我来说很奇怪。 您能否进一步检查某些位是否确实链接在一起或实现了类似的功能?
虎、
对于较旧版本的 SDK,它没有超时。 但仍然成功
当您说成功时、意味着您最终将退出这个循环、对吧? 执行交易时、您的停止设置是什么? 我怀疑,如果没有停止(即重复开始),你可能有问题,因为 Busby 标志不会被清除,所以你可能会被困在那里。 通过停止、BUSBSY 应该清除、因此只要你没有错误、你应该断开环路。
您能否进一步检查某些位是否实际链接在一起或实现类似的功能?
我不确定我是否理解您的意思。 您是否会问、是否有另一种更好的方法来编写此等待陈述? 或者想了解有关 I2C 状态机中忙/空闲标志及其来源的一些详细信息?
此致、
布兰登·费舍尔
尊敬的 Brandon:
是的、我们的程序 在1.2.0.5上没有遇到问题。 只有几个芯片请求明确的停止条件、而我无法绕过(启动、写入、停止、启动、读取、 STOP)、对于 bq4050和 bq25798、该库适用于我。 BTW、我没有使用您的 smbus.c 的 API、而是模仿您的 API、并基于 smbus_NWK 创建了我们自己的 API。 但我认为我们的解决方案实际上不会绕过这个问题。
第二、我的意思是、如果 i2c->master.MSR 所有其他位最终都为0、该怎么办? 由于您| I2C_MSR_BUSY_MASK、因此该位实际上无关紧要。
仅: 0 | I2C_MSR_BUSY_MASK == I2C_MSR_BUSY_MASK
或 I2C_MSR_BUSY_MASK | I2C_MSR_BUSY_MASK = I2C_MSR_BUSY_MASK