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.

[参考译文] BQ28Z610:BMS 的驱动程序

Guru**** 2562550 points
Other Parts Discussed in Thread: BQ28Z610, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1083708/bq28z610-driver-for-bms

部件号:BQ28Z610
“线程: BQSTUDIO测试”中讨论的其它部件

你(们)好。

      我正在尝试从 BQ28Z610读取序列号。 我发现 Linux 内核主线驱动程序没有这样的选项。 以便修补。 我使用的是以下内容  

RET = bq27xxx_read (DI,0x4Efalse);

在数据表中,读数格式不被称为块。 所以有点困惑。

——奇怪的野兽

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

    你好,好奇,

    序列号始终为2个字节。 您可以从 bqStudio Advanced Comm 函数中进行尝试,以确认并确定读数与之类似。 字节的解释略有不同。

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

    希里什您好,

                 我正在连接 Linux 驱动程序。   我对读取序列号的方式有点困惑。 数据表显示,我应该使用4E 进行阅读。 但如果我在同一个表中看到其他值(即块),我会有点困惑。

     参考主内核中的 Linux 驱动程序,我是否读过正确的值?

    ——好奇

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

    你好,好奇,

    我认为 Linux 驱动程序的读数不是在写入前。 如果您只是尝试读取0x4E,则这将不起作用。

    执行此操作的一种方法是将块4E00写入地址0x00,然后在地址00处读取。 使用块读取功能并读取4个字节进行测试。 前2个字节可能是命令本身,特别是在使用地址0x3E 而不是0x00时

    这在 TRM 第12.2节0x00,0x01 AltManufacturerAccess()和0x3E,0x3F AltManufacturerAccess()中得到了解释

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

    你好,Shrish,

    静态 int bq27xxx_battery_serialnumber (structt bq27xxx_device_info *di,
            接头 POWER_SUPPLY_PROVAL *评估)
      色调限制=100
      U16 cmd = 0x4E00
      内部支架,try = limit;

      RET = bq27xxx_write(di, BQ27XXX_REG_CTR, CMD,false );
      如果(转塔< 0)
       返回支架;

      执行{
       BQ27XXX_MSLEEP (25);
       RET = bq27xxx_read (DI,BQ27XXX_REG_CTRL,FALSE);
       dev_warn(d->dev“ret %d\n", ret);
       如果(转塔< 0)
         返回支架;
      }同时(-尝试);

      如果(限制-请尝试> 3)
       dev_warn(d-->dev“重试%d\n",限制-尝试”;

      返回0

    }
    我正以这种方式尝试。 基于您的观点。 但我没有得到正确的结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,好奇,

    我没有查看过 Linux 代码,但我建议尝试使用 cmd=0x004E (反向了 Endiemaless)

    如果要添加重试循环,则它还应包括 write 命令。

    如果上述方法不起作用,则为了进行调试,请尝试使用命令 cmd=0x00,该命令应返回0x2610

    发布读取结果,有时这会提供线索。

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

    嗨,Shrish,

    静态 int bq27xxx_battery_serialnumber (structt bq27xxx_device_info *di,
            接头 POWER_SUPPLY_PROVAL *评估)
      色调限制=10
      U16 cmd = 0x0000
      内部支架,try = limit;

      执行{
       RET = bq27xxx_write(di, BQ27XXX_REG_CTR, CMD,false );
       如果(转塔< 0)
         返回支架;

       BQ27XXX_MSLEEP (1);
       RET = bq27xxx_read (DI,BQ27XXX_REG_CTRL,FALSE);
       dev_warn(d->dev“ret %d\n", ret);
       如果(转塔< 0)
         返回支架;
      }同时(-尝试);

      如果(限制-请尝试> 3)
       dev_warn(d-->dev“重试%d\n",限制-尝试”;

      返回0

    }
    使用以下代码,我收到的结果是  
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-battery 1-0055:重试10
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉,有打字错误。

    尝试使用 cmd = 0x0001和 cmd = 0x0100并发布这两个结果。

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

    你好,斯利什,

    静态 int bq27xxx_battery_serialnumber (structt bq27xxx_device_info *di,
            接头 POWER_SUPPLY_PROVAL *评估)
       int limit=10
      U16 cmd = 0x0001
      内部支架,try = limit;

      执行{
       RET = bq27xxx_write(di, BQ27XXX_REG_CTR, CMD,false );
       如果(转塔< 0)
         返回支架;

       BQ27XXX_MSLEEP (1);
       RET = bq27xxx_read (DI,BQ27XXX_REG_CTRL,FALSE);
       dev_warn(d->dev“ret %d\n", ret);
       如果(转塔< 0)
         返回支架;
      }同时(-尝试);

      如果(限制-请尝试> 3)
       dev_warn(d-->dev“重试%d\n",限制-尝试”;

      返回0
    }
     
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-电池1-0055:RET 65445
    bq27xxx-battery 1-0055:重试10
    XT▒
    使用时,cmd = 0x100
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    bq27xxx-电池1-0055:RET 25091
    今天 我尝试了另一种方法。
    BQ27XXX_SERIAL_NUMBER = 0x4E  
    BQ27XXX_REG_SERIAL = 0
    静态 int bq27xxx_battery_serialnumber (structt bq27xxx_device_info *di,
            接头 POWER_SUPPLY_PROVAL *评估)
      共色调限制=10;
      U16 cmd = BQ27XXX_SERIAL_NUMBER;
      内部支架,try = limit;
      字符串序列号[4];

      请执行{
       RET = bq27xxx_write(di, BQ27XXX_REG_SERIAL,cmd,false );
       如果(转塔< 0)
         返回支架;

       BQ27XXX_MSLEEP (1);
       RET = bq27xxx_read (DI,BQ27XXX_REG_SERIAL,FALSE);
       如果(转塔< 0)
         返回支架;
      }同时(-尝试);
      scnprintf (di->serial_number,4,“%d”,(U16) ret);
      val->strval = di->serial_number;

      返回0;
    }
    这是我在实验中使用的驱动程序。
    root@petalinux_Delhi:~# cat /sys/class/power _fsupply/bq28z610-0/serial_number
    78
    请告诉我我在哪条道路上走得对吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,您在第一条=0x0001的正确路径上,然后您应该能够读取序列号。

    请注意,65545 = 0xFFA5

    现在使用 cmd=0x004E 尝试。 这将提供您在数据闪存中编程的序列号。

    如果未获得预期结果,请将 ret = bq27xxx_read (DI,BQ27XXXX_REG_CTRL,false)替换为  

    RET = bq27xxx_read (DI,0x40,false);或 ret = bq27xxx_read (DI,0x3E,false);其中之一应给出正确的结果。

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

    您好,Shirish,

             感谢您的回复。 我们的硬件工程师将使用 Bq 工作室对其进行测试。 我将测试我的实施情况,并更新我的结果。

    库鲁阿斯贝斯特

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

    您好,Shirish,

              以下是我的结果。  

    静态 int bq27xxx_battery_serialnumber (structt bq27xxx_device_info *di,
            接头 POWER_SUPPLY_PROVAL *评估)
      色调限制= 5
      U16 cmd = BQ27XXX_SERIAL_NUMBER;
      内部支架,try = limit;
      字符数据[6]
      u32序列号;

      执行{
       RET = bq27xxx_write(di, BQ27XXX_REG_SERIAL,cmd,false );
       如果(转塔< 0)
         返回支架;

       BQ27XXX_MSLEEP (1);
       RET = bq27xxx_read_block(di, BQ27XXX_REG_SERIAL,数据,sizeof(data)/sizeof(data[0]));
       如果(转塔< 0)
         返回支架;
      }同时(-尝试);

      SerialNumber |=数据[5]<24;
      SerialNumber |=数据[4]<16;
      SerialNumber |=数据[3]<8;
      SerialNumber =数据[2]

      Sprintf (di->serial_number"%04x",序列号);
      val->strval = di->serial_number
      返回0
    }
    此外,我还使用 i2cl 工具 检查相同的情况

    i2ctransfer -f -y 1 W3@0x55 0x3E 0x4E 0x00 & i2ctransfer -f -y 1 W1@0x55 0x3E R4

    除此之外,我还得到了 bqstudio 并对设备进行了交叉验证。  

    感谢您的帮助和指导。