Alternatywy dla biblioteki Wire dla I2C

Szukam (dość łatwych w użyciu i dobrze przetestowanych) alternatyw dla Wire biblioteka. Wire działa bardzo dobrze, ale: potrzebuję tylko Arduino do działania jako master I2C, a biblioteka Wire wydaje się być prawdziwym marnotrawstwem zasoby:

Moim celem jest wysłanie danych en bloc (np. 32 lub 64 bajty). Te dane już znajdują się w tablicy w SRAM. Teraz, gdy używasz biblioteki Wire, wywołujesz funkcję TwoWire::write, która kopiuje dane do drugiego bufora. Następnie Wire korzysta z biblioteki TWI, w której twi_writeTo kopiuje dane ponownie do Trzeci bufor. To „trochę niezgrabne, prawda?”

Widziałem DSSCircuits / I2C-Master-Library , ale nie jestem pewien jakie to dojrzałe, ponieważ nie było żadnego zatwierdzenia po pierwszym zatwierdzeniu, które ma teraz 3 lata.

Komentarze

  • Czy faktycznie masz problemy z użyciem pamięci RAM? Optymalizacja czegoś, zanim stanie się problemem, jest często zmarnowanym wysiłkiem.
  • Wszystko sprowadza się do pytania, czy chcesz, aby to zadziałało wkrótce i / lub przenośnie a nie chcąc, aby działało optymalnie . Oczywiście możesz pobrać instrukcję ' programisty ATmega i napisać do urządzenia peryferyjnego rejestruje się samodzielnie.
  • dsscircuits ' Główna biblioteka Arduino I2C strona przedstawia pięć wersji I2C biblioteka, do której jest przeznaczony Twój link na githubie. Prawdopodobnie jest to dobry punkt wyjścia dla zmian, o których myślisz. Jeśli Wire wprowadził poprawki od stycznia 2012 r., możesz trzeba dodać je do I2C.
  • > Alternatywy dla biblioteki Wire dla I2C napisz własną. i2c to jeden z łatwiejszych protokołów do pisania od zera.

Odpowiedź

Nie widzę żadnych zastrzeżeń do korzystania z obwodów DSS Circuits I2C Master Library .

Być może nie była aktualizowana przez kilka lat, ale jeśli działa, to nie ” nie trzeba. To nie jest tak, że biblioteki dla mikrokontrolerów muszą obsługiwać nowe sterowniki drukarki, sterowniki wideo itp.

Jeśli to działa, to działa.

Chip się nie zmienił , a jedynym prawdziwym powodem aktualizacji w dzisiejszych czasach jest zmiana IDE (lub zmiana kompilatora) w taki sposób, że wprowadza błędy kompilacji. Takie rzeczy zdarzyły się całkiem niedawno, gdy na przykład PROGMEM miał bardziej rygorystyczne reguły.

Komentarze

  • Ta biblioteka wygląda bardzo obiecująco, ale pamiętaj, że tak obsługują tylko cele AVR. Ponieważ rdzenie Arduino zostały opracowane dla różnych architektur, ta biblioteka nie będzie " działać tylko " dla żadnej płyty kompatybilnej z Arduino. Na przykład nie jest kompatybilny z Adafruit ' s STM32F405 opartym na Feather

Odpowiedź

Warto również sprawdzić bibliotekę Procyon AVR . Jest teraz trochę stary, ale bardzo profesjonalny i trochę minimalistyczny. Niewiele zależności, powinno wystarczyć użycie tylko modułu I2C. Od tego czasu nie ma prawie nic nowego w części AVR I2C.

Odpowiedź

Cosa TWI to zupełnie inne podejście do obsługi sterowników urządzeń I2C. W ogóle nie używa dodatkowej pamięci SRAM dla buforów. Jeśli sterownik urządzenia nie blokuje, musi obsługiwać niezbędne buforowanie. Również klasa Cosa TWI obsługuje typową interakcję z urządzeniami I2C, takimi jak master / slave, wzorce „zapis danych do odczytu i odczytu” oraz transakcje przy użyciu wielowątkowości.

Dostępna jest biblioteka oprogramowania i sprzętu Arduino-TWI . Wykorzystuje bibliotekę Arduino-GPIO i może być używany na płytach opartych na AVR i SAM.

Kilka przykładów: TWI Scanner , DS3231 Zegar / kalendarz czasu rzeczywistego , Adapter I2C LCD z PCF8574 .

Odpowiedź

Sam utworzyłem 2 biblioteki dla łatwiejszego użycia i spójnych połączeń:

jedna dla celów AVR:
cI2C

inny korzystający z tych samych funkcji dla wszystkich innych celów (co w zasadzie jest opakowaniem biblioteki Wire):
WireWrapper

Oba są dostępne w menedżerze biblioteki IDE.
Oba działają jako master bez przerywania i są testowane na różnych obiektach z różnymi slaveami:
– UNO, Nano dla cI2C
– Zero, należne & ESP8266 dla WireWrapper

Odpowiedź

Możesz zastosować zupełnie inne podejście do głównego pytania.Pytając o alternatywy, podałeś powód: pozbycie się nieużywanego kodu w pliku binarnym. Możesz usunąć nieużywany kod bez korzystania z alternatywnej biblioteki. Pamiętaj, że możesz poinstruować kompilator i konsolidator, aby wykluczyć nieużywany kod ze skompilowanego pliku binarnego. Po prostu użyj flag kompilacji:

CFLAGS += -Wl,-static CFLAGS += -ffunction-sections CFLAGS += -Wl,--gc-sections 

Funkcja Rach będzie w swojej własnej sekcji.

LDFLAGS += -Wl,-gc-sections 

To mówi GCC, aby wysłał flagę -gc-sekcja do linkera, który usunie nieużywane sekcje. I voilla! Nieużywane sekcje są usuwane.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *