Tool/software:
Hi ,
I'm working with TPS6594 pmic and Arduino due controller to I2C read function with CRC and without CRC ,
my goal was to check if received CRC and calculated CRC are correct then compare further write next data.
but current with my code i'm receiving CRC (0x3A) while calculated CRC( 0x9F) for data for read with CRC is { 0x90, 0x1, 0x91 , 0x82}.
i have attached snippet of code for read operation with CRC and CRC calculation method.
help me to fix this code.
#include <Wire.h> #define TPS6593_ADDR 0x48 // Default 7-bit I2C address const uint8_t CRC_POLY = 0x07; const uint8_t CRC_INIT = 0xFF; const uint8_t INIT_ADD = 0x01; // Calculate CRC-8 over data array uint8_t calculateCRC(const uint8_t *data, uint8_t len) { uint8_t crc = CRC_INIT; for (uint8_t i = 0; i < len; i++) { crc ^= data[i]; for (uint8_t bit = 0; bit < 8; bit++) { if (crc & 0x80) crc = (crc << 1) ^ 0x07; //crc = (crc << 1) ^ CRC_POLY; else crc <<= 1; } } return crc; } // Read registers with CRC verification bool readRegistersWithCRC(uint8_t startReg, uint8_t *buffer, uint8_t length) { if (length == 0 || buffer == NULL) { Serial.println("Invalid parameters for readRegistersWithCRC"); return false; } // Send start register address + CRC uint8_t addrCRC = calculateCRC(&startReg, 1); Wire.beginTransmission(TPS6593_ADDR); Wire.write(addrCRC); if (Wire.endTransmission(false) != 0) { // repeated start Serial.println("I2C error on address write (with CRC)"); return false; } // Request 2 * length bytes (data + CRC pairs) Wire.beginTransmission(TPS6593_ADDR); Wire.write(startReg); Wire.requestFrom(TPS6593_ADDR, (uint8_t)(length * 2)); const uint8_t i2c_id_w = (TPS6593_ADDR << 1) ; // 7-bit addr + W const uint8_t i2c_id_r = (TPS6593_ADDR << 1) | 1; // 7-bit addr + R const unsigned long timeoutMs = 100; for (uint8_t i = 0; i < length; i++) { unsigned long startTime = millis(); while (Wire.available() < 2) { if (millis() - startTime > timeoutMs) { Serial.println("Timeout waiting for data+CRC (with CRC)"); return false; } delay(1); } uint8_t data = Wire.read(); uint8_t recvCRC = Wire.read(); Serial.print("data at reg 0x"); Serial.println(data, HEX); uint8_t reg = startReg + i; uint8_t crcInput[4] = {i2c_id_w, reg, i2c_id_r, data}; Serial.println(); uint8_t calcCRC = calculateCRC(crcInput, 4); if (recvCRC != calcCRC) { Serial.print("CRC mismatch at reg 0x"); Serial.print(reg, HEX); Serial.print(": received 0x"); Serial.print(recvCRC, HEX); Serial.print(", calculated 0x"); Serial.println(calcCRC, HEX); return false; } buffer[i] = data; } return true; }