Załóżmy, że mamy szynę I 2 C. 400 kHz . Jest jeden master i kilka urządzeń slave. Chcielibyśmy wprowadzić jeszcze jedno urządzenie podrzędne, ale niestety ma ono tylko 100 kHz.
Oczywiście, solidne wybory projektowe to:
- po prostu uruchom tę magistralę przy 100 kHz
- użyj oddzielnych magistral dla urządzeń peryferyjnych 400 kHz i 100 kHz
Ale pytanie dotyczy tylko włamania: co, jeśli użyjemy jednej magistrali i adresujemy urządzenia 400 kHz przy 400 kHz, i przełączamy magistralę na 100 kHz, kiedy mówimy do urządzenia podrzędnego 100 kHz?
A może wolniejszy niewolnik źle zachowuje się w odpowiedzi na hash 400 kHz, który widzi na liniach I 2 C, ponieważ błędnie myśli, że jest adresowany?
Czy możemy polegać na urządzeniach 100 kHz, aby nadal przetwarzać sygnał I 2 C 400 kHz wystarczająco dobrze, aby niezawodnie ignorować komunikaty skierowane do innych urządzeń podrzędnych?
Odpowiedzi:
Jak sugerujesz, takie postępowanie nie jest dobrą praktyką inżynierską. Podczas gdy niektóre urządzenia najbardziej ignorowałyby ruch, którego nie są w stanie odbierać (undspróbkowanie), inne urządzenia mogą zagracać magistralę błędnymi ramkami.
Zatem odpowiedź, której szukasz, zależy od specyfiki aplikacji, na przykład:
Oczywiście trudno jest przewidzieć, co stanie się z urządzeniem działającym poza jego specyfikacją kilka lat później.
Inną opcją jest uruchomienie linii wyłączania w celu spowolnienia urządzeń lub przepuszczenie linii zegara (pod warunkiem, że nie są one w stanie wygenerować sygnału zegara) przez bramkę AND.
źródło
Inną opcją, jeśli nie masz dodatkowej magistrali I2C wychodzącej z urządzenia nadrzędnego, jest użycie przełącznika I2C, takiego jak PCA9543A / 43B . Umieść urządzenia podrzędne 400 kHz na jednej gałęzi, a urządzenia podrzędne 100 kHz na drugiej i przełącz je w razie potrzeby.
źródło
Nie ma gwarancji, że urządzenie 100 kHz nie będzie źle się zachowywać pod wpływem ruchu 400 kHz - wszystko, od NACK po zawieszenie magistrali, jest możliwe.
Powinieneś albo uruchomić całą magistralę przy 100 kHz, albo mieć osobną wolną magistralę dla twojego wolnego urządzenia peryferyjnego.
źródło
Inne opcje. Zamiast mieć dwie magistrale, możesz po prostu użyć jednej dodatkowej linii (łatwiejsze z oprogramowaniem / bitbanged I 2 C). Oddzielna linia zegara lub osobna linia danych. Lub użyj ai 2 c bufor albo I 2 przełącznik C, aby umieścić ten pojedynczy procesor 100MHz na swój własny odcinek, bez konieczności zmieniania czegokolwiek innego.
Lub po prostu przetestuj to na jednym autobusie. Całkiem możliwe, że układ 100 kHz wpłynie na linię. Może czytać co 4 bity i ostatecznie myśleć, że został rozwiązany. Ale musiałby zobaczyć prawidłowy warunek początkowy, a następnie czytać co 4 bity z następnych 32 bitów, ponieważ jest to dokładny adres, albo musiałby spróbować odczytać kolejne kilka bajtów jako prawidłową informację, aby zapisać do swoich rejestrów lub spróbuj wyrejestrować dane. Nie sądzę, że to zbyt prawdopodobna sytuacja. Najlepiej jest po prostu podłączyć go do obwodu testowego i sprawdzić.
Należy zwrócić uwagę na dwie rzeczy: jeśli jest to jednorazowy obwód lub robisz tylko kilka, łatwo jest zaryzykować lub zmienić. Jeśli jest to przedmiot produkowany masowo, możesz chcieć mieć drugi autobus. Po drugie, należy wziąć pod uwagę, że układ 100 kHz został po prostu wyprodukowany zgodnie z oryginalną specyfikacją I 2 C i może bardzo dobrze obsługiwać wyższe częstotliwości taktowania. Po prostu nie został przetestowany pod kątem wyższej prędkości 400 kHz.
źródło
Konstrukcja magistrali I2C jest taka, że -
Z powodu różnicy w sile sterownika i pojemności linii teoretycznie byłoby możliwe, że jedno urządzenie zareaguje na nieco powolny opadający brzeg na SCL, napędzając SDA tak szybko, że inne urządzenie zobaczy SDA jako pierwsze.
Możliwe może być zdefiniowanie wielu progów logicznych na SCL i określenie, że aby opadające zbocze na SCL było uważane za nadchodzące po zboczu na SDA, nadal musi znajdować się powyżej 2/3 VDD po wykryciu zbocza na SDA, ale urządzenie może nie dochodzić SDA w odpowiedzi na opadające zbocze SCL, dopóki nie spadnie poniżej 1/3 VDD, ale specyfikacja nie jest zapisana w takich kategoriach.
Zamiast tego urządzenia, które widzą prawie równoczesne opadające zbocza na SDA i SCL, ogólnie uznają zbocze na SCL za pierwsze, chyba że jest ono zasadniczo poprzedzone zboczem na SDA. Niektóre implementacje I2C radzą sobie z tym, synchronizując SCL i SDA z zegarem zewnętrznym i wymagając, aby zbocze opadające SDA było obserwowane dwa okresy przed okresem SCL, aby można było uznać je za pierwsze. Jeżeli prędkość operacji na SCL i SDA jest zbyt duża w stosunku do zegara synchronizującego, urządzenia mogą odbierać dowolne sekwencje wysokich i niskich sygnałów na SCL i SDA; jeśli jedna z tych sekwencji wygląda, jakby adresowała wolne urządzenie, może odpowiednio zareagować, blokując wszelką inną komunikację.
Nie ma szczególnego powodu, dla którego urządzenia na magistrali I2C powinny polegać na synchronizacji z zegarem systemowym (lepsze byłoby wykrycie dwóch dyskretnych progów na SCL), ale faktem jest, że niektóre urządzenia faktycznie działają w ten sposób. Zauważ, że nawet jeśli urządzenie, które wewnętrznie było ograniczone do niskich prędkości, chciało koegzystować z szybką magistralą, prawdopodobnie musiałoby co najmniej stosować rozciąganie zegara za każdym razem, gdy coś się dzieje, co mogłoby go zainteresować.
Spowodowałoby to wolniejszą komunikację niż w innym przypadku, ale spadek prędkości prawdopodobnie nie byłby tak zły, jak jest to wymagane w przypadku projektu synchronizowanego zegarem (rzeczywista wielkość, o jaką wolne urządzenie rozciąga zegary, prawdopodobnie nie być tak złym, jak kwota, o którą należy spowolnić zegar, aby uniknąć awarii w najgorszym przypadku w zsynchronizowanych zegarach).
źródło