Buduję system złożony z kilku uC, komunikacja między nimi to szyna i2c. W systemie jest 1 master(zawsze ten sam), a reszta pracuje jako slave. Głowię się jak rozwiązać problem błędów w transmisji. Założenie mam takie, że w każdym urządzeniu określam "timeout" (np. 1s) po którym interfejs TWI jest resetowany. Niby całość działa ale nie do końca. W jaki sposób zrobić skuteczny RESET na i2c? Ma ktoś jakiś pomysł?
Pozdrawiam
Didn't find your answer? Ask the community — no account required.
A
Andy
U¿ytkownik "Luk@sz" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:45d75ca1$0$13179$ snipped-for-privacy@mamut2.aster.pl...
Gdy pojawia sie bledy moze powtarzac ostatnia transmisjie ?
Co to znaczy "Niby calosc dziala ale nie do konca" ? Tzn. co nie dziala ?
L
Luk
Andy napisał(a):
Rozchodzi mi sie o to jak powinna wyglądać sekwencja RESET. Przykładowo, pojawiło się zakłócenie na szynie, master wysłał daną i nie dostał ACK od SLAVE. W tej sytuacji MASTER powinien zresetować magistrale i ponowić transmisję, natomiast SLAVE powinien zresetować sprzętowe TWI. Jakim rozkazem to zrobić?
Czy jeżeli jestem jako SLAVE i zechcę wysłać STOP to co się wydarzy?
Pozdro
P
Patryk Sielski
Luk@sz snipped-for-privacy@o2.pl pisze:
Ja wysy³am po prostu STOP i u mnie dzia³a :-)
To musi staæ siê MASTERem. SLAVE zgodnie z za³o¿eniami tylko s³ucha.
A
Andy
U¿ytkownik "Patryk Sielski" snipped-for-privacy@elka-usun.pw.edu.pl> napisa³ w wiadomo¶ci news:39da9$45d77c61$57ceab2d$ snipped-for-privacy@news.chello.pl...
Jesli chodzi o AVR to pisza cos w dokumentacji, ze jesli w przypadku SLAVE ustawimy bit STO to nie generuje to sekwencji STOP na liniach TWI ale doprowadza maszyne stanow od TWI do stanu poczatkowego.
Nie ma czegoś takiego jak sekwencja resetu na i2c. Do synchronizacji, czyli ustawienia stanu początkowego w automacie slave'a, służą sekwencje start/stop. Po prostu jeżeli coś poszło nie tak to robisz stop i ponawiasz transmisję.
Wysyłając stop.
Po otrzymaniu start.
Nie ma czegoś takiego. Od wysyłania poleceń jest master. Slave ma słuchać i ewentualnie wysłać acka albo dane (jeżeli są z niego czytane) w takt zegara mastera. Jeżeli slave stwierdzi, że coś mu się nie zgadza, to albo może nie wysłać acka, albo możesz zrobić jakiś rejestr kontrolny w slave, z którego czytasz np. kod błędu ostatniej operacji na magistrali, albo numer stanu w automacie stanowym slave'a (ale to raczej dotyczy wyższej warstwy niż datalink, np. ogólnej spójności prawidłowo przesłanych danych).
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.