2014-09-19 3 views
3

Я пишу программу пространства пользователя для чтения и записи в/из EEPROM с помощью open(), ioctl(), read() и write(), но это doesn Кажется, я работаю так, как я ожидаю.Проблемы чтения/записи пользовательского пространства I2C

Я предполагаю, что в первую очередь я должен спросить, есть ли все I2C protocol for read and write, обрабатываемые вызовами read() и write() с дескриптором файла I2C? According to the link here, вся транзакция обрабатывается read() и write().

Если это так, то как читать() и write() знать, какой адрес регистра читать? Большинство мест, которые я прочитал, говорят, чтобы использовать первый байт буфера данных, переданный в read() и write(), чтобы сохранить адрес регистра для чтения или записи. Но что, если устройство, с которым я общаюсь, использует 16-битные регистры и регистровые данные? Как читать() и write() знать, если адрес имеет длину 8 или 16 бит?

Спасибо, и я могу предоставить некоторые фрагменты кода, если необходимо.

+2

Адреса регистра не являются частью протокола I2C, они являются частью сообщения. Каждое устройство может определять свой собственный протокол и формат сообщений, и вы делаете то, что подходит для используемого устройства. 'read' и' write' не нуждаются *, чтобы знать, как долго находится адрес регистра, или * что * один, они просто движутся битами. – hobbs

+0

Спецификация/лист данных вашего устройства должен содержать информацию для его программирования. – egur

+0

Вы, должно быть, пропустили эту строку кода в [второй ссылке, которую вы опубликовали] (https://xgoat.com/wp/2007/11/11/using-i2c-from-userspace-in-linux/): 'ioctl (fd, I2C_SLAVE, ADDRESS) ' –

ответ

1

Я думаю, что базовый протокол реализован с тремя системными вызовами: read, write и ioctl, как описано in the kernel I²C documentation. Однако я рекомендую использовать libi2c, поэтому вам не нужно беспокоиться об этих деталях. Я писал о том, как использовать эту библиотеку здесь:

http://blog.davidegrayson.com/2012/06/using-ic-on-raspberry-pi.html

Я успешно завернул его в C++ класс, который вы можете увидеть здесь:

https://github.com/DavidEGrayson/minimu9-ahrs/blob/master/I2CBus.cpp

Кроме того, в I²C, устройство адреса 7-бит. Если ваше устройство реализует какой-то 16-разрядный адрес, это, вероятно, будет реализовано внутри передачи данных на 7-битный адрес устройства.

Смежные вопросы