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.

[参考译文] MSP430FR2675:I2C 从设备不能与 Linux I2C-Dev 模块一起工作

Guru**** 2511985 points
Other Parts Discussed in Thread: MSP430FR2675

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1198380/msp430fr2675-i2c-slave-not-working-with-linux-i2c-dev-module

器件型号:MSP430FR2675

我有一个 MSP430FR2675、它通过 I2C 与 Ambarella CV25 MPU 通信。 CV25是主器件、MSP430是从器件。 我已经将 MSP430设置为能够处理与主器件的 I2C 从器件通信。 我已使用 Aardvark I2C/SPI 控制器作为主控制器测试了 MSP430 I2C 功能、发现 I2C 通信正常。 但是、当使用 i2c-dev Linux 模块时、I2C 通信无法与 CV25进行通信。 我发送一个 i2cdetect 命令、发现 MSP430地址没有确认检测。 我还执行了一个 i2cset 命令、Linux 的响应是发生了错误、MSP430无法识别命令已发送给它。

我要发送的命令为"i2cset -y 0 0x0a 0x01 0x10 0x27 s"(i2c 总线为0、MSP430地址为0x0a、MSP430寄存器为0x01、命令为0x1027)。 下面是当 Aardvark 发送命令和 CV25发送命令时该命令的外观图。 可以看到、来自 Aardvark 和 CV25的命令似乎都正确地发送到 MSP430。 然而、MSP430只能从 Aardvark 正确确认。

Aardvark

CV25

下面是我处理来自主设备的呼叫的代码。 被调用的 I2CSlave 函数是从 CapTIvate 应用程序生成的。

void HostInterface_Initialize(void)
{
    // Set the host interrupt pin as an output
    GPIO_setAsOutputPin(CONFIG_HOST_IRQ_PORT, CONFIG_HOST_IRQ_PIN);

    // Open & Initialize the I2C Slave port
    I2CSlave_openPort(&HostInterface_handle);
    I2CSlave_setTransmitBuffer(
            (HostInterface_i2cDataBuffer + HOST_INTERFACE_OVRHD_LENGTH),
            (HOST_INTERFACE_BUFFER_SIZE - HOST_INTERFACE_OVRHD_LENGTH)
        );
}

static bool HostInterface_ReceiveCallback(uint16_t count)
{
    // If there is no data sent, don't do anything
    if (count == 0)
    {
        return false;
    }
    // Register read command
    else if (count == 1)
    {
        // TODO: Add any read commands to this section
    }
    // Register write command
    else
    {
        uint8_t *buffer = &HostInterface_i2cDataBuffer[HOST_INTERFACE_CMD_OFFSET];

        // Do the specific command based on register
        switch (HostInterface_i2cDataBuffer[HOST_INTERFACE_REG_OFFSET])
        {
            case I2C_CERBERUS_LED_SET_FREQUENCY_REG:
                HostInterfaceLEDs_FrequencyHandler(buffer);
                break;
            case I2C_CERBERUS_LED_KEY_DUTY_CYCLE_REG:
                HostInterfaceLEDs_KeyDutyCycleHandler(buffer);
                break;
            case I2C_CERBERUS_LED_STATUS_RED_DUTY_CYCLE_REG:
                HostInterfaceLEDs_StatusRedDutyCycleHandler(buffer);
                break;
            case I2C_CERBERUS_LED_STATUS_GREEN_DUTY_CYCLE_REG:
                HostInterfaceLEDs_StatusGreenDutyCycleHandler(buffer);
                break;
            case I2C_CERBERUS_LED_STATUS_BLUE_DUTY_CYCLE_REG:
                HostInterfaceLEDs_StatusBlueDutyCycleHandler(buffer);
                break;
            case I2C_CERBERUS_LED_STATUS_WHITE_DUTY_CYCLE_REG:
                HostInterfaceLEDs_StatusWhiteDutyCycleHandler(buffer);
                break;
            case I2C_CERBERUS_LED_POWER_STATUS_REG:
                HostInterfaceLEDs_PowerStatusHandler(buffer);
                break;
            // TODO: Add in other registers later
            default:
                break;
        }
    }

    // Return false to exit with the CPU in its previous state.
    // Since the response packet generation was handled immediately here,
    // there is no need to exit active.
    return false;
}

您是否看到我的设置或测量有任何问题? 是否缺少了在 Linux 中正常运行的设置? 如果您需要更多详细信息、请告诉我。

感谢您的帮助!

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

    我实际上能够弄清楚它。 DTS 文件引用了错误的 i2c 总线。