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.

[参考译文] MCT8316A:通过 i2c 与 Arduino 通信

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1420744/mct8316a-communicate-via-i2c-with-arduino

器件型号:MCT8316A

工具与软件:

您好-我正在尝试通过我的 Arduino 上的 i2c 与 MCT8316A 通信、但无法正常工作。 我正在使用数据表(https://download.mikroe.com/documents/datasheets/MCT8316A_datasheet.pdf)中的一个示例、以及我在网上找到的部分代码、但运气差。 下面的代码以及引用数据表的器件添加了注释、以便您了解位值为什么是什么值。

#include <Wire.h>

const int deviceAddress = 0x00;

void setup() {
  int error, n;
  
  Wire.begin();
  Wire.setClock(50000);      // 50kHz, half the normal speed

  Serial.begin(115200);
  while(!Serial);
  Serial.println("Starting");

  // ------------------------------------------------
  // Write data to a register
  // ------------------------------------------------
  const byte control_word1[] = {0x00, 0x50, 0x00, 0x80}; // <--- using example from pg 87 of data sheet
  const byte data1[] = {0xCD, 0xAB, 0x34, 0x12};   // <-- same example as above from data sheet

  Wire.beginTransmission(deviceAddress);
  Wire.write(control_word1, 4);
  Wire.write(data1, 4);
  error = Wire.endTransmission();
  if(error == 0)
  {
    Serial.println("Data succesfully sent");
  }
  else
  {
    Serial.println("Data not sent");
  }
  delay(500);               // are delays needed?

  // ------------------------------------------------
  // Read data from a register
  // ------------------------------------------------
  const byte control_word2[] = {0x00, 0xD0, 0x00, 0x80};  // <--- reading based on example from page 88
  Wire.beginTransmission(deviceAddress);
  Wire.write(control_word2, 4);
  error = Wire.endTransmission(false);  
  if(error == 0)
  {
    Serial.println("Register succesfully selected");
  }
  delay(500);               // are delays needed?

  n = Wire.requestFrom(deviceAddress, 8);
  Serial.println(n);
  if(n == 4)
  {
    Serial.println("Data received");
    for( int i=0; i<4; i++)
    {
      Serial.print("0x");
      Serial.print(Wire.read(), HEX);
      Serial.print(", ");
    }
    Serial.println();
  }
  delay(500);               // are delays needed?
}

我得到的输出为:

启动
未发送数据
已成功选择寄存器
0 

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

    尊敬的 Rami:

    1. 您能否测量 DVDD 和 AVDD 的电压以确保分别为3.3V 和1.5V? 如果它们不是、则 MCT8316A 不能正确加电。
    2. 我看到代码中存在延迟、您知道延迟的长度吗? 我们建议在字节之间实现至少100us 的延迟、以实现更可靠的 I2C 通信。

    此致、

    约书亚

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

    感谢您的响应。 AVDD 测量电压为3.3V。 由于无法在电路板上访问 DVDD、因此我无法获得1.5V 测量值。

    在代码中延迟为500us。 但我也尝试过100和250。

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

    您是否可以尝试使用以下 Arduino 代码来查看此代码是否能够正常工作?

    #include <Wire.h>
    
    void setup()
    {
      Serial.begin(115200);
      
      Wire.begin();
      Wire.setClock(100000);
      
      read32(0x80);  // 32-bit read register 0x80
      write32(0x80, 0x12345678);  // 32-bit write  to register 0x80
      read32(0x80);  // 32-bit read register 0x80
    }
    
    void loop()
    {
    }
    
    void read32(int reg_addr)
    {
      byte reg_addr_H = (reg_addr & 0x0F00) >> 8;
      byte reg_addr_L = (reg_addr & 0xFF);
      
      const byte control_word[] = {0x90, reg_addr_H, reg_addr_L}; // 24-bit control word (CRC_EN = 0)
     
      Wire.beginTransmission(0x01);
      Wire.write(control_word, 3); // send the control word
      Wire.endTransmission();
    
      Wire.requestFrom(0x01, 4);    // request 4 bytes (32-bit read)
    
      unsigned long register_value = 0;
      for (int i = 0; i < 4; i++)
      {
        unsigned long c = Wire.read(); // receive a byte as character
        register_value |= (c << (i * 8)); // reconstruct 32-bit value (LSB is received first)
    //    Serial.println(c, HEX);         // print each received byte
      }
      
      Serial.print("Finished reading register: 0x");
      Serial.println(reg_addr, HEX);
      Serial.print("Value = 0x");
      Serial.println(register_value, HEX);
    }
    
    void write32(int reg_addr, unsigned long writedata)
    {
      byte reg_addr_H = (reg_addr & 0x0F00) >> 8;
      byte reg_addr_L = (reg_addr & 0xFF);
      
      const byte control_word[] = {0x10, reg_addr_H, reg_addr_L}; // 24-bit control word (CRC_EN = 0)
      byte data[] = {0x00, 0x00, 0x00, 0x00};   // 32-bit register data to be written
     
      for (int i = 0; i < 4; i++)
      {
        data[i] = ((writedata & (((unsigned long)0xFF) << (i * 8))) >> (i * 8));
      }
     
      Wire.beginTransmission(0x01);
      Wire.write(control_word, 3); // send the control word
      Wire.write(data, 4);  // send the 32-bit write data
      Wire.endTransmission();
    
      Serial.print("Finished writing to register: 0x");
      Serial.println(reg_addr, HEX);
    }

    此代码来自以下主题: https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1369513/mcf8316a-motor-is-not-spinning-without-uc/5248495?tisearch=e2e-sitesearch&keymatch=MCF%252A%2520Arduino#5248495

    此致、

    约书亚