Az I2C meg az SPI csak egy interface, gyakorlatilag _bármi_ lehet mögötte.
Itt kezdődik a szoftveres látásmód, meg a tévedések vígjátéka.
Talán ezért I2C az egyik, TWI (TwoWire) a másik. A wiki szerint: In some cases, use of the term "two-wire interface" indicates incomplete implementation of the I²C specification. Not supporting arbitration or clock stretching is one common limitation, which is still useful for a single master communicating with simple slaves that never stretch the clock.
Lefordítom: Az egyik egy komplex protokoll, a másik meg arra való, hogy a szoftveres kiprüntyögtesse pl. egy szenzorból a bájtokat. Általában az összes I2C lib ez utóbbit fícsört valósítja meg.
A harmadik meg az AM2320, ami I2C-re ültetett MODBUS (eddig jó), ÉS 3 nem szabványos időzítés, amit csak extra timerrel lehet megoldani. Már, ha nem szoftver loopokkal szeretnél késleltetni. Elrettentő példa a fenti elvek szerint rpi-re készült driver (ott van valahol github-on), ami gyorsabb rpi-n futtatva érthetetlen módon nem működik. :-D
Sajnos ez is olyan eset, amikor kicsit tovább kellett volna olvasi az adatlapot, megérteni és implementálni. A regressziós teszt nyilvánvalóan elolvasta volna az adatlapot egészan a végéig. ;)
De maradjunk csak a mikrokontrollereknél! Pl. Core i7, C#, Windows, USB. Mondom a kollégának, hogy: Csinálj egy thread-et, ami az 1db USB blokkot bufferbe írja, amikor megérkezik.
Pár hónap múlva rájött, hogy néhány blokkocska elveszik. Meg is néztem a fw oldalt, de olyan ravasz módon íram meg, hogy még az adatvesztés se derült volna ki. :) Tehát nálam nem lehetett a hiba. De az egymondatos előírást sem valósította meg. Aztán mégis.
No, ekkor a két - nem is 20 éves - szoftver guru letöltött valami CPU lassító szoftvert, ronggyá lassították a Core i7-et, de még mindig működött! Aztán beletörődtek.