Как получить данные с устройства i2c через USB в Linux - PullRequest
2 голосов
/ 13 октября 2009

У меня есть датчик температуры, который подключен через адаптер USB-I2C (http://www.robot -electronics.co.uk / htm / usb_i2c_tech.htm ) Я подключил это устройство к своему компьютеру Linux (suse10). Я набрал dmesg и увидел

usb 3-3: new full speed USB device using ohci_hcd and address 10
usb 3-3: new device found, idVendor=0403, idProduct=6001
usb 3-3: new device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-3: Product: FT232R USB UART
usb 3-3: Manufacturer: FTDI
usb 3-3: SerialNumber: A7007K93
usb 3-3: configuration #1 chosen from 1 choice
ftdi_sio 3-3:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232BM
usb 3-3: FTDI USB Serial Device converter now attached to ttyUSB0

Но я не знаю, как читать текущую температуру.

обновлено 1: Фактически к шине I2C можно подключить до 127 датчиков. Но я не знаю, как перечислить адреса доступных датчиков.

Кто-нибудь может дать мне несколько советов? Заранее спасибо

1 Ответ

4 голосов
/ 13 октября 2009

Ваш адаптер позволяет отправлять команды I2C через виртуальный последовательный порт. Серийный порт был создан для вас. Вам нужно открыть его и отправить ему команды. Команды относятся к устройству, к которому вы подключены. Посмотрите пример в ссылке, которую вы предоставили, чтобы получить представление.

Трудно дать вам правильные инструкции без таблицы. Скорее всего, ваше устройство будет использовать один байтовый адрес, а процедура чтения будет следующей:

[I2C_AD1] [Device I2C address + Read bit] [Device Address register] [Number of bytes to read]
0x55 0xXX 0x00 0x01

Вам необходимо отправить 4 байта на последовательный порт. Первый инструктирует преобразователь USB в I2C отправлять команду чтения. Второй - это адрес устройства, подключенного к шине I2C. Устройства I2C используют 7-битные адреса (0-127). Обычно они даны с одним битом, сдвинутым слева. Поэтому вам нужно отсканировать эти адреса (итерация от 0 до 127, сдвиг влево на один бит, установите бит0 в 1):

([0x00 - 0x7F] << 1) | 1

Поскольку у нас нет таблицы данных, я не могу ничего сказать о последних двух байтах. Вы можете попытаться использовать фиктивные значения. Если устройство подключено к сканированному адресу I2C, оно должно ответить NACK на попытку чтения несуществующего регистра. Команды чтения, отправленные на адрес I2C, который не соответствует фактическому устройству, следует игнорировать.

...