I2C (Arduino)

Pavel Hudecek edizon na seznam.cz
Sobota Prosinec 12 22:59:03 CET 2020


Nevím jak to řeší Arduino knihovny, ale HW to má takto:
   Po každém přenosu byte přijímající strana odpoví bitem ACK=0 a to už včetně adresy. Tzn. první na čem to může zhavarovat je, že slave neodpoví na adresu. Pak když master zapisuje do slave, zase slave může říct dost tím ACK. Při čtení ze slavu, musí naopak master potvrzovat ACK. U nekonečných věcí typu ADC se takto obvykle má čtení zarazit. Nakonec se posílá stop bit, ale to je mimo běžnou komunikaci, stejně jako start.
   No a pak je ještě clock stretching: Když slave nestíhá, může SCL podržet v 0 a master by měl na základě toho čekat (libovolně dlouho). A tady je to zajímavý, protože některý (nebo všechny, nevím) ATmegy mají v implementaci chybu, která většinou nevadí, ale RPI zero (a možná i nějaký další, nevím) mají taky chybu a to zrovna takovou, že jejich setkání vede k zátuhům:-)

PH

Od: Petr Zapadlo
Však já tam tuhle funkci používám, ale byl jsem svědkem toho, že I2C 
slave byl nějaký zaseklý a Atmegu mi resetoval WDT, protože se čekalo na 
nějakou operaci na I2C sběrnici.

Snažím se tomu nějak předejít a když nad tím tak přemýšlím, tak podle 
mě  už Wire.requestFrom(I2C_SLAVE_ADDRESS, 10); musí zajistit ten přenos 
dat do bufrů, které jsou pak testovány pomocí Wire.available()

Jelikož nikde nejsou nějaké pauzy na přenos, a funkce RequestFrom a 
available jdou hned za sebou, tak podle RequestFrom končí až v okamžiku, 
kdy je v bufru 10 byte a pokud zahapruje Slave, tak se to pozná už v 
rámci RequestFrom.

A tem jsem možnost nějakého timeout nenašel.

Myslím si to správně?


Dne 12. 12. 20 v 21:33 Petr Labaj napsal(a):
> Já o Arduinu vím pendrek. Ale podle dokumentace je tam funkce 
> available(),
> která je určitě neblokující a říká, kolik dat je k dispozici.
> Takže si timeout a ošetření kolapsu partnera snadno uděláte podle 
> libosti sám.
>
>
> ***********************
> Dne 12.12.2020 v 21:04 Petr Zapadlo napsal(a):
>> Zdravím,
>>
>> měl bych dotaz k použití I2C sběrnice, resp k její obsluze.
>>
>> Je to na ATmega328. Příkladový kousek kodu:
>>
>> Wire.requestFrom(I2C_SLAVE_ADDRESS, 10);
>> while (Wire.available()) {
>>       pole[i] = Wire.read();
>>       i++;
>>       if (i>=10){break;}
>>     }
>>
>> A můj dotaz, jak se to bude chovat když Slave nějak zahapruje.
>>
>> Funkce Wire.requestFrom(I2C_SLAVE_ADDRESS, 10); má vrátit počet byte, 
>> tj v mém případně bych měl dostat  číslo 10. Už tato funkce načte 
>> těch 10 byte do bufru? A nebo jen dá pokyn "otroku posílej data" a na 
>> vlastní přenos nečeká?
>>
>> Má smysl testovat návratovou hodnotu z této funkce?
>>
>> Když Slave neodpoví, kde se to zasekne, bude se někde na něco čekat? 
>> Je tam nějaký timeout?

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20201212/3979f34c/attachment.html>


Další informace o konferenci Hw-list