запись () в устройство i2c: операция не разрешена - PullRequest
1 голос
/ 04 марта 2011

Итак, у меня есть 2 чипа PCA9555 (16-канальный цифровой ввод / вывод), подключенных к небольшому встроенному устройству под управлением Linux через i2c. Устройства 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

Так что я не совсем понимаю, что я делаю неправильно. Предполагая, что оборудование подключено правильно, куда мне идти?

1 Ответ

2 голосов
/ 04 марта 2011

Адаптер i801 поддерживает только передачи SMBUS, а ядро ​​Linux i2c не поддерживает произвольные вызовы записи для адаптеров SMBUS.Вам нужно будет использовать i2c_smbus_write_word_data.В документации к ядру подробности не рассматриваются, но по этой причине рекомендуется использовать команды SMBUS.

...