Неверное возвращаемое значение для I2C_SLAVE и I2C_RDWR на Raspberry pi - PullRequest
0 голосов
/ 07 ноября 2019

Я использую Raspberry pi для связи I2C с чипом.

I2C работает на i2c-1, и я хочу установить связь с чипом mux0, для которого указан адрес. Я использовал неправильный адрес, чтобы увидеть, какое значение я получаю из I2C_SLAVE и I2C_RDWR.

Я хочу проверить, правильно ли я открываю шину или нет. Поэтому я использую оператор if, и он отлично работает для меня. `

int file;
file = open(i2c_adapt, O_RDWR);
if (file == -1)
  {
    perror("Check I2C Bus");
    exit(1);
  }

`

Затем я увидел две функции, которые можно использовать для определения адреса чипа. I2C_SLAVE и I2C_RDWR.

Я хочу проверить, является ли адрес чипа правильным или нет, но оба они возвращают одинаковые значения.

Я напечатал их возвращаемое значение для проверки.

`

printf("\nThe file value when Mux0 is %d", open("/dev/i2c-1", O_RDWR));
printf("\nThe file value of random bus is %d\n", open("/dev/i2c-0", O_RDWR));
printf("\nThe i2c_Slave value when Mux0 is %d", ioctl(file, I2C_SLAVE, mux0));
printf("\nThe i2c_Slave value of random address is %d\n\n", ioctl(file, I2C_SLAVE, 0x60));
printf("\nThe I2C_RDWR value when Mux0 is %d", ioctl(file, I2C_RDWR, mux0));
printf("\nThe i2c_RDWR value of random address is %d\n\n", ioctl(file, I2C_RDWR, 0x60));

Когда я запускаю эти команды, я получаю следующие значения:

Значение файла, когда Mux0 равно 4. Значение файла случайной шины равно -1

, поэтому я могу использовать оператор if, чтобы узнать, использую ли я неправильную шину

. Значение i2c_Slave, когда Mux0 равно 0 Случайный адрес значения i2c_Slave равен 0

Значение i2c_RDRW, когда Mux0 равно -1 Значение случайного адреса i2c_RDRW равно -1 , введите описание изображения здесь

Может кто-нибудь сказать мне, почему я получаю одинаковое значение и для неправильного чипа?

1 Ответ

0 голосов
/ 07 ноября 2019

ioctl I2C_SLAVE не проверяет наличие подчиненного адреса. Он устанавливает адрес ведомого устройства I2C по умолчанию для открытого файла, т. Е. Задает адрес ведомого устройства I2C, который используется read() и write(). Ioctl вернет -1 и установит errno в EBUSY, если устройство с указанным адресом подчиненного устройства связано с драйвером.

Вы используете I2C_RDWR ioctl с совершенно неверным третьим параметром. Проверьте документацию: Интерфейс устройства I2C . Третий аргумент указывает на struct i2c_rdwr_ioctl_data, который содержит указатель на массив struct i2c_msg и длину массива. Каждый struct i2c_msg содержит адрес подчиненного устройства, некоторые флаги, длину буфера и указатель буфера. Вы можете увидеть пример того, как использовать его в i2ctransfer.c из репозитория i2c-tools git.

...