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.

[参考译文] BQ27Z746:如何在 BQ27Z746中写入闪存

Guru**** 2540720 points
Other Parts Discussed in Thread: BQ27Z746, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1123274/bq27z746-how-to-write-to-flash-in-the-bq27z746

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

我需要更新 BQ27Z746闪存中的一些值。  (在这种情况下、使用 BQSTUDIO 不是一个选项。) 我注意到 BQ27Z746技术参考手册中的以下陈述:

由于数据闪存的组织结构、更新需要写入由多个数据字节组成的数据块中。 例如、更新 Ra 表需要擦除数据闪存的单页并对更新的 Ra 表进行编程。 潜在的 I2C 时钟拉伸时间最大为40.8ms。 µs 40ms 页擦除和40 μ s 行编程时间(×2行)。

但是、没有关于页面大小的信息、也没有关于如何擦除页面的信息(如果需要)。   

我已经确定可以使用以下代码片段从闪存中读取多个字节。  简而言之,我在0x3E (AltManufacturerAccess())写入两字节地址,然后读回 N 字节数据以访问 MACAccess:

def cc_print_flash_test(bus):
    block = cc_read_manufacturers_access(0x4020, 6, bus)
    b1 = block[0] + (block[1] << 8)
    b2 = block[2] + (block[3] << 8)
    b3 = block[4] + (block[5] << 8)
    print("flash test: {}, {}, {}".format(b1, b2, b3))

def cc_read_manufacturers_access(addr, nbytes, bus):
    bus.write_i2c_block_data(BQ27Z746, 0x3e, [addr & 0xff, addr >> 8])
    # returned value is [addr_lo, addr_hi, data_0, data_1 ...]
    block = bus.read_i2c_block_data(BQ27Z746, 0x3e, nbytes + 2)
    return block[2:]  # strip addr_lo addr_hi from response

该代码显示"FLASH test:4525、2300、140"、这是 OVP、UVP 和 OCC 的默认值、因此我认为这是从闪存读取数据的正确方法。

但鉴于"更新需要写入包含多个数据字节的数据块"的要求、我犹豫是否尝试写入、因为我看不到任何有关块大小的已发布信息、 因此、我不知道我需要读取/修改/写入多少字节。

欢迎提供指导!

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

    更新了:我在第15.2.63节"数据闪存访问() 0x4000-0x5FFF"中找到了以下内容:

    只有 AltManufacturerAccess()通过寻址物理地址来支持访问数据闪存(DF)。
    要写入 DF、请发送起始地址、后跟 DF 数据块。 DF 数据块是目标数据块
    修订了待更新的 DF 数据。 DF 数据块的大小范围为1字节到32字节。 所有单个数据
    必须以小端字节序发送。

    但是、以下代码被剪贴后未更新闪存值:

    def cc_read_manufacturers_access(addr, nbytes, bus):
        bus.write_i2c_block_data(BQ27Z746, 0x3e, [addr & 0xff, addr >> 8])
        # returned value is [addr_lo, addr_hi, data_0, data_1 ...]
        block = bus.read_i2c_block_data(BQ27Z746, 0x3e, nbytes + 2)
        return block[2:]  # strip addr_lo addr_hi from response
    
    def cc_write_manufacturers_access(addr, bytes, bus):
        # write data as two byte addr (little endian) followed by data.
        block = [addr & 0xff, addr >> 8] + bytes
        bus.write_i2c_block_data(BQ27Z746, 0x3e, block)
    
    ...
        block = cc_read_manufacturers_access(0x46b1, 1, bus)
        print("temperature_enable before = {}".format(block))
        block[0] = 1  # modify temperature enable to 1
        cc_write_manufacturers_access(0x46b1, block, bus)
        block = cc_read_manufacturers_access(0x46b1, 1, bus)
        print("temperature_enable after = {}".format(block))
    

    生成以下结果:TEMP_ENABLE 值 从2开始、但未根据需要修改为1:

    temperature_enable before = [2]
    temperature_enable after = [2]
    

    更新了:我已验证运行状态报告 SEC ="完全访问"、因此闪存应该是可写的。

    欢迎您提出建议!

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

    您好、Robert、

    我随附了一些幻灯片、其中更详细地介绍了如何成功地写入闪存监测计。 除了写入 TRM 的数据闪存部分中的内容、您还必须将校验和写入地址60以使写入操作实际有效。 我们正在努力更新 TRM 以包含此信息、以避免将来出现进一步的混淆。

    e2e.ti.com/.../writing-to-dataflash.pptx

    谢谢、

    杰克逊

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

    您还必须将校验和写入地址60以使写入操作实际有效。  

    啊!  这就说明了这一点(并且很有意义)。   

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

    是的! 对 TRM 中有关此主题的指示不明确表示歉意。

    请告诉我这是否能够为您服务。

    谢谢、

    杰克逊