I2C czy slave mo?e zg?osi? masterowi

Jan 30, 2009 10 Replies

Tak jak w temacie - czy protokół I2C dopuszcza możliwość zasygnalizowania masterowi, że slave ma dla niego informację do odebrania? A jeśli tak, czy Atmega załatwo to sprzętowo? Teraz robię to przez cykliczny polling, ale w przypadku np przycisku czy innego urządzenia typu "trigger" trochę to nieefektywne, bo nie dość że zabiera cenny czas procka, to odebrana informacja jest mało precyzyjna w czasie (co ma spore znaczenie w przypadku np stopera).



Dariusz Żołna


Niech zgłosi to przez osobną linię. Można przez tą samą wyłączyć I2C, jeśli nic tam nie jest nadawane w danym czasie. Wtedy SLAVE sobie ustawi "0" jeśli chciałby coś nadać. MASTER wysłucha prośby i włączy I2C.

Sylwester Łazar pisze:

Mogę zrobić tylko upgrade firmware, dodatkowa linia nie wchodzi w grę.

Dariusz Żołna

Pisałem, że można po tej samej np. SDA. Problem w tym czy z obu stron są ukontrolery, czy SLAVE jest sprzętowy. Np. jeśli sprzętowy, to należy dodać jeden przewód od wyłącznika do SDA. Przycisk - zwiera sygnał do masy -> Master włącza port I2C. Jest jeszcze problem, bo MASTER musi poczekać na zwolnienie przycisku. Trudno tak dyskutować, jak nie widać układu.

Sylwester Łazar pisze:

Po obu stronach są uC, przycisk także przechodzi przez uC. Master - Atmega128, slave - w większości Atmega8.

Dariusz Żołna

To w takim razie:

1) Normalna praca i2c wyłaczony. MASTER czeka na SDA na sygnał -impuls "0". Zakładam, że linia podwieszona jest do VCC przez rezystor. 2) Jeśli "0" - MASTER włącza I2C.

Nie miałem tego ATMEGA nigdy w ręce, ale widzę, że na pinie 26 (SDA) jest też przerwanie INT1. W takim razie nie trzeba pollingu, a przerwanie zostanie obsłużone sprzętowo.

Dariusz Zolna pisze:

No to sprawe masz prosta. Jak master nic nie nadaje to przelacza sie w slave i masterem staje sie to twoje urzadzenie. Jesli oba beda chcialy nadawac to tez nic wielkiego bo I2C obsluguje kolizje.

T.M.F. pisze:

Tyle że ja tych urządzeń mam kilkanaście, z którymi w większości jest transmisja ciągła, a tylko 2 dostarczają danych sporadycznie. Chyba zostanę przy pollingu, bo widzę że tylko skomplikuję sprawę i zmniejszę niezawodność.

Dariusz Żołna

Sylwester Łazar pisze:

Można też przy interfejsie 2-liniowym zrezygnować z protokołu I2C i zrobić zwykły RS232 z wykrywaniem kolizji. Na jednej linii Master gada do pozostałych procesorów, na drugiej (z pull-up'em do zasilania) gadają inne procki sterując linią w trybie open drain (wystawiając tylko masę lub Hi-Z). Jeżeli dwa Slave'y jednocześnie będą chciały coś nadać, wystarczy najpierw posłuchać czy coś już nie leci na linii a do tego wykryć kolizję np. sprawdzając CRC ramki. Maksymalna prędkość takiego współdzielonego RS232 zależy od długości linii i liczby Slave'ów.

Użytkownik "Dariusz Zolna" snipped-for-privacy@usenet.com napisał w wiadomości news:gm17ds$km9$ snipped-for-privacy@inews.gazeta.pl...

Nie wiem czy Atmega w ogóle to obsługuje i czy robi to poprawnie, ale możesz zrobić taki eksperyment: niech slave przetrzyma chwilę SCL w stanie niskim w momencie, gdy master wystawił SCL=0. Jeśli master to wykryje (jako dostęp innego mastera lub nawet jako błąd) i nie wywali się na tym (tzn, nie będzie chciał na siłę wystawiać danych tylko poczeka na SCL=1), będziesz mógł bez przeszkód dokończyć bieżącą transmisję do aktualnie adresowanego urządzenia i zaraz potem wywołać odczyty z interesujących Cię slav'ów (oczywiście nie rozróżnisz, który chciał dostępu, ale masz ich mało zdaje się).

e.

Dobry pomysł. I w tym kierunku trzeba by pójść. Może spróbować się podczepić (dokleić) i przesłać dodatkowy bajt danych do aktualnie odczytywanego SLAVEA - jeśli naciśnięto przycisk.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required