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.

[参考译文] MCF8316AEVM:I2C 寄存器映射

Guru**** 2482225 points
Other Parts Discussed in Thread: MCF8316AEVM, MCF8316A, MSP-EXP430FR2355

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1189354/mcf8316aevm-i2c-register-map

器件型号:MCF8316AEVM
主题中讨论的其他器件: MCF8316AMSP-EXP430FR2355

您好!

我是用于电机驱动器控制的 MCF8316AEVM 开发板。 我对 i2c 寄存器和 i2c 的读写方法有疑问。 正如我所知、如果 EVM 支持 I2C 的标准协议、因此对此没有太多问题、但我仍在寻找寄存器映射文档、该文档将帮助我了解电机驱动器如何通过 I2C 运行。

我计划在 PCB 的最后一层使用外部 MCU、因此它将 通过 I2C 与 MCF8316AEVM 进行通信、这意味 着 MCF8316AEVM 将被预加载一次、稍后我将使用 i2c 通过外部主机 MCU 进行控制。

问题。  

如何 通过 I2C 读取和写入 MCF8316AEVM。

请提供一些与 I2C 寄存器映射或数据表相关的信息。

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

    您好 Ketan、

    感谢您在电机驱动 E2E 论坛上提出问题。  

    我打算在本星期结束前就此作出回应!

    最棒的

    Robert

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

    您好!

    感谢你的答复。

    当然没有问题。

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

    您好 Ketan、

    有关  EVM 入门的一般信息、我建议您阅读并查看《MCF8316AEVM (评估模块)用户指南》、以开始旋转电机。 (https://www.ti.com/lit/ug/sllu338/sllu338.pdf)

    我们的 EVM 可让您使用我们的 EVM GUI  (https://dev.ti.com/gallery/view/BLDC/MCF8316A_GUI/ver/1.1.8/)控制特色微控制器的各种输入。 使用此 GUI 将允许 您读取和写入 MCF8316AEVM 并配置您所需的所有设置。

    要查找有关该器件的寄存器映射和各种可用配置的更多信息、请查看此产品页面 的 MCF8316A 数据表:https://www.ti.com/product/MCF8316A

    我希望这能回答你的问题。 如果有、请将此主题标记为已解决!

    最棒的

    Robert

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

    您好!  

    注意到。 我将介绍 I2C 寄存器映射的文档。

    I2C 的相关信息。 我尝试使用一些 i2c 示例从 i2c 基础传感器读取器件信息、但看起来我无法读取 i2c 数据。

    我正在使用 MSP430RF2355开发板、并且我有一个连接的外部 I2C 传感器、该传感器具有用于 SCLK 和 SDA 线路的 P1.3和 P1.2引脚。 我在 I2C 寄存器中设置了主通信的从地址。 请参阅初始化部分。

    问题:  

    条件开始后需要轮询发送标志? 从器件地址仍然没有载入到 TX 缓冲器中?

     //Poll for transmit interrupt flag.
        while (!(HWREG16(baseAddress + OFS_UCBxIFG) & UCTXIFG) && --timeout) {
            ;
        }
    

    void msd_i2c_initialization(void) {
    
        //SDA line
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
        //clock line
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
    
        EUSCI_B_I2C_initMasterParam i2c_master_init_param = { 0 };
        i2c_master_init_param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;      //use SMCLK clock signal
        i2c_master_init_param.i2cClk = CS_getSMCLK();                         //Give SMCLK freq in Hz
        i2c_master_init_param.dataRate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;   //400KBps datarate
        i2c_master_init_param.byteCounterThreshold = 0;                       //Don't care because 'no auto stop'
        i2c_master_init_param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;            //We will handle the stop bit manually
        EUSCI_B_I2C_initMaster( EUSCI_B0_BASE, &i2c_master_init_param);
        EUSCI_B_I2C_enable(EUSCI_B0_BASE);  //Enable the I2C bus (i.e. pull it out of reset state)
        EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE, I2C_SLAVE_ADDRESS);
    }
    
    static bool start_transfer(uint16_t baseAddress) {
    
        bool success = false;
        uint8_t timeout = 40;
    
        //Send start condition.
        HWREG16(baseAddress + OFS_UCBxCTLW0) |= UCTR + UCTXSTT;
    
        //wait for master send the slave address
        //Poll for transmit interrupt flag.
        while (!(HWREG16(baseAddress + OFS_UCBxIFG) & UCTXIFG) && --timeout) {
            ;
        }
    
        //Check if transfer timed out
        if (timeout == 0) {
            MSP_LOG("start_transfer() TIMEOUT");
            return success;
        }
        success = true;
        return success;
    }
    
    static bool restart_transfer(uint16_t baseAddress) {
    
        bool success = false;
        uint8_t timeout = 40;
    
        //wait here
        delay_ms(40);
    
        //Set USCI in Receive mode
        HWREG16(baseAddress + OFS_UCBxCTLW0) &= ~UCTR;
    
        //Send start
        HWREG16(baseAddress + OFS_UCBxCTLW0) |= (UCTXSTT + UCTXSTP);
    
        //Poll for receive interrupt flag.
        while (!(HWREG16(baseAddress + OFS_UCBxIFG) & UCRXIFG) && --timeout) {
            ;
        }
    
        if (timeout == 0) {
            MSP_LOG("restart_transfer() TIMEOUT");
            return success;
        }
        success = true;
        return success;
    }
    static void stop_transfer() {
        EUSCI_B_I2C_masterReceiveMultiByteStop(EUSCI_B0_BASE);
    }
    static bool write_reg(uint16_t baseAddress, uint8_t *data, uint8_t len) {
        //start the transmission now
        //MSP430 send slave address once start bit occur
        bool success = start_transfer(baseAddress);
        if (!success) {
            return 0;
        }
    
        //send the data to be sent
        uint8_t i = 0;
        for (i = 0; i < len; i++) {
            EUSCI_B_I2C_slavePutData(baseAddress, data[i]);
        }
    
        //stop the transmission
        stop_transfer();
    
        return success;
    }
    static bool read_reg(uint16_t baseAddress, uint8_t *data, uint8_t len) {
    
        //start the communication
        //restart with received mode
        bool success = restart_transfer(baseAddress);
        if (!success) {
            return 0;
        }
        //start reading now.
        uint8_t i = 0;
        for (i = 0; i < len; i++) {
            *data++ = EUSCI_B_I2C_slaveGetData(baseAddress);
        }
    
        //stop the transmission
        stop_transfer();
        return success;
    }

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

    您好 Ketan、

    您是否尝试通过 取消 SCL 和 SDA 跳线并将 MSP-EXP430FR2355 LaunchPad 直接连接到 MCF8316A 来绕过 MCF8316AEVM 上已有的 MSP430RF2355?

    如果是、您可以在此处使用 CCS 项目作为起点:

    e2e.ti.com/.../8867.HardwareI2C_5F00_MSP430FR2355_5F00_MCF8316AEVM.zip

    如果您有更多有关 I2C 通信的具体问题、可以将这些问题直接提交给我们的 MSP 团队以帮助进行调试。

    最棒的

    Robert

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

    您好!

    感谢您的回复。

    是的、我绕过现有 的 MSP430RF2355。  

    我想 我在这里得到了答案。 默认情况下 MCF8316AEVM 器件从器件始终为0x01?

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

    您好!

    深入了解示例代码后、我对 I2C 读取方法有疑问。  

     根据 MCF8316AEVM 的数据表、它接受 4字节的控制字进行读取和写入。

    根据示例代码、它发送4字节的控制字并从寄存器中读取数据。 首先、通过 μ@字节计数器阈值将写入控制字配置为传输模式 、但在读取结束时、读取情况如何、不使用停止条件进行传输、 @这意味着 byteCounterThreshold 计数将在 读取结束时再次生成停止条件?

    @ @我的理解、一旦写入计数达到发送 控制字时已达到的 n ü r 字节字节计数阈值计数、n ü r 字节计数器阈值将生成停止条件、因此 现在无需在接收到停止条件后生成停止条件。 ?

    bool I2C_read32(unsigned long addr, unsigned long *result, uint32_t timeout) {
        // Temp variables
        uint8_t val;
        unsigned long r = 0;
    
        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 = 4;
        param.autoSTOPGeneration = EUSCI_B_I2C_SEND_STOP_AUTOMATICALLY_ON_BYTECOUNT_THRESHOLD;
        EUSCI_B_I2C_initMaster(EUSCI_I2C_BASE, &param);
    
        //Enable I2C Module to start operations
        EUSCI_B_I2C_enable(EUSCI_I2C_BASE);
    
        // Construct the 24 bit control word (refer to datasheet section 7.6.2.1)
        char control_word[3] = {0x90, 0x00, addr&0xFF};
    
        /* Set slave Address */
        EUSCI_B_I2C_setSlaveAddress(EUSCI_I2C_BASE,
                    SLAVE_ADDR
                );
    
        /* Set master to transmit mode */
        EUSCI_B_I2C_setMode(EUSCI_I2C_BASE,
            EUSCI_B_I2C_TRANSMIT_MODE);
    
        EUSCI_B_I2C_masterSendStart(EUSCI_I2C_BASE);
    
        __delay_cycles(INTER_BYTE_DELAY);
    
        /* Send bits CW23-CW16 of the control word */
        if (!EUSCI_B_I2C_masterSendMultiByteNextWithTimeout(EUSCI_I2C_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_I2C_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_I2C_BASE, control_word[2], timeout))
            return 0;
    
        __delay_cycles(INTER_BYTE_DELAY);
    
        /*
         * Set master to receive mode and generate Start condition
         * This sends out the slave address and continues to read
         * until you issue a STOP
         */
        EUSCI_B_I2C_masterReceiveStart(EUSCI_I2C_BASE);
    
        __delay_cycles(INTER_BYTE_DELAY);
    
        val = EUSCI_B_I2C_masterReceiveSingle(EUSCI_I2C_BASE);
        r |= val;
        __delay_cycles(INTER_BYTE_DELAY);
    
        val = EUSCI_B_I2C_masterReceiveSingle(EUSCI_I2C_BASE);
        r |= ((unsigned long)val)<<8;
        __delay_cycles(INTER_BYTE_DELAY);
    
        val = EUSCI_B_I2C_masterReceiveSingle(EUSCI_I2C_BASE);
        r |= ((unsigned long)val)<<16;
        __delay_cycles(INTER_BYTE_DELAY);
    
        val = EUSCI_B_I2C_masterReceiveSingle(EUSCI_I2C_BASE);
        r |= ((unsigned long)val)<<24;
        *result = r;
        __delay_cycles(INTER_BYTE_DELAY);
    
        return 1;
    }

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

    您好 Ketan、

    正确、 发送的代码段中启用了自动停止生成、一旦达到字节计数器阈值、就会自动生成停止条件。

    最棒的

    Robert

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

    您好!

    这意味着阈值计数可用于读取和写入等操作。  

    因此、写入完成时的第一个操作、阈值计数生成停止条件、读取开始时使用重新启动 i2c 操作启动标志、再次根据阈值计数读取数字字节后、器件生成操作结束时的停止条件。 对吧?

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

    您好 Ketan、

    根据第24.3.8节中的 MSP340FR2355用户指南、"地址字节不会使计数器递增"。 因此、在读取从代码中截取的函数 I2C_read32时不会生成停止条件。 MCF8316A 数据表中仅有3个控制字字节:

    这意味着在 I2C 读取操作中 、当发送24位控制字时、在启动序列期间不会达到字节计数器阈值4。 读取操作的下一步是在控制字之后跟随一个重复起始位来复位计数器。 然后、在达到字节计数器阈值之前、还需要读取数据字节。  

    您可能还会注意到、在我发送的代码中、I2C_write32函数禁用了 autoSTOPGeneration 函数。 要将此函数实现到此写入操作中、您需要将字节计数器阈值设置为7:3 (对于控制字)、然后4 (对于写入字节)、因为没有重复起始。  

    最棒的

    Robert

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

    您好!

    注意到。 这@着我不应该为读取影子寄存器发出额外的停止条件、因为这将由 μ C 字节计数器阈值处理。

    影子寄存器是否始终可 用于通过 I2C 通信进行读取和写入、或者对读取和写入有任何限制?

     从器件地址如何?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="393211" URL"~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1189354/mcf8316aevm-i2c-register-map/4486317 #4486317"]这意味着我不应为读取影子寄存器发出额外的停止条件

    正确。

    除非已经发生了读取或写入操作、否则影子寄存器始终可通过 I2C 进行读取和写入。 有关最佳实践、请查看我们的数据表、其中涵盖 EEPROM 访问和 I2C 接口。

    最棒的

    Robert

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

    您好!

    感谢您的更新。  

    我能够通过 I2C 读取影子寄存器而无需写入任何内容。  

    TI 可提供 MSP340FR2355的预加载 GUI 代码?

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

    您好 Ketan、

    对此我不确定、请将此问题直接发送至 MSP E2E 论坛。

    如果我已经回答了您有关我们电机驱动器的所有问题、请将此主题标记为已解决、从而提供帮助。

    最棒的

    Robert  

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

    你(们)好

    感谢你的答复。

    我将标记为已解决。