Wire.send() - valojaban mennyit kuld az i2c buszra?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
pete
DrótVégénSzéndarab
Hozzászólások: 32
Csatlakozott: 2010. április 26. hétfő, 6:00

Wire.send() - valojaban mennyit kuld az i2c buszra?

Hozzászólás Szerző: pete »

Egy erdekes dologra lettem figyelmes... Ket arduino panelt kotottem ossze i2c-vel, Arduino0018 kornyezetben forditottam a programokat.

A kod annyi hogy az egyik master, a masik slave modban jelentkezik fel a buszra. Mindket oldalon van egy-egy buffer definialva. A master elkuld egy Wire.requestFrom(slave_cime, masterbufsize) -t. A slave-n bekattan az esemenykezelo, es abban egy Wire.Send(foo) van, foo egy char*, joval kisebb mint a masteren a masterbufsize. A masteren kidumpolom mit kapok a soros portra, az adat megjon, de mindig 32 byte lesz, az elso x byte az, amit a slaven megirtam hogy kuldjon el, a maradek valami szemet....

Az i2c leirasok szerint teljesen szabalyos ha a kliens kevesebbet kuld mint amit ker a master. Erdekes hogy a Wire slave fogado reszeben en nem latom hogy barhol megjelenne a az a szam amit a master requestfrom hivasanal beadok. Probaltam olyat is, h (byte*)-ra castoltam a slave-n a puffert es kezzel vertem bele hogy pl 10 byte-ot kuldjon a send()-ben, valtozas semmi.

Valahol futolag olvastam hogy talan a Wire lib-ben van egy 32 byte-os limit... Google semmit nem dobott ki nekem.

Szoval adott a kerdes: mennyit is kuld a Wire.Send(buffer)? :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az I2C esetén 2 féle kommunikáció lehet:
- master kezdeményez, slave válaszol. Master kéri az adatokat, slave kuldi, master ack/nack jellel jelzi, hogy kell e még neki.
- maszer kezdeményez és master kuld. Slave veszi, és jelzi, hogy meg van, jöhet a következő. A mater vagy STOP-l jelzi hogy vége, vagy küldi a következőt.

Bascomban a slave küldi az adatot, ott meg kell adni, hogy maximum hány adatot kérhet a master. Byte-ban tárolódik, így 255 (vagy 254?) lehet a maximum. Ha kevesebbet adok meg, akkor a slaveből 255-t olvas a master....
(I2CSlave library)


Arduino alatt:
nem láttam ilyen korlátot (elvileg a slave esetén a tömbméret limitálja hogy mennnyit küldhetsz). leglábbis a wiresend.html súgó alapján.

A wire.cpp és a wire.h-ban a Bufferméret amit lefoglal a I2C: BUFFER_LENGTH változóban 32 byte. Így ennyi a limitje (vagy átírod nagyobbra :)
Fontos! M168 esetén a sorosporti vételi buffert vedd lejjebb (alapban 128), mert kifutsz a SRAM helyből!
Válasz küldése