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.

[参考译文] MSPM0G1507:MSPM0 SDK smbus 库问题和建议

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1355215/mspm0g1507-mspm0-sdk-smbus-library-issue-and-suggestions

器件型号:MSPM0G1507
主题中讨论的其他器件:MSPM0G3507BQ25798BQ4050

尊敬的 TI SDK 合作伙伴:

我有关于您最新 SDK 的几个问题。

1.未记录的问题解决方案

最近、我们将 SDK 升级到了1.30.00.03、发现了回归问题。 如果 I2C 器件未连接、MCU 将触发。

我想我在 1.30.00.03中找到了原因的根本原因、 smbus_phy.c:

Fullscreen
1
2
3
4
case DL_I2C_IIDX_CONTROLLER_NACK:
ret_state = SMBus_NWK_controllerProcessNACK(smbus);
__BKPT(0); /* Placeholder for debugging purposes */
break;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如果未连接调试器、可能__BKPT (0)会锁定 MCU。 这可以解释为什么如果调试器连接到它、我会在我没有放置的位置看到断点停止(实际上、由于我们使用的是库、因此我们只在反汇编中看到断点、没有与其相连的源代码符号链接)

我很高兴看到这个问题在最新的版本中得到了解决  2.00.00.03。但未在 SDK 发布页面中披露。 您能否在以后的 SDK 版本中附加有关该(回归)问题的简要说明?

2.不确定这段代码的目的,是一个 bug 吗?

smb_phy.c:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
SMBus_PHY_controllerStartRx(){
...
while (timeout &&
( (DL_I2C_getControllerStatus(smbus->phy.SMBus_Phy_i2cBase) |
DL_I2C_CONTROLLER_STATUS_BUSY) ==
DL_I2C_CONTROLLER_STATUS_BUSY ) )
{
timeout--;
}
...
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

在我的本能中,是否应该像( get_FLAGS ()& bitfield_mask == bitfield_mask )那样检查  bitfield 来确定是否设置 bitfield_mask ?

但为什么这段代码看起来起作用呢? 是否确实要确保所有其他位字段必须为0? 代码让我感到困惑。
你能解释一下这件事的意图吗?

3. makefile 的建议

此外、我很高兴看到在 2.00.00.03 SDK 中提供了一些构建选项、如下所示。

Fullscreen
1
2
3
4
5
6
7
#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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
但是,我认为如果你能提供更多的外部构建变量注入方法,会更好。 以下是我的建议:
编译 makefile (例如、 mspm0_sdk_2_00_00_03/source/ti/smbus/lib/ticlang/m0p/Makefile)
在 CFLAGS 的开头放置一个像$USER_CFLAGS 这样的占位符
Fullscreen
1
2
3
CFLAGS = $USER_CFLAGS -I$(TICLANG_ARMCOMPILER)/include .......
AFLAGS = $USER_AFLAGS rc
ASMFLAGS = $USER_ASMFLAGS -I$(TICLANG_ARMCOMPILER)/include .....
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
然后、我们可以在 make 系统中调用(或包含)您的 makefile 文件、并通过以下方式设置选项:
Fullscreen
1
2
3
4
5
6
7
8
9
10
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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这种方法使我们能够轻松地在版本中"按原样"维护 SDK 代码、而不是手动更改这些代码。 它可以帮助我们在不同的项目中独立跟踪变化并打开/关闭这些功能。 因为我们希望为所有工程"共享"SDK 文件夹、而不是进行不同修改的多个副本。 这很难维护、并且在更新 SDK 时很容易忘记恢复更改。
BTW、为什么 在构建 smbus 库时要定义-D__MSPM0G3507__? 它是必需的、还是可以将其删除。

目标和控制器共享相同的 init

我看到 smbus 模块引用了外部函数 SYSCFG_DL_SMB_I2C_init ()来初始化底层 I2C 外设。 但是、由于具有命名空间、如果我们在同一项目中同时使用 smbus 主机和目标(是的、我们有两个 I2C 桥臂、我们将设计一个特殊的 I2C smbus 网关)、它无法实现我们的目标。

我建议更改 SMBus_controllerInit ()和 SMBus_targetInit ()函数原型,以允许传递函数指针 void *p ( void )。 然后、在内部实现中、您可以通过这种方式

Fullscreen
1
2
3
4
5
6
SMBus_PHY_targetEnable(){
...
if(smbus->phy.init_fun){
smbus->phy.init_fun();
}
....
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    你好、Tiger、

    1.未记录的问题解决方案

    [/报价]

    错误修复通常包含在 SDK 随附的 MSPM0 SDK 发行说明中。 发行说明中有一条关于删除这些断点的说明。 为了清楚起见、您是否在寻找比这更详细的内容?  

    2.不确定这段代码的目的,是一个 bug 吗?

    [/报价]

    这对我来说也是错的。 我认为在这种情况下、它应该是按位运算而不是"或"运算。 我在内部提交了这方面的错误以获取更新。 我希望它能起作用、因为无论出于超时倒计时的原因、您最终都会退出该循环。  

    3. makefile 的建议

    [/报价]

    我不太熟悉我们的 makefile、但我会将其转发给软件团队以征求他们的意见。  

    目标和控制器共享相同的 init

    [/报价]

    是的、当前这种写入方式假定存在该 SYSCFG 函数以便启用整个外设复位。 在我看来、传递函数似乎是一个更具动态性的解决方案。  

    此致、
    布兰登·费舍尔

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

    只是想跟进第二个问题:

    对于较旧版本的 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