2014-09-19 99 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位地址的情況下實現。