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.

[参考译文] MSP430F5340:MSP 与 BQ27545连接,I2C 超时经常发生/在 MSP 上电后发生

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/854700/msp430f5340-msp-interfaced-with-bq27545-i2c-timeout-happens-frequently-after-msp-powerup

器件型号:MSP430F5340
主题中讨论的其他器件: MSP430WAREMSPWAREBQ27545-G1

你(们)好  

即使我的配置与链接帖子中的配置相同--( Dipin 的帖子)

配置-为 I2C 配置的 MSP430F5340、用于与 BQ27545电量监测计 IC 通信。

问题- I2C 超时定期发生或在 MSP 加电后发生。 突出显示了我卡住的代码部分。

以下是代码:

#define LOOP_COUNT 10000


空 BatteryFuelGuageI2CInit (空)

P4SEL |= 0x06;//将 I2C 引脚分配给 USCI_B1
UCB1CTL1 |= UCSWRST;//启用 SW 复位
UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB1CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB1BR0 = 30;// fSCL = SMCLK/30 =~33.33kHz
UCB1BR1 = 0;


uint16_t BatteryFuelGuageI2CMasterReceive (uint8_t ucSlaveAddress、uint8_t ucCmd、uint8_t ucDataLength)

uint8_t ucRxdata[2]={};
//将从地址设置为0x55
UCB1I2CSA = SlavuceAddress;
//清除 SW 复位,恢复操作
UCB1CTL1 &=~UCSWRST;
//I2C 超时标志
G_I2Ctimeoutflag =真;

uint16_t uloopcount = 0;

对于(uloopcount = 0;uloopcount < loop_count;uloopcount++)

如果((UCB1CTL1 & UCTXSTP)=0)

中断;


if (uloopcount = loop_count)

返回0;

//发送器,发送启动条件
UCB1CTL1 |= UCTR + UCTXSTT;

/*将命令发送到 FuelGuage */
对于(uloopcount = 0;uloopcount < loop_count;uloopcount++)

IF (UCB1IFG 和 UCTXIFG)

中断;


if (g_uloopcount = loop_count)

返回0

//发送 cmd
UCB1TXBUF = ucCmd;
//等待命令被发送
对于(uloopcount = 0;uloopcount < loop_count;uloopcount++)

IF (UCB1IFG 和 UCTXIFG)

中断;


if (g_uloopcount = loop_count)

返回0;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//将主机设置为接收模式,发送启动条件
UCB1CTL1 &=~UCTR;
UCB1CTL1 |= UCTXSTT;//发送重复起始条件
unsigned int uiCounter = 0;
unsigned int uiRxCounter = 2;
while (uiRxCounter >0)

对于(uloopcount = 0;uloopcount < loop_count;uloopcount++)

IF (UCB1IFG 和 UCRXIFG)

中断;


if (uloopcount = loop_count)

返回0;

ucRxdata[uiCounter]= UCB1RXBUF;//从电量监测计接收数据
if (uiCounter = 0)

//发送停止条件。
UCB1CTL1 |= UCTXSTP;

uiCounter++;
uRxCounter--;

UCB1IFG &=~UCRXIFG;
/*清除 USCI_B1 TX int 标志*/
UCB1IFG &=~UCTXIFG;
G_uBatteryInfo =(uint16_t) ucRxdata[0]<< 8 | ucRxdata[1];//逐字节发送接收到的数据

G_I2Ctimeoutflag = false;
返回 g_uBatteryInfo;

需要您的建议来解决此问题。

谢谢

