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)?
Wire.send() - valojaban mennyit kuld az i2c buszra?
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!
- 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!