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.

BQ30Z554-R1: how to send sub-class commands to manufactureraccess() using i2c

Part Number: BQ30Z554-R1
Other Parts Discussed in Thread: BQ30Z55, BQEVSW

Hello,

I'm trying to comunicate with BQ30Z554 using i2c and 8bit MCU.


I can read registers using following method:
send i2c_start
send device address
send parameter ID to read
send i2c_restart
send device address + read bit
read byte from bq30z55 throught i2c


I'm not able to get manufactureraccess() information, could you explain correct order od i2c commands?

I tryed a lot of possibilityes as:

send i2c_start
send device address
send 0x00 (manufactureraccess())
send i2c_restart
send 0x00 (manufacturerdata())
send 0x00 (manufacturerdata())
send i2c_restart
send device address + read bit
read byte from bq30z55 throught i2c

or:

send i2c_start
send device address
send 0x00 (manufactureraccess())
send 0x00 (manufacturerdata())
send 0x00 (manufacturerdata())
send i2c_restart
send device address + read bit
read byte from bq30z55 throught i2c

but I can't find correct sequence...
I can't find correct sequance in datasheet or others documents.

Could you help me?

Thank you

  • it's all 1 transaction, send device addr, command register and then write data. stop. Then read back response. If you can, sniff the bus when you do the same using bqevsw. That will show you the exact command sequence.
  • Hi Batt, thank you for your support...
    sorry but I have not been able to make it working...

    For example if I want to send unseal 0x0031 to manufactureraccess() I tryed:
    start i2c -device addr. - 0x00 - 0x31 - restart - read to device addr.
    start i2c -device addr. - 0x31 - 0x00 - restart - read to device addr.
    start i2c -device addr. - 0x00 - 0x31 - 0x00 - restart - read to device addr.
    start i2c -device addr. - 0x00 - 0x00 - 0x31 - restart - read to device addr.


    no one is working.. I read only a lot of 0x17 (0x17 is "read to device" command that I sent, 0x16 is my device addr.)
    Could you help me step by step? I havent ev2300, I have only my MCU...

  • Insert a delay of 10-20ms between commands. That means you are hammering the gauge.
  • no luck....

    I try to add delay between all commands, up to 25ms but it's not working.

    I2C is working at 10kHz, I tryed as in previous post:

    start i2c -device addr. - 0x00 - 0x31 - restart - read to device addr.
    start i2c -device addr. - 0x31 - 0x00 - restart - read to device addr.
    start i2c -device addr. - 0x00 - 0x31 - 0x00 - restart - read to device addr.
    start i2c -device addr. - 0x00 - 0x00 - 0x31 - restart - read to device addr.

    adding delay beetween commands.. I read only a lot of 0x17.

    All commands request and reply have "ack" correctly

    I don't know how to do to give it sub-class commands.

    I can give "simply commands". For example I can read cell voltage, or other parameters.

  • You need to write it in 32 byte segments. I'm not sure how I can explain it better here. Unfortunately since I don't have an evm I'm unable to give you manual steps that I can try out myself. Please refer to other posts that instruct you here. You may want to refer to other TRMs like the bq27545 which may help.
  • Hello,

    I tryed a lot but I didn't solve my problem.

    I can read word (for example I can read cell voltages) but

    I can NOT read block (I cant't read PFstatus)

    If I try to send:

    start - address - PFStatus(0x52),    I receive NACK from bq30z55

    Is this correct mode to send block commands?

    My IC is in PF condition (it is fake PF status, I made mistake during wiring). Does this should a problem to read memory blocks?

    Could someone give me sniffed informations about:

    read/write blocks (for example read PFStatus() )

    read/write on manufacturer_access() registers (to send subclass commands, for example send 0x0032 to manufacturer_acces() to have full_access?

    Thank you

  • Please clear the PF and then attempt your read. A block read should not be blocked by a PF.
  • the problem is that I can't reset PF because I'm not able to apply manufactureraccess() or unseal() to use SHA-1 autentication.

    I try to send 0x0031 (unseal) or 0x0032 (full access) but I cant read block for SHA-1 autentication.

    I will try again but Is it possible to have instructions or sniffed logs of a subclass command sent to bq30zxx?

  • you don't need to do a block write to unseal, you can just send the unseal key to 0x0000. If you are using bqevsw, please disable scanning, then write the unseal key bytes back to back, then follow that by sending the full access bytes back to back. That will unseal your gauge and then you can reset the pf.