环境-我有一个执行许多任务的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。
您可以看到第一遍就可以了。第二遍还可以,直到预计要停止的终点为止。
如果不是因为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;
}