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:8329和8316校验和之间是否存在差异?

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1295531/mct8329a-is-there-a-difference-between-8329-and-8316-checksum

器件型号:MCT8329A
主题中讨论的其他器件:MCT8316A

它会一直正常运行、直到您注册、发送和检查寄存器。 我们还将其修改为芯片 ID 0x60。 但是、校验和语法中出现错误。 似乎是针对其他芯片进行了编程优化。 您能否检查数据传送声明或 EEPROM 访问寄存器是否正确?

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

    尊敬的 Yongma:  

    感谢您张贴到 e2e 论坛-我们的团队目前 OOO 由于美国假期,但将在下周他们回到办公室时回复您的问题

    此致、  
    安德鲁  

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

    我希望您能玩得开心。 我写这封信是为了补充其他问题。

    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?tisearch=e2e-sitesearch&keymatch=program%20mcx

    1.我想请您确认 I2C_WRITE 语法中的0xE6寄存器是否正确。

    if (!I2C_write(0xE6, 0x8A500000, I2C_TIMEOUT))
    prog_error = true;
    
    __delay_cycles(2000000); // delay at least 100ms for copy operation from Shadow-register to EEPROM to complete
    __no_operation(); // For setting breakpoint while debugging
    
    /* Set the EEPROM_READ bit in the DEV_CTRL register (0xEA located in RAM
    * This copies the content of the EEPROM memory back into the shadow registers
    */
    if (!I2C_write(0xE6, 0x40000000, I2C_TIMEOUT))
    prog_error = true;
    
    __delay_cycles(2000000); // delay at least 100ms for copy operation from EEPROM to Shadow-register to complete
    __no_operation(); // For setting breakpoint while debugging

    2.我已检查数据是否被读写。 但是、校验和部分存在错误。 您能帮助我更正此部分吗?

    for (i = 0; i < eeprom_array_size; i++)
    {
    if(!I2C_read(eeprom_regmap[i][0], &(post_eeprom_write_regs[i]), I2C_TIMEOUT))
    {
    prog_error = true;
    break;
    }
    
    if (post_eeprom_write_regs[i] != eeprom_regmap[i][1])
    {
    prog_error = true;
    //GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN6);
    //GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
    break;
    }

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

    尊敬的 Yongma:

    1. 我想请您确认 I2C_WRITE 语法中的0xE6寄存器正确。

    所提供代码中的语法看起来正确。

    2. 我已检查数据是否已写入和读取。 但是、校验和部分存在错误。 您能否帮助我更正此器件?

    在提供的代码中的第9行之前、您能否 通过将两个数组都打印出来或通过另一种方法来检查数组的内容、并检查数组中的差异所在?

    此致、

    约书亚

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

    1.我无法检查。 您能告诉我如何通过 UART 或其他方法进行检查吗?


    2.查看数据表、发现 MCT8316A 与 MCT8329A 和写入操作数据包似乎不同。 应如何更改此器件?

    bool I2C_write(unsigned long addr, unsigned long writedata, uint32_t timeout) {
    
        EUSCI_B_I2C_initMasterParam param = {0};
    
        param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
    
        param.i2cClk = CS_getSMCLK();
    
        param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
    
        param.byteCounterThreshold = 0;
    
        param.autoSTOPGeneration = UCASTP_0;
    
        EUSCI_B_I2C_initMaster(EUSCI_B1_BASE, &param);
    
    
    
        //Enable I2C Module to start operations
    
        EUSCI_B_I2C_enable(EUSCI_B1_BASE);
    
    
    
        // Construct the 24 bit control word (refer to datasheet section 7.6.2.1)
    
        char control_word[3] = {0x10, (addr&0x00000F00)>>8, addr&0x000000FF};
    
    
    
        /* Set slave Address */
    
        EUSCI_B_I2C_setSlaveAddress(EUSCI_B1_BASE,
    
                                    I2C_TARGET_ADDR
    
                                    );
    
    
    
        /* Set master to transmit mode */
    
        EUSCI_B_I2C_setMode(EUSCI_B1_BASE,
    
            EUSCI_B_I2C_TRANSMIT_MODE);
    
    
    
        EUSCI_B_I2C_masterSendStart(EUSCI_B1_BASE);
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send bits CW23-CW16 of the control word */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, control_word[0], timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send bits CW15-CW8 of the control word */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, control_word[1], timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send bits CW7-CW0 of the control word */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, control_word[2], timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send D7-D0 of the 32-bit data */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, writedata & 0x000000FF, timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send D15-D8 of the 32-bit data */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, (writedata & 0x0000FF00)>>8, timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send D23-D16 of the 32-bit data */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, (writedata & 0x00FF0000)>>16, timeout))
    
            return 0;
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        /* Send D31-D23 of the 32-bit data */
    
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_B1_BASE, (writedata & 0xFF000000)>>24, timeout))
    
            return 0;0000000
    
    
    
        __delay_cycles(INTER_BYTE_DELAY);
    
    
    
        EUSCI_B_I2C_masterSendMultiByteStop(EUSCI_B1_BASE);
    
    
    
        return 1;
    
    }

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

    尊敬的 Yongma:

    我将寻找一个解决方案 来检查阵列的内容以及需要对您发送的代码进行的更改。 我会在星期五之前回复您。

    此致、

    约书亚

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

    我解决了,代码没有问题,谢谢你的回答。

    首先、我希望您更改目标 ID、使其保持在0x60。
    第一次写入时、目标 ID 为0x60、第二次写入时为0x00。 (数据表7.6.1.1、表7-7)

    我会给那些将会对我来说是新的人留下一篇文章。
    1.更改目标 ID (0x60或0x00、main.c-51行)
    2.更改影子寄存器值(0xE6、main.c - 153,162行)
    3.寄存器映射中仅放置数据表中写入的24项。 (8329A 有39个 GUI。)