为什么I2C通信第二次通过相同代码失败?

问题描述 投票:0回答:1

风景-我有一个执行很多任务的MCU。它向Raspberry Pi公开了I2C从属通信。我在MCU上的代码中创建了许多“寄存器”。所有这些都工作正常。我以前已经连接了nano,并在MCU上进行了所有测试,因此我相当确定MCU的行为正确。我的大多数I2C通讯也在Pi上进行。除了一个。有点不同,它写入了三个字节。

这是我的RPi代码:

std::string i2cServo(uint8_t reg, uint8_t angle){
    std::string error;
    uint8_t TxBuf[3];
    TxBuf[0] = 11;         // The register.
    TxBuf[1] = reg;        // The first parameter.
    TxBuf[2] = angle;      // The second parameter.
    close_fd();
    if (!fd) {
        if (open_fd_wronly() == -1) {
            error = "Failed to open I2C bus.";
        } else {
            if (write(fd, &TxBuf, 3) != 3) {
                std::cerr << errno << std::endl;
                error = "Could not set servo.";
            }
        }
    }
    return error;
}

此代码执行两次。第一次一切都很好,第二次我得到errno5。这是EIO。

这是逻辑分析仪的输出:Logic

您可以看到第一遍没问题。第二遍也可以,直到预计要停止的终点为止。

如果不是因为nano的行为正确,并且代码的第一遍工作正常,我会怀疑MCU。

有什么想法吗?

这是fd开头:

int open_fd_wronly(){
    error_flag = false;
    if (fd) {
        close_fd();
        fd = 0;
    }
    if ((fd = open(devicefile.c_str(), O_WRONLY)) < 0)
        return errorMsg("ERROR opening: " + devicefile + "\n");
    if (ioctl(fd, I2C_SLAVE, slave_address) < 0)
        return errorMsg("ERROR address: " + std::to_string(slave_address) + "\n");
    return 0;
}

风景-我有一个执行很多任务的MCU。它向Raspberry Pi公开了I2C从属通信。我在MCU上的代码中创建了许多“寄存器”。所有这些都是...

raspberry-pi c++17 clion i2c unistd.h
1个回答
0
投票

[对不起,我们不久后会发布问题。比答案浮现在我头上。分享问题确实很有帮助。第一个寄存器调用提示对EEPROM进行写操作,第二个调用刚刚到达的速度太快,从而触发了对EEPROM的另一写操作,并导致崩溃。两次通话之间稍有延迟即可解决问题。非常感谢。

© www.soinside.com 2019 - 2024. All rights reserved.