Rekha

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

    您好!

    您是否曾尝试使用我们有关这些主题的应用报告来调试该问题?

    此致

    Peter

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

    尊敬的 Peter:

    我已经浏览过您所附的 pdf 报告。 我一直在就报告中提到的所有这些问题进行这方面的调试。 但在解决这个问题时运气不好。

    我有一个疑问-通过 I2C 完成一个事务所需的时间是多少,例如-如果我发送起始位,我应该等待 ACK 和 GAP 开始下一次通信的时间是多少。

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

    您好、Rekha、

    您看了 MSP430F534x_uscib0_i2c_06.c

    这是我们的代码示例、演示了如何作为主器件传输到从器件。

    您的代码中看到的是例如

    空 BatteryFuelGuageI2CInit (空)

    P4SEL |= 0x06;//将 I2C 引脚分配给 USCI_B1
    UCB1CTL1 |= UCSWRST;//启用 SW 复位
    UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
    UCB1CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
    UCB1BR0 = 30;// fSCL = SMCLK/30 =~33.33kHz
    UCB1BR1 = 0;

    为什么您没有完成此函数中的初始化并设置从器件地址、释放模块的软件复位并设置 TX 中断使能?

    我建议使用我们针对您的波特率和从器件地址进行修改的代码示例进行测试、以检查该示例是否正常工作、而不是从此处获取。

    此致

    Peter

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

    Peter、

    我是否需要在 init 函数中发送从器件地址? 是否为强制性?

    谢谢

    Rekha

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

    我包含了您建议的更改、除了我轮询器件的中断方法之外、我不能在 init 中包含从器件地址、因为我们有两个从器件具有不同的地址、 但问题仍然存在。  

    我还观察到主设备无法生成时钟,下面是从逻辑分析仪获取的图像。

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

    您好、Rekha、

    我建议应用我们的完整初始化序列的原因是、只有这样才能保证模块的正常功能。 I2C 是一个非常复杂的状态机。 我理解您的观点、但从我的角度来看、您尝试执行的操作与我们的代码示例之间有一个明显的区别:

    初始化函数

    空 BatteryFuelGuageI2CInit (空)

    P4SEL |= 0x06;//将 I2C 引脚分配给 USCI_B1
    UCB1CTL1 |= UCSWRST;//启用 SW 复位
    UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
    UCB1CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
    UCB1BR0 = 30;// fSCL = SMCLK/30 =~33.33kHz
    UCB1BR1 = 0;

    我们的函数如下所示

      P3SEL |= 0x03;                           //将 I2C 引脚分配给 USCI_B0

     UCB0CTL1 |= UCSWRST;                     //启用 SW 复位
     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;    // I2C 主器件、同步模式
     UCB0CTL1 = UCSSEL_2 + UCSWRST;           //使用 SMCLK、保持软件复位
     UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
     UCB0BR1 = 0;
     UCB0I2CSA = 0x48;                        //从器件地址为048h
     UCB0CTL1 &=~UCSWRST;                    //清除 SW 复位,恢复运行
     UCB0IE |= UCTXIE;                        //启用 TX 中断

    最后三条标记的线丢失。

    另一个问题是您的硬件设置。 即使没有从器件连接到主器件、主器件引脚上的信号也需要显示从器件到 ACK 点的后续序列。 因此、如果您的主器件、使用我们的代码示例和断开的从器件未显示此情况、那么您的设置肯定会有问题、让它进行软件或硬件设置。 正如我们测试的代码示例所示、在软件侧、它可能只是与您的硬件相关的配置不匹配。

    对我的另两项评论。 请返回并使用我们的代码示例和测试、主器件是否在配置的 I2C 引脚上传输某些数据。 其次、您使用的是逻辑分析仪。 在一切正常的情况下、这是可以的、但只要有线通信、尤其是与关键物理层的通信不起作用、最好使用示波器检查信号、以查看真实的模拟信号。

    此致

    Peter

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

    Peter、

    感谢您的详细解释。 我将再次交叉检查代码和设置。  

    谢谢

    Rekha

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

    您好、Rekha、

    请向我们提供有关此内容的最新信息吗? 您是否成功了?

    此致

    Peter

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

    尊敬的 Peter:

    我已检查此问题、但无法解决此问题。  

    在某个时间点、主器件会在 I2C 主器件接收函数的其中一个 while 环路中挂起。  

    任何来自您的终端的输入都将更有帮助

    谢谢

    Rekha

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

    您好、Rekha、

    我很乐意为您提供支持、但我需要更多信息、并对我的建议采取一致的后续行动。

    您能给我更详细的解释一下以下内容吗:

    我最近的建议是在主器件通信中使用我们的代码示例、建议在主器件不首先从器件的情况下测试主器件、检查您的主器件是否传输到预期应答的信号。

    您是否执行了此测试、结果如何?

    此致

    Peter

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

    尊敬的 Peter:

    我听从了您的意见并测试了:

    -在 init 函数中包含3行(由您突出显示),但仍出现错误

    -将我的代码与您的代码进行比较唯一的区别是,我使用的是轮询,因为我的体系结构不会假定使用任何中断

    -由于从设备嵌入在 PCB 上,我无法断开连接,请建议使用其它选项

    我已经使用您建议的上述修改进行了测试、但仍然看到问题。

    谢谢

    Rekha  

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

    您好、Rekha、

    根据您的总结、我认为我们仍然相互理解不正确。 因此、请让我再次说明一下、我的建议是:

    我了解到、当然、您需要的内容更多、并且希望实现与我们的代码示例不同的实现方式。 但是、要找出您一侧故障的根本原因、我们需要从安全的角度逐步调试它。 在这种情况下、安全点应该是我们经过测试的代码示例。 因此、我建议不要使用代码示例并将其集成到代码中、因为您的代码可能会在其他位置包含错误、并且纯代码示例的粘贴不起作用。

    因此、我建议您将我们提供的经测试代码示例原样、并在您的应用中对其进行测试。

    现在、您可能正在使用另一个 I2C 模块作为代码示例或不同的 IO、因此此时需要修改代码示例。 同样、从器件地址也是如此。

    但目的是尽可能少地更改以适应您的硬件设置、而不是仅测试此代码、更不用说其他了。

    一旦我们完成此工作、我们将开始向您所需的实施添加功能、但要逐步找出问题所在。

    我希望这澄清了我的建议。

    此致

    Peter

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

    尊敬的 Peter:

    我理解您试图告诉我的内容、我可以单独测试您的代码。 您能否为我提供您测试过的代码的链接。

    我 可能有较旧版本的代码。

    谢谢

    Rekha

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

    您好、Rekha、

    与其他示例一样、代码示例是 Code Composer Studio IDE 的一部分、您可以从我们的主页下载该示例。 您可以在集成的 TI Resource Explorer 中找到它们。

    请告诉我、如果您在寻找这些问题时遇到困难。 为了节省时间、请在这里找到从 MSP430Ware - v:3.80.07.00代码示例集导入的项目。 您需要将项目导入到 CCS 环境中、才能使用该项目。

    此致

    Petere2e.ti.com/.../F5340_5F00_I2C.7z

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

    尊敬的 Peter:

    我尝试导入项目文件、但出现以下错误、我还安装了 MSP430v 18.12编译器版本。 仍然无法导入文件。

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

    您好、Rekha、

    您安装了哪个 CCS 版本? 您是否尝试导入了我所附的项目、或者您是否尝试从 MSP430Ware 安装中导入 I2C 代码示例及其代码示例? 我已使用最新的 CCS 版本创建了附加工程、即9.2、因此如果您有较旧的工程、则需要安装最新的工程、或者尝试从您的版本导入代码示例。

    此致

    Peter

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

    Peter、

    感谢您提供这些信息、我有较旧版本的 CCS、即8.3。 我将尝试从 我的 MSPware 示例导入并进行检查。

    我假设 I2C 代码与您的最新代码相比没有变化。

    如果从旧版本到新版本有任何更改、请告诉我。

    将在测试后更新一次。

    谢谢

    Rekha

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

    您好、Rekha、

    代码示例本身没有任何更改。 这只是较新的 IDE 版本、包括编译器更新、这就是您无法导入我的项目的原因。

    此致

    Peter

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

    谢谢你  

    我将在测试后对此进行一次更新。

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

    尊敬的 Peter:

    我已经使用您的示例代码对电路板进行了编程。 以下是我的观察结果:

    使用示例代码 MSP430F534x_uscib0_i2c_06对 MSP 进行编程、其中主器件在 I2C 线路上传输数据。 我@看到 MSP 成功发送数据、但经过一段时间后、它被挂起了 μ s 线  

    我不知道为什么它在该行中挂起、否则代码在初始数据传输中可以正常工作。

    对 MSP 进行编程、以从从器件读取数据。 其中我使用代码从电量监测计(从)读取数据。

    以下是代码(我没有在应用程序中包含任何其他代码)。 仅测试 I2C。

    问题:

    1.主器件发送的从器件地址->未接收到从器件的 ACK,它完全挂起。

    2.主器件发送的从器件地址->接收的 ACK->发送命令到从器件->接收的 ACK->接收的数据字节... 再次接收数据时发生挂起问题

    3.在几次成功的事务之后,主器件将继续等待先前 I2C 事务的完成,即 while (UCB0CTL1 & UCTXSTP);        //确保发送了停止条件

    以上是我提出的几点意见。  

    下面还有分析器的屏幕截图-

    I2C 传输成功

    I2C 事务挂起问题  


    我确实从逻辑分析仪捕获了完整的数据。 如果您需要、我可以发送它以供参考。 因为它是一个巨大的文件、所以我不会附加它。

    请建议可能出现的问题。 这是计时和同步问题吗???

    谢谢

    Rekha

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

    Peter、

    我针对上述错误执行了权变措施:我进行了一些修改,现在 I2C 看起来比较稳定。  

    现在我没有遇到任何错误或挂起问题。 随附的是我的代码:如果您在代码中发现任何错误、请告诉我。

    e2e.ti.com/.../7144.main.c

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

    此代码似乎违反了 tPUCD [参考数据表(SLUSAT0E)第7.3]节。 如果你在1/4秒的时间内讲话、它不会说会发生什么、但"我会忽略你"似乎是一个很好的初步猜测。

    数据表第8.5.1.2节引用了一些对重复率的限制、此代码也违反了这些限制。

    (是的、这些是一些相当重要/异常的限制、但我们必须处理我们拥有的器件。)

    [编辑:我们的帖子似乎正好相吻合。 我听从您的意见、但我仍然建议您牢记记录在案的限制。]

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

    感谢您的反馈、  

    我同意我必须处理这些问题、但我不清楚如何以及在何处在代码流中实施这些问题。

    但我不理解你的第一点。 您说的是、在开始 I2C 通信之前、应该为器件提供250ms 的等待时间吗?

    此外、您能否就您的第二点(即数据表第8.5.1.2节)提供一些更详细的说明

    谢谢

    Rekha

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

    我没有使用过这些器件之一、因此我只知道数据表中的内容。

    我提到的项目似乎确实会妨碍您的工作、尤其是因为它们相当不寻常。 总体而言,设备似乎相当慢--这很好,因为电池监测不需要太多的速度。

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

    谢谢你。 您是否有适用于电池电量监测计的示例代码?

    如果是、您能否分享。

    或者、您能否推荐任何可以提供有关此主题的更多详细信息的人

    谢谢

    Rekha

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

    我没有使用过这个器件、所以没有任何示例代码。

    我在 BQ27545-G1产品页面上看到一些软件。 论坛搜索结果为45次点击。

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

    您好、Rekha、

    您是否仍需要有关此方面的支持?

    此致

    Peter

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

    尊敬的 Peter:

    我通过包括适当的通信延迟和处理 NAK 标志来解决了这个问题。  

    感谢您和您的团队的持续支持。

    谢谢

    Rekha