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.

[参考译文] BQ78350:无法在 BMS 和 Arduino Uno 板之间建立连接

Guru**** 2452360 points
Other Parts Discussed in Thread: BQSTUDIO, BQ78350

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/669124/bq78350-failed-to-estabilish-connection-between-bms-and-arduino-uno-board

器件型号:BQ78350
主题中讨论的其他器件:BQSTUDIO

大家好、  

我已经使用此 BMS 两个月了、但我甚至无法连接 BMS 系统和任何 MCU。 我之前尝试使用 STM32F407板建立通信、但没有任何结果。 我使用函数 HAL_isDeviceReady()来检查 BMS 的地址(根据数据表应该是0x16/0x17),但电路板无法识别任何地址。

我放弃了这一点、并开始使用 Arduino Uno 板、认为它会更容易。 我弄错了。 我仍然有同样的问题。 我创建了一个代码来检查电路板是否看到任何从器件地址连接到128个可能的地址中的任何一个、但电路板无法识别任何内容。 实际上、只要我连接 BMS 数据线、串行端口就会冻结、只打印几个字符。 下面显示了我使用的 Arduino 代码。

有人能帮忙吗!!

P.S. 我必须指出,我编写的 HAL_isDeviceReady()和 Arduino 代码都可以与我测试过的任何其他 I2C 设备配合使用。

#include
//#include
//#ifdefined (Arduino)&& Arduino >= 100

//#include "Arduino .h"
/*
#define printIIC (args) Wire.write (args)
内联 size_t CheckAddress:::写入(uint8_t 值){
SEND (值、Rs);
返回1;
}*/
 
void setup()
{  
 Serial.begin(2000000);
 Wire.begin();
 
 
 serial.println ("\nI2C 扫描仪");
 //while (!Serial);            // Leonardo:等待串行监视器
 //delay (1000);

 
 
void loop()

 字节错误、地址;
 Int nDevices;
 
 serial.println ("正在扫描...");
 
 nDevices = 0;
 for (address = 0;address < 127;address++)
 {
   serial.print ("Scanninng address");
   serial.println (地址);
   // i2c_scanner 使用的返回值
   // Write.endTransition 以查看是否
   //器件确实确认了地址。
   Wire.beginTransmission(address);
   错误= Wire.endTransmission ();
 
   如果(错误=0)
   {
     serial.print ("I2C 器件位于地址0x");
     if (地址<16)
       serial.print ("0");
     serial.print (address、hex);
     serial.println("!") ;
 
     nDevices++;
   }
   否则(error=4)
   {
     serial.print ("地址0x处 的未知错误");
     if (地址<16)
       serial.print ("0");
     serial.println (地址、十六进制);
   }    
 }
 如果(nDevices = 0)
   serial.println ("未找到 I2C 设备\n");
 其他
   serial.println ("done");
 
 延迟(5000);         //等待5秒钟以进行下一次扫描

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

    尊敬的 Gianmarco:

    我可以看到这是一个非常令人沮丧的情况。

    请参阅应用报告 SMBus Made Simple、这可能会有所帮助。  请记住地址0x16/0x17是总线上的地址。  当进入您的工具时、您可能需要使用7位地址0x0B、并使用单独的读取/写入。  

    在您的代码上、我不是 Arduino 或 STM 程序员。  您是否查看过 Arduino 论坛或示例?  串行端口锁定可能需要参考端口提供商的文档。

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

    [引用 user="WM5295"] 当输入您的工具时 y[/quot]

    WM5295您好、感谢您的回复。

    "输入您的工具"到底意味着什么?

    按照我已经使用7位地址的方式,我会根据我需要读取还是写入来更改它(例如 readfunction (address|1))。

    我还使用了在线提供的示例(其中有很多)、但没有一个示例可用。 我开始相信这是一个硬件问题。 即使 BMS 在通过 EV2300使用 bqStudio 时也能正常工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Gianmarco:
    我是说您的工具是使用具有读/写独立的7位地址还是8位地址。 它听起来像是您使用的7位。
    如果 bqStudio 将与监测计通信、它听起来像是监测计工作正常。 希望您能找到 MCU 问题。
    您应该能够在总线上放置一个示波器、并在 bqStudio 读取后看到监测计 ACK EV2300通信、然后比较 MCU 的结果。 时钟速度当然会有所不同、但消息结构应该相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、WM5295、

    再次感谢您的回复。 我正在尝试找出 MCU 的错误、找到了一个文档、其中解释了 SMBus 最常见的问题。 它包括10个可能的问题,但我排除了其中的大部分问题,并将其缩小到 :

    2.时钟高电平时间:这是一个更常见的被忽略的问题。 在 µs 数据包中间、时钟必须保持高电平少于50 μ s。 此规则无例外。 µs 时钟处于高电平的时间超过50 μ s、则从器件上的 SMBus 引擎最有可能超时。

    3.通信速度太快:这在使用 μ I²C 硬件引擎执行 SMBus 通信时很常见。 SMBus 引擎仅指定为100kHz。 通信速度超过此值会导致违反时序最小规则。

    4.广播或其他冲突:在大多数 TI 高级电量监测计解决方案中、默认情况下会禁用从属广播(有时称为主模式消息)。 近年来,这一问题已大大减少。 由于大多数主机或充电器不接受广播消息、因此最好在不使用广播消息时将其禁用。

    其中的任何一项都可能成为问题吗? 如果是、如何检查它是否是、最重要的是如何解决它?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Gianmarco:
    对于#4、我预计广播将关闭。 我没有打开它、也没有看到来自 bq78350的广播。 除非您已将其打开、否则它可能会关闭。
    对于#2和#3、您需要使用示波器查看总线。 将时序与您注意到的值和数据表进行比较、并将结构与之前文章中链接的 SMBus Made Simple apnote 进行比较。 您的示波器可能能够解码总线事务、以便您更深入地了解活动。
    我不知道我们之前有具体说明、但请确保 bq78350 VCC 已通电(~ 2.5V)、并且可以与 bq769x0监控器通信。 监护仪的值对于 bq78350的运行至关重要、如果它找不到监护仪、它将花费大部分时间来尝试找到它。 在这种情况下、SMBus 通信将是间歇性的。