[elektro] szoftver I2C C-ben

Moczik Gabor pm_levlista at progzmaster.hu
Fri Aug 21 16:24:22 CEST 2009


Moczik Gabor wrote:
> A fogadás interruptban működik, ezt kell a megfelelő ISR rutinba tenni:
>      if ((SSPIE && SSPIF) || (BCLIF && BCLIE)) {
>          i2c_isr();
>          if (i2c_state==I2CS_DATA_RECEIVED) {
>              x = i2c_slave_rx();
>              i2c_release_bus();
> 
>              // x-ben az adat...
> 
>          } else if (i2c_state==I2CS_DATA_REQUEST) {
>              i2c_slave_tx( valami_adat );
>          }
>      }

Most néztem át mégegyszer, mert furcsálltam valamit, régen piszkáltam 
már ezt.

Az i2c_readbyte(cím,cmd) utasítás először kiad egy 
i2c_sendbyte(cím,cmd)-nek megfelelő utasítást, a végén restart 
feltétellel, utána egy kiolvasási utasítást. Ez a slave-en a fenti 
ISR-ben úgy fog látszódni, hogy érkezik egy I2CS_DATA_RECEIVED, ekkor 
megkapjuk a cmd értékét, ami mondjuk parancsként használható, hogy mit 
akarunk kiolvasni, utána jön még egy I2CS_DATA_REQUEST, ekkor 
elküldhetjük az adatot.

pl. így:

      if ((SSPIE && SSPIF) || (BCLIF && BCLIE)) {
          i2c_isr();
          if (i2c_state==I2CS_DATA_RECEIVED) {
              cmd = i2c_slave_rx();
              i2c_release_bus();

              if (cmd>0x80) {
                  // csinálunk valami-t
              } else {
                  // nem teszünk semmit, kiolvasás lesz
              }
          } else if (i2c_state==I2CS_DATA_REQUEST) {
              // cmd értékét az előbb kaptuk meg
              switch(cmd) {
                  case 0x01  :i2c_slave_tx( valami_adat ); break;
                  ...
              }
          }
      }

Remélem érthető a lényeg...
Univerzálisabbra lehet szabni, ha mondjuk az i2c_sendbyte át lenne írva 
olyanra, hogy megadható az adat hossza meg egy char* ami az adattömbre 
mutat, és akkor nem csak 1 byte-ot küldhet. Ugyanígy az i2c_readbyte 
megoldható az elején lévő küldés nélkül, vagy inkább ott is megadható 
két tömb_ptr és két hossz, tetszőleges mennyiségű adat küldhető és 
fogadható.

Ha tetszőlegesen vegyesen kell össze-vissza küldeni, fogadni, megint 
küldeni egy cikluson belül, akkor meg úgyis csak kézzel lehet 
START/STOP/RESTART feltételeket kiadogatni.



More information about the Elektro mailing list