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.

BQ79600-Q1: CRC calculation

Part Number: BQ79600-Q1

Hello Team,

My customer is trying to piece together 16 bit crc function for sending and receiving frames over SPI interface to/fro from BQ79600, referring the datasheet for the part, I see a section that goes over this info but there seems to be some contradiction in what is specified. The document starts with stating the polynomial as 0x8005 but while illustration specifies the polynomial as 0xC002. What is the actual implementation here. Can you point me to an example source calculating the CRC that I can use?

Regards,

Renan

  • Hi Renan,

    Please see below a CRC calculation example code in C++.

    In the SpiCRC16 function, pBuf is a pointer to an array containing the input data, while nLen is number of bytes.

    Regards,

    Viktor.

    // CRC16 TABLE
    // ITU_T polynomial: x^16 + x^15 + x^2 + 1
    const uint16 crc16_table[256] = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301,
            0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1,
            0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81,
            0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
            0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00,
            0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1,
            0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380,
            0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141,
            0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501,
            0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0,
            0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881,
            0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
            0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401,
            0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1,
            0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180,
            0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740,
            0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01,
            0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1,
            0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80,
            0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
            0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200,
            0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1,
            0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780,
            0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41,
            0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901,
            0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1,
            0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80,
            0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
            0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 };

    uint32 SpiCRC16(uint16 *pBuf, int nLen)
    {
        uint32 wCRC = 0xFFFF;
        int i;

        for (i = 0; i < nLen; i++) {
            wCRC ^= (uint16)(*pBuf++) & 0x00FF;
            wCRC = crc16_table[wCRC & 0x00FF] ^ (wCRC >> 8);
        }

        return wCRC;
    }

  • Hello Viktor,

    Good day.

    Thank you for this! Can you please send me some example payload with corresponding CRCs calculated for me to verify the implementation? Also just confirming, you did send the crc16 implementation for DC79600 bridge device right?

    Regards,

    Renan

  • Hi Renan,

    All of our BQ796xx family of devices use the same CRC implementation.

    See some examples below. The last 2-bytes are the CRC.

    90000309201395            // Wake DUT
    D703430000000000000000616F    // Dummy DLL Write
    D00309010F74            // Enable Auto-Address
    D0030600CB44            // DUT Load Box - Address 0
    D00306010A84            // DUT - Address 1
    9001030801D3E1            // DUT - Set Top Stack
    C00500002C25            // Broadcast Read Device ID

    Regards,

    Viktor.