( Csab | 2019. 09. 07., szo - 08:19 )

Az I2C lehetővé teszi, hogy ne legyen master a buszon, hanem mindenki slave. Nincs kitüntetett master, a slave-ek arbitráció útján döntik el, hogy ki fog adni.

Mi van akkor, ha egyszerre ketten akarnak adni?

A hardver észleli, hogy ő 1-et akart küldeni, de a buszon 0 van kinn, tehát másvalaki húzta le a jelet 0-ra. Ez akkor fordul elő, ha mindketten egyszerre adtuk ki a start jelet, mindketten elkezdtünk adni, az ő üzenete még egészséges, az enyém már nem, mert tönkretette azzal, hogy 0-ra húzta a vonalat. Ebben az esetben az arbitrációs logika visszavált slave módba, elvesztettem az arbitrációt, ha viszont engem címzett a másik, slave-ként meg fogom kapni az ő üzenetét, amit velem egyszerre nekem akart küldeni.

Nálam a buszarbitráció az interrupt miatt kellett volna. A slave átveszi az irányítást a buszon és értesíti a mastert, hogy megszakításos esemény történt.

Működött is, de megbízhatatlanul a versenyhelyzetek miatt. Állandó üzenetvesztés, fagyás, belebeszélés,...