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.

[参考译文] BQ769142:无法使用连接到 TS3引脚的热敏电阻

Guru**** 2511985 points
Other Parts Discussed in Thread: BQ769142, BQ76952

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1044160/bq769142-cannot-use-thermistor-connected-to-ts3-pin

器件型号:BQ769142
主题中讨论的其他器件: BQ76952

你好。

我将 BQ769142用作电池组 BMS、并希望通过连接到 TS1、TS2和 TS3引脚(21、22和23)的三个相同的10K 热敏电阻来监控三个电池组温度、每个引脚都有一个3.3nF 的并联电容。

为此、我最初通过将0b00000111写入数据存储器寄存器0x92FD、0x92FE0x92FF 来配置用于热敏电阻的引脚

根据技术参考、这应该选择18K 上拉电阻、18K 温度模型以及它们用于保护。

我使用 MCU 写入0b00000111设置、在写入存储器设置后、我从存储器读回写入的内容、以进行双重检查。

第一个问题:当从0x92FD 和0x92FE 进行回读时、返回的值为0b00000111、而从0x92FF 回读返回的值为0 (零)

之后、在正常运行中、从 TS1和 TS2读取的热敏电阻返回实际温度(0x14 = 20度)、TS3返回一个奇怪的值(0xFEEF)。

为了消除对错误接线或元件的怀疑、我在另一个相同的电路板和相同的 BQ769142上重复此测试、问题也存在。

看起来是一种常见的行为。

对此问题有什么想法吗?

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

    您好、Alberto、

    如果您从0x92FF 读回零、则寄存器一定不能被正确写入。 您是否在寄存器写入之间添加了足够的延迟时间(我建议2ms)? 是否确定正确计算和写入了校验和和和长度?

    此致、

    Matt

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

    您好 Matt

    感谢你的答复。  

    目前、我已在将校验和和长度(及其 CRC)写入0x60和0x61后添加了1ms。

    我更确切地说、校验和和长度的计算很好、因为我的 MCU 代码始终使用 相同的函数通过 I2C 写入任何存储器数据、而这个0x92FF 是 唯一给我带来问题的地方。 此外、添加的1ms 延迟 对于除0x92FF 之外的任何其他数据存储器写入都很有效。

    但是、我会按照您的建议尝试等待2ms、并告知您。

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

    您好、Alberto、

    我希望这可以解决这个问题。 BQ76952产品文件夹中有一些代码示例、如果您尚未看到这些示例(它们最近更新)、可能会有所帮助: https://www.ti.com/lit/zip/sluc701 、这里有一段视频介绍了代码示例: https://www.youtube.com/watch?v=RfyzTKTLQCM

    此致、

    Matt

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

    您好、Matt

    遗憾的是、在 I2C 写入后添加2ms 延迟无法解决问题。

    我还更改了热敏电阻配置调用的顺序、首先配置 TS3 (以前是 TS1优先)、但配置后、TS3配置仍然只读为0。

    我想我们可以排除 I2C 操作时序。

    现在、由于我在具有2个不同 BQ769142芯片的2个不同电路板上发现了这个问题、我认为还有两种可能性:

    • BQ 奇怪的行为
    • 我的代码

    我在源文件的下面附加了一个片段(对于 PIC16F18446)、其中显示了热敏电阻配置中涉及的代码。 您可能会发现问题。

    请注意    ,对包含在片段中的 writeDataMemory()、computeCRC8()和 computeChecksum ()的调用应该是可以的,因为它们对于在程序中执行的任何其他配置寄存器写入都很有效。

    因此、除非"0x92FF"数字中有错误的内容驱动我的代码、否则它们应该是可以的

    希望您看到的内容比我看到的要多。

    谢谢你

    -Alberto

    [...]
    
    #define REG_CFG_TS1_CONFIG  0x92FD
    #define REG_CFG_TS2_CONFIG  0x92FE
    #define REG_CFG_TS3_CONFIG  0x92FF
    
    [...]
        cfg_byte = 0b00000111;
        setThermistorPinConfig(TS3, cfg_byte);
        _delay(CYCLES_2MS);
        setThermistorPinConfig(TS1, cfg_byte);
        setThermistorPinConfig(TS2, cfg_byte);
    [...]
    
    
    /**
     * Sets the thermistor/Pin Config reg
     * Needs to be in CONFIG_UPDATE mode!
     */
    void setThermistorPinConfig(bq769x2_thermistor_t thermistor, uint8_t cfgval) {
        unsigned int regAddr;
        switch (thermistor)
        {
        case TS1:
            regAddr = REG_CFG_TS1_CONFIG;
            break;
        case TS2:
            regAddr = REG_CFG_TS2_CONFIG;
            break;
        case TS3:
            regAddr = REG_CFG_TS3_CONFIG;
            break;
        case HDQ:
            regAddr = REG_CFG_HDQ_CONFIG;
            break;
        case DCHG:
            regAddr = REG_CFG_DCHG_CONFIG;
            break;
        case DDSG:
            regAddr = REG_CFG_DDSG_CONFIG;
            break;
        default:
            //debugPrintln(F("Invalid thermistor/pin argument!"));
            return;
        }
    
        writeDataMemory(regAddr, cfgval, 1);
    
    }
    
    /**
     * Compute checksum = ~(sum of all uint8_ts)
     */
    uint8_t computeChecksum(uint8_t oldChecksum, uint8_t data) {
        if(!oldChecksum)
            oldChecksum = data;
        else
            oldChecksum = ~(oldChecksum) + data;
        return ~(oldChecksum);
    }
    
    /**
     * Compute the CRC for a given sequence of bytes
     * Byte sequence must be loaded into the global CRC_BYTESEQ array
     */
    uint8_t computeCRC8(uint8_t noOfBytes) {
        uint8_t crc = 0;
        for (uint8_t idx = 0; idx < noOfBytes; idx++) {
            uint8_t i = 0x80;
            for (uint8_t k = 0; k<8; k++) {
                if ((crc & 0x80) != 0) {
                    crc *= 2;
                    crc ^= CRC_KEY;
                } 
                else crc *= 2;
                if ((CRC_BYTESEQ[idx] & i) != 0) crc ^= CRC_KEY;
                i >>= 1;
            }
        }
        return crc;
    }
    
    /**
     * Write 2-bytes data to register data memory of BQ76952
     * Follows Reg Write procedure as described in section 13.1 of Ref Manual
     */
    void writeDataMemory(unsigned int addr, int data, uint8_t noOfBytes) {
        
        uint8_t addLow = lowByte(addr);
        uint8_t addHigh = highByte(addr);
        uint8_t dataLow = lowByte(data);
        uint8_t dataHigh = highByte(data);
        uint8_t chksum = 0;
        chksum = computeChecksum(chksum,addLow);
        chksum = computeChecksum(chksum, addHigh);
        chksum = computeChecksum(chksum, dataLow);
        if (noOfBytes == 2)
          chksum = computeChecksum(chksum, dataHigh);
        uint8_t dataLength = 4 + noOfBytes;
    
        //CRC setup for address transmission
        CRC_BYTESEQ[0] = FULL_BQ_I2C_ADDRESS_WRITE;
        CRC_BYTESEQ[1] = CMD_DIR_SUBCMD_LOW;
        CRC_BYTESEQ[2] = addLow;
        uint8_t crc1 = computeCRC8(3);
        CRC_BYTESEQ[0] = addHigh;
        uint8_t crc2 = computeCRC8(1);
        CRC_BYTESEQ[0] = dataLow;
        uint8_t crc3 = computeCRC8(1);
        CRC_BYTESEQ[0] = dataHigh;
        uint8_t crc4 = computeCRC8(1);
      
        //1-Reg address write in 0x3E 0x3F + data from 0x40    
        uint8_t i=0;
        I2C_TX_BUFFER[i++] = CMD_DIR_SUBCMD_LOW;
        I2C_TX_BUFFER[i++] = addLow;
        if (USE_CRC) I2C_TX_BUFFER[i++] = crc1;
        I2C_TX_BUFFER[i++] = addHigh;
        if (USE_CRC) I2C_TX_BUFFER[i++] = crc2;
        I2C_TX_BUFFER[i++] = dataLow;
        if (USE_CRC) I2C_TX_BUFFER[i++] = crc3;
        if(noOfBytes == 2) {
            I2C_TX_BUFFER[i++] = dataHigh;
            if (USE_CRC) I2C_TX_BUFFER[i++] = crc4;
        }
        I2C1_WriteNBytes(BQ_I2C_ADDRESS, I2C_TX_BUFFER, i);
        
        _delay(CYCLES_2MS);
    
        //CRC setup for checksum transmission
        CRC_BYTESEQ[0] = FULL_BQ_I2C_ADDRESS_WRITE;
        CRC_BYTESEQ[1] = CMD_DIR_CHKSUM;
        CRC_BYTESEQ[2] = chksum;
        crc1 = computeCRC8(3);
        CRC_BYTESEQ[0] = dataLength;
        crc2 = computeCRC8(1);
    
        //2- Checksum & Length in 0x60
        i = 0;
        I2C_TX_BUFFER[i++] = CMD_DIR_CHKSUM;
        I2C_TX_BUFFER[i++] = chksum;
        if (USE_CRC) I2C_TX_BUFFER[i++] = crc1;
        I2C_TX_BUFFER[i++] = dataLength;
        if (USE_CRC) I2C_TX_BUFFER[i++] = crc2;
        I2C1_WriteNBytes(BQ_I2C_ADDRESS, I2C_TX_BUFFER, i);
        
        _delay(CYCLES_2MS);
    }

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

    您好、Matt

    我在边栏中看到了一个与我的问题非常相似的问题:

    https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/966359/bq76952-trouble-writing-to-ts3-config-register

    我敢打赌这是同一个问题。

    校验和是否错误是根本原因?

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

    您好、Matt

    事实证明、问题与另一个 TT 相同。 校验和计算错误。

    您可以关闭 TT。

    谢谢你。

    -Alberto