2014-09-19 59 views
3

我正在写一个用户空间程序来使用open(),ioctl(),read()和write()对EEPROM进行读取和写入,但它不会我似乎没有按我期望的方式工作。I2C用户空间读/写问题

我想我首先要问的是整个I2C protocol for read and write通过调用read()和write()来处理I2C文件描述符? According to the link here,整个事务由read()和write()处理。

如果是这样,那么read()和write()如何知道从哪个寄存器地址读取?我读过的大多数地方都说要使用传递给read()和write()的数据缓冲区的第一个字节来存储要读取或写入的寄存器地址。但是,如果我正在使用的设备使用16位寄存器地址和寄存器数据呢? read()和write()如何知道地址是8位还是16位?

谢谢,如果需要,我可以提供一些代码片段。

+2

寄存器地址不是I2C协议的一部分,它们是消息的一部分。每个设备都可以为消息定义自己的协议和格式,并根据您使用的设备进行适当的操作。 'read'和'write'不需要*知道寄存器地址有多长,或者*是什么,它们只是移动位。 – hobbs 2014-09-19 20:33:17

+0

设备的规格书/数据表应该包含编程它的信息。 – egur 2014-09-19 20:38:50

+0

你必须错过[你发布的第二个链接]中的这一行代码(https://xgoat.com/wp/2007/11/11/using-i2c-from-userspace-in-linux/):'ioctl (fd,I2C_SLAVE,ADDRESS)' – 2014-09-19 20:44:43

回答

1

我认为底层协议是通过三个系统调用实现的:read,writeioctl,如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位地址的情况下实现。