[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