所以我有2个PCA9555(16通道数字I/O)芯片连接到一个运行I2C Linux的小型嵌入式设备上。PCA9555设备有7位地址0100000和0100001。
当我给电路板通电时,我运行:
# modprobe i2c-i801
# modprobe i2c-dev
# i2cdetect -l
i2c-0 smbus SMBus I801 adapter at 0500 SMBus adapter
# i2cdump -y -r 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
... (Same for every line)
70: -- -- -- -- -- -- --
# dmesg|tail
i801_smbus 0000:00:1f.3 Transaction timeout
... (For every '--' in i2cdump, one of these errors outputted)
i801_smbus 0000:00:1f.3 Transaction timeout
于是我试着编写一个简单的程序,将第一个PCA9555芯片上的所有引脚设置为高输出:
char *file;
unsigned char buf[3];
int addr, fd;
file = "/dev/i2c-0";
addr = 0x20; /* 0100000 */
if((fd = open(file, O_RDWR)) < 0){
err(1, "open()");
}
if(ioctl(fd, I2C_SLAVE, addr) < 0){ /* also tried I2C_SLAVE_FORCE */
err(1, "ioctl()");
}
/* Set all digital I/Os to output */
buf[0] = 6;
buf[1] = 0x00;
buf[2] = 0x00;
if(write(fd, buf, 3) != 3){
err(1, "write() 1");
}
/* Set all outputs high */
buf[0] = 2;
buf[1] = 0xFF;
buf[2] = 0xFF;
if(write(fd, buf, 3) != 3){
err(1, "write() 2");
}
return 0;
运行此命令将返回:
# ./i2c
./i2c: write() 1: Operation not supported
所以我真的不明白我做错了什么。假设硬件连接正确,我该怎么做?
最佳答案
i801适配器仅支持smbus传输,而linux i2c核心不支持对smbus适配器的任意写调用。您需要使用i2c_smbus_write_word_data
。kernel documentation没有详细说明这一点,但这就是它建议使用smbus命令的原因。