Pytanie:
Jak zakończyć wysyłanie danych przez I2C przez Slave lub Master?
alt-rose
2019-11-19 10:47:41 UTC
view on stackexchange narkive permalink

Powiedzmy, że Slave lub Master wysyła wiele bajtów do odbiornika na magistrali I2C, a liczba bajtów nie jest wcześniej zdefiniowana.Jak więc nadawca powie odbiorcy, że nie ma więcej danych do wysłania?

Jak dotąd rozumiem, że w przypadku, gdy nadawca jest Master, wysyła NACK, aby powiedzieć Slave (Odbiorcy), że nie ma więcej danych do wysłania.A po wysłaniu NACK wysyła warunek STOP, aby zakończyć sesję.

Ale zastanawiam się, jak odbywa się to uzgadnianie między Master a Slave, kiedy Slave jest nadawcą, a Master jest odbiorcą i tylko Slave (nadawca) wie, kiedy nie ma więcej danych do wysłania do odbiorcy?

Sześć odpowiedzi:
Passerby
2019-11-19 12:35:50 UTC
view on stackexchange narkive permalink

Ale zastanawiam się, jak odbywa się to uzgadnianie między Master a Slave, gdy Slave jest nadawcą, a Master jest odbiorcą i tylko Slave (nadawca) wie, kiedy nie ma więcej danych do wysłania do odbiorcy?

To nie powinno się wydarzyć. i2c to bardzo zdefiniowany protokół i każde urządzenie slave powinno być znane każdemu masterowi. Zwykle master żąda od slave transmisji i albo rozmiar wiadomości jest stały, wiadomość jest sekwencyjna, albo wiadomość zawiera, ile bajtów zostanie wysłanych.

  1. Master zapisuje adres rejestru, następnie master przełącza się na odczyt, a slave wysyła bajt. To wszystko, czego chce mistrz, wysyła przystanek.

  2. Master zapisuje adres rejestru, następnie master przełącza się na odczyt, a slave wysyła bajt, a następnie master czyta ponownie, więc slave wysyła następny bajt (lub ten sam bajt). Mistrz czyta, ilu chce, arbitralnie, a następnie wysyła stop.

  3. Master zapisuje adres rejestru, następnie master przełącza się na odczyt, a slave wysyła bajt. Ten bajt mówi masterowi, ile bajtów powinien mieć ten rejestr. Master czyta, a slave wysyła tyle, po czym master zatrzymuje się.

Cała komunikacja jest kontrolowana przez mastera. Niewolnik nie robi niczego, czego pan nie chce. Master kontroluje szybkość zegara (nie wytrzymując rozciągania zegara) i ile bajtów jest odczytywanych. W żadnym momencie slave nie powinien próbować wymusić linii danych, jeśli master tego nie nakazał. Struktura danych powinna być znana wcześniej.

Dokładnie.Jeśli twój niewolnik chce rozmawiać z mistrzem, powinien używać czegoś innego, a nie I2C.Być może linia przerwania do innego wejścia / wyjścia.W przeciwnym razie poczekaj, aż się odezwiesz.
Może się nawet zdarzyć, że slave nie ma własnego źródła zegara i całkowicie polega na zegarze I2C dostarczonym przez urządzenie główne.
@Michael To wydaje się niebezpieczne.W środowisku multi slave oznacza to, że jeśli zegar slave się rozciąga, inne urządzenie zostaje zablokowane.Nie jestem pewien, czy widziałem taki układ scalony i2c.
Justme
2019-11-19 11:39:23 UTC
view on stackexchange narkive permalink

To są dwie opcje.

Jeśli odbiornik slave nie przyjmie więcej danych, może ZAKŁĄCZYĆ bajt, ale master jest nadal odpowiedzialny za wysłanie warunku zatrzymania.

W przypadku nadajnika podrzędnego nie może on sygnalizować zatrzymania niczego, musi to być wcześniej znane lub może zostać zakodowane w danych, np.łańcuch tekstowy jest zakończony zerem, więc slave może przesyłać zera aż do zatrzymania mastera.

Zwykle jest to rzadkie i istnieje znany protokół, więc master musi zawsze wiedzieć z wyprzedzeniem, ile bajtów odczyta lub zapisze w jednej transakcji, nawet jeśli oznacza to najpierw transfer nagłówka o stałym rozmiarze między urządzeniami, ile ma przesłać.

Mitu Raj
2019-11-19 11:41:47 UTC
view on stackexchange narkive permalink

Powiedzmy, że Slave lub Master wysyła wiele bajtów do odbiornika na magistrali I2C, a liczba bajtów nie jest wcześniej zdefiniowana. A następnie w jaki sposób nadawca poinformuje odbiorcę, że nie ma już więcej danych? wysłać?

Jeśli nadawcą jest Master, wtedy wie, ile bajtów należy wysłać. Master zasygnalizuje koniec transferu danych, wysyłając warunek STOP po wysłaniu ostatniego bajtu i zakończy transakcję.

Pamiętaj, że Mistrz może to zrobić w każdej chwili. Slave może wysłać NACK, aby powiedzieć, że nie chce już otrzymywać danych. Ale tylko Mistrz decyduje, czy zatrzymać tę transakcję.

Ale zastanawiam się, jak przebiega ten uścisk dłoni między Mistrzem i Slave, gdy Slave jest nadawcą, a Master jest tylko odbiorcą Slave (nadawca) wie, kiedy nie ma już danych do wysłania do odbiornik?

Jeśli nadawcą jest Slave, Master powinien wcześniej wiedzieć, ile bajtów ma zostać odebranych. Master zasygnalizuje to, wysyłając NACK po odebraniu ostatniego bajtu, aby slave nie sterował już linią SDA. Master może teraz zainicjować warunek STOP i zakończyć transakcję.

Miłej lektury: TEXAS i2c

KingDuken
2019-11-19 11:50:48 UTC
view on stackexchange narkive permalink

Mam zamiar po trochu przetrawić cały Twój post ...

Powiedzmy, że Slave lub Master wysyła wiele bajtów do odbiornika na magistrali I2C, a liczba bajtów nie jest wcześniej zdefiniowana.

Ale należy to zdefiniować. Jeśli wysyłano lub otrzymywano losowe informacje, nigdy nie będziesz w stanie ich zinterpretować.

Zatem w jaki sposób nadawca powie odbiorcy, że nie ma więcej danych wysłać?

Producent określa, ile bitów musi otrzymać od slave'a. Master jest zwykle zapisywany przez jakieś urządzenie logiczne, takie jak mikrokontroler, procesor itp.

Jak dotąd rozumiem, że w przypadku, gdy jest to nadawca Następnie Master wysyła NACK, aby powiedzieć Slave (odbiornikowi), że jest nie ma więcej danych do wysłania.

Nie, nie do końca dobrze, prawda. „NACK” występuje, gdy master nie „słyszy” niczego od slave'a po wysłaniu tego bitu do slave'a. To tak, jakby rozmawiać przez telefon i mówić: „Cześć, jesteś tam?”

Ale zastanawiam się, jak przebiega ten uścisk dłoni między Mistrzem i Slave, gdy Slave jest nadawcą, a Master jest tylko odbiorcą Slave (nadawca) wie, kiedy nie ma już danych do wysłania do odbiornik?

Twoja definicja nadawcy i odbiorcy jest wypaczona. Zarówno master, jak i slave działają zarówno jako nadawca, jak i odbiorca. Master może zarówno wysyłać, jak i odbierać, w zależności od operacji zapisu lub odczytu.


HPomocna rada: Rozważ przeczytanie dowolnego arkusza danych I2C slave. Poszukaj słowa kluczowego „wiadomość”. To jest informacja, którą master wysyła do slave'a.

enter image description here Zdjęcie z tutaj... nie moje zdjęcie.

Master powinien być zaprogramowany tak, aby odczytywał taką samą długość ramki adresowej jak slave, która jest zdefiniowana w arkuszu danych slave.Możesz także ustawić adres slave'a, ale zwykle nie za dużo.Pomoże to rozwiązać konflikt, jeśli dwa slave'y mają ten sam adres.


Oto przykład części, z którą ostatnio pracowałem, jest to kontroler ADM1276 typu hot-swap.Jest zgodny ze specyfikacjami PMBUS, ale topologia I2C nadal obowiązuje.Informuje o interakcjach master i slave podczas wysyłania, odbierania, odczytywania i zapisywania bajtów.

enter image description here

gbarry
2019-11-19 13:42:21 UTC
view on stackexchange narkive permalink

W protokole i2c nie ma nic, co rozwiązałoby ten problem.Możesz sprawić, by to zadziałało, ale użyjesz do tego oprogramowania.Ponieważ i2c został zaprojektowany do komunikacji sprzętowej, zwykle obejmującej rejestry o stałej wielkości, nie dostarczono nic do obsługi danych o zmiennej długości.Sam się o tym przekonałem i musiałem rozwiązać ten sam problem, który rozważasz.

Ponieważ master kontroluje wszystko, wszystko, co slave może zrobić, to wysłać wskazówki dotyczące tego, ile danych ma wysłać.To, co zadziałało najlepiej, to wysłanie przez slave długości jako pierwszego bajtu.Wtedy master wie, o ile bajtów musi poprosić.

Erinell Barba
2020-04-30 05:51:56 UTC
view on stackexchange narkive permalink

Sam protokół nie pozwala na takie działanie, ale nie jest to nic, czego nie dałoby się programować.

Możliwe dwie możliwości:

  1. Nauczyciel najpierw zażąda wartości w tym przypadku liczby całkowitej (mniejszej niż 255) i będzie to rozmiar danych, które wyślesz później podczas następnego połączenia.>

  2. Jeśli znasz maksymalną długość wysyłanych danych, potraktuj to jako odniesienie, przekonwertuj je na tablicę lub ciąg i dodaj określony znak, który zamierzasz wykonać, aby zaznaczyć, gdziedane się kończą, aw master ponownie konwertujesz typ danych, których używasz.Mając najmniejsze dane, wypełnij resztę ciągu swoim znakiem specjalnym i voila, zawsze wyślesz ciąg o tym samym rozmiarze.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...