我有一个 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 中正常运行的设置? 如果您需要更多详细信息、请告诉我。
感谢您的帮助!