工具/软件:
您好、
我正在使用 TPS6594 PMIC 和 Arduino 由于控制器 I2C 读取功能与 CRC 和没有 CRC ,
我的目标是检查接收到的 CRC 和计算出的 CRC 是否正确、然后比较后续写入下一个数据。
但当前使用我的代码我收到 CRC (0x3A)、而使用 CRC 读取数据的 CRC (0x9F) 计算结果为{ 0x90、0x1、0x91、0x82}。
我附加了使用 CRC 和 CRC 计算方法进行读取操作的代码片段。
帮助我修复此代码。
#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; }