I2c -harjoittelua

Jos leikkii i2c:tä c++:n kanssa, niin pitäisikö start- ja stop-koodeille antaa joku parempi etusija-arvo kuin 0 - ja 1 -koodeille vai voisiko vain ajatella, että väylä siirtää neljää erityyppistä koodia ja isännän ja rengin asia on ymmärtää, mitä mikäkin koodi tarkoittaa.

Kun linjalle tulee stop, tarkoittaako se sitä, että kaikki rengit kuuntelevat seuraavaa viestiä ja yrittävät tunnistaa oman numeronsa eli stopia seuraavan viestin olisi syytä olla jonkun rengin osoite.

Start:tia seuraavan tavun pitää olla laitteen osoite. Stop:in jälkeen kukaan ei kuuntele mitään.

bus-piraten I2C moodissa on kätevä konventio:

  • [ = START
  • ] = STOP
  • r = read one byte

Ja muut merkit sitten tulkitaan tavuiksi, 0xFF ja 255 tarkottaa samaa, yli 255:n arvot on virhe. Tällä tavoin voi kätevästi ilmaista mitä pitäis linjalla tapahtua, esim jos miellä on laite jonka 7-bit osoite on 0x1E (jolloin read-osoite on 0x3D ja write osoite on 0x3C):

[ 0x3C 0xA [ 0x3D r r r r ]

Tässä luemme (yleisen kovention mukaisesti) laitteen rekisteristä 0xA 4 tavua eteenpäin. Huomaa että itse I2C protokollan speksi ei sano mitään siitä että haluttu rekisteri ilmoitetaan kirjoittamalla se laitteelle, se on vain yleinen tapa. I2C speksi itsessään ei myöskään sano mitään siitä että nostaako laite sisäisesti rekisterin osoitetta joka luvulla vai ei, sekin vaan sattuu olemaan yleinen käytäntö. Lue laitteen datasheet todella tarkkaan.

Huomaa myös että meillä on 2 starttia (pitää vaihtaa laite lukutilaan) ja vain yksi stop, tämä on periaatteessa oikeampi tapa hoitaa asia kuin erinäisten korkeamman abstraktiotasojen kirjastojen tapa jossa rekisterin kirjoituksen jälkeen tulee stop ja sitten start. Jotkut laitteet tukevat vain tätä “oikeaa” tapaa.

Mutta I2C:n bitbangaaminen itse ei ole järkevää, asiaan on enemmän tai vähemmän hyvin toimivia kirjastoja mutta oikeasti kannattaa ehdottomasti mennä siten että on rautauki (toivottavasti ei kauhean buginen kuten esim raspeissa…) ja ko raudan fiksuudesta sitten hiukan riippuu miten paljon detaileja tarttee hanskaa itse.