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.

[参考译文] MCT8329A:I2C 写入序列

Guru**** 2463330 points
Other Parts Discussed in Thread: MCT8329A

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1306445/mct8329a-i2c-write-sequence

器件型号:MCT8329A

大家好、我正在编写自己的脚本、以便能够使用 i2c 写入 MCT8329A 的寄存器。

产品说明书中的所有内容都感觉有点矛盾。 例如我不理解这些示例。 查看标记的区域。 这些值似乎不对应?

那么、我的问题是、是否在某个位置隐藏了有关这些位和字节的结构的任何其他信息?

如果可以获得一个有关如何向寄存器写入4个数据字节的真实示例、那太棒了。

例如、只能向地址为0x60的器件写入4个空(0x00)字节的寄存器0x00000080、不带 CRC。

我将为此发送确切的字节是什么?

我现在得到的是这样的东西;

  i2c.beginTransmission(0x60);
  i2c.write(uint8_t(0x20)); 
  i2c.write(uint8_t(0x80)); 
  i2c.write(uint8_t(register)); 
  i2c.write(uint8_t(byte1)); 
  i2c.write(uint8_t(byte2)); 
  i2c.write(uint8_t(byte3)); 
  i2c.write(uint8_t(byte4)); 
  i2c.endTransmission();

但这显然是错误的。  

那么我该怎么做呢?

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

    你好,Mikael,

    Unknown 说:
    数据表中的所有内容都感觉有点矛盾。 例如我不理解这些示例。 查看标记的区域。 这些值似乎不对应?

    最后一行中的这些值是其上方仍在其同一列中的行中位的总和。 第4行中的一些十六进制值是多位的组合。 例如、DLEN 是 CW21和 CW20的组合。 对第2个示例表的 Control Word 0列进行分解这些位为 CW23 = 0、CW22 = 1、CW21 = 1、CW20 = 0、CW19 = 0、 CW18 = 0、CW17 = 0、CW16 = 0。 所有这些控制字0位组合为0110 0000 = 0x20。

    希望这有助于说明如何确定最后一行值。  

    Unknown 说:
    如果有一个关于如何向寄存器写入4个数据字节的真实示例,那就太棒了。

    您可以 在此处查看我们使用 MSP430进行编程的示例代码、查看写入寄存器的示例: https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1246892/faq-program-mcx-bldc-motor-driver-through-i2c-using-msp430-launchpad。 

    一般而言、结构如下:

    addr = 0x80;
    i2c.beginTransmission(0x60); //start transmission and send target ID
    i2c.write(uint8_t(0x10)); //send Control Word 0 (CW23-CW16) for 32-bit write opperation (4 data bytes) no CRC
    i2c.write(uint8_t((addr&0x00000F00)>>8)); //send Control Word 1 (CW15-CW8) bits CW15-CW12 will always be 0, addr==0x80
    i2c.write(uint8_t((addr&0x000000FF)>>8)); //send Control Word 2 (CW7-CW0) bits for the rest of the register address, addr==0x80
    i2c.write(uint8_t(byte1)); //byte1 = 0x00
    i2c.write(uint8_t(byte2)); //byte2 = 0x00
    i2c.write(uint8_t(byte3)); //byte3 = 0x00
    i2c.write(uint8_t(byte4)); //byte4 = 0x00
    i2c.endTransmission();

    对于目标 ID = 0x60的特定示例、为所有数据字节的寄存器0x80加上0x00、无 CRC、我将把 Data 更改为等于0x1234ABCD 以显示数据位应发送的顺序:

    i2c.beginTransmission(0x60); //start transmission and send target ID
    i2c.write(uint8_t(0x10)); //send Control Word 0 (CW23-CW16) for 32-bit write opperation (4 data bytes), no CRC
    i2c.write(uint8_t(0x00); //send Control Word 1 (CW15-CW8) bits CW15-CW12 will always be 0
    i2c.write(uint8_t(0x80); //send Control Word 2 (CW7-CW0) bits for the rest of the register address
    i2c.write(uint8_t(0xCD));
    i2c.write(uint8_t(0xAB));
    i2c.write(uint8_t(0x34));
    i2c.write(uint8_t(0x12));
    i2c.endTransmission();

    此致、

    约书亚

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

    谢谢、我将对此进行深入探讨并报告。

    /Mikael

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

    好的。 我想我明白了。 但它最终会变为0x60、如数据表中所示、对吧?

    通过稍作更改、我现在可以写入寄存器、然后成功读回它。 谢谢!

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

    你好,Mikael,

    但结果却是0x60,就像数据表一样,对吗?

    我想您是指控制字0正确吗? 如果您引用的是目标 ID、则默认情况下该值为0x60、可以通过更改寄存器 PIN_CONFIG2中位字段 I2C_TARGET_ADDR 中的值来更改该值。

    对于控制字0、如果您正在写入寄存器并且不需要 CRC、那么 我们建议使用的控制字0值为0x10、 这会将写入数据的长度设置为32位(这是 单个 MCT8329寄存器的完整大小) 并且未启用 CRC。  如果需要 CRC、则使用0x60作为控制字0将写入32位数据并启用 CRC。 有关整个控制字中每个位字段的功能的更多信息、请参阅数据表中的表7-5和表下方的说明。

    此致、

    约书亚