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.

[参考译文] TPS6594-Q1:TPS6594EVK

Guru**** 2374090 points
Other Parts Discussed in Thread: TPS6594-Q1
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1533977/tps6594-q1-tps6594evk

器件型号:TPS6594-Q1

工具/软件:

您好、

我正在使用 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;
}

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

    您好 Suhas、

    请检查随附的文档以测试您的代码。 这些是带有 CRC 的写入/读取示例。  

    需要注意的一点是、读取过程中必须使用重复启动条件。

    顺便说一下、您是否首先启用了 CRC?   如果您正在读取寄存器 0x1 数据、可能是通过执行{0x90、0x1、0x91、0x82}来接收下一个寄存器数据。

    您尝试连接哪个 OPN TPS6594-Q1?   

    BR, Jari

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

    尊敬的 Jari:

    OPN : TPS6594133ARWERQ ,

    我无法找到测试代码,可以重新共享它。

    不确定但它已启用、以确认如何读取 I2C1_CRC_EN

    I2C 目标器件(即 TPS6594-Q1)提供 T_CRC[7:0]、该值根据 I2C_ID、W、ADDR、I2C_ID、R 计算得出 和 RDATA 位(32 位)。  根据图 8.62(数据表)

    作为设备 ID : 0x48 ,以上数据可以表示为{i2c_id_w, reg, i2c_id_r, data} ={ 0x90, 0x1, 0x91 , 0x82}

    此致、

    Suhas

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

    您好 Suhas、

    在尝试 CRC 通信之前、您是否在 ACTIVE 或 MCU_ONLY 模式下将 I2C2_TRIGGER 写入高电平?  

    执行上述操作后、您可以通过读取寄存器 0x11a 来检查 I2C1 和 I2C2 CRC 是否激活。 这位于地址 I2C1 0x49 中。 如果寄存器值为 0x06、则启用 CRC。

    再次附加文件。 没有代码、但会介绍如何确认正确的 CRC 数据。

    /cfs-file/__key/communityserver-discussions-components-files/196/I2C_5F00_CRC_5F00_enabled_5F00_examples.docx

    BR, Jari

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

    尊敬的 Jari:

    我捕获了 I2C 1 和 2 的日志、但没有看到此地址 0x11a、当前我的 i2c1 地址为 0x48、I2c2 地址为 0x12。 (根据默认 NVM 配置)
    以下是从以下地址接收的帧: 写入 0x12 确认数据:0x05 0x0C
     我期望这是 CRC 设置。

    我观察到的另一件事: 这是否意味着在 NVM 中默认情况下,CRC 已启用?

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

    您好 Suhas、

    要访问寄存器 0x11a、您需要使用 I2C1 地址 0x49。 因此、它是地址 0x49 下的寄存器 0x1a。

    要启用通信 CRC、您将写入以下位。

    REG_CRC_EN 与通信 CRC 不同。 该寄存器 CRC 仅保护寄存器数据免受位翻转的影响。

    BR, Jari

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

    尊敬的 Jari:
    我去读取这些寄存器并找到这些作为响应
    因为我从 0x19 开始从地址 0x49 读取 5 个寄存器  

    写入 0x49 确认数据:0x19
    读取到 0x49 确认数据:0x80 0x00 0x0B 0x16 0x88   

    基于 0x1A 数据是 0x00 这意味着它的 CRC 被禁用。

    还有一个疑问是 0x3A TCRC 吗? 参考
    作为设备 ID : 0x48 ,以上数据可以表示为{i2c_id_w, reg, i2c_id_r, data} ={ 0x90, 0x1, 0x91 , 0x82}

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

    您好 Suhas、

    是、这意味着未启用通信 CRC。  

    您是否先将 0x1 写入 TRIGGER_I2C_2?  

    根据示波器屏幕截图、您只是在接收下一个寄存器数据。

    BR, Jari

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

    感谢 Jari、

    为了进一步帮助我将检查其他事情.