Sto cercando alternative (ragionevolmente facili da usare e ben testate) a Wire
libreria. Wire
funziona molto bene, ma: ho solo bisogno che Arduino funga da master I2C e la libreria Wire
sembra essere un vero spreco di risorse:
Il mio obiettivo è inviare dati in blocco (ad esempio 32 o 64 byte). Questi dati sono già presenti in un array in SRAM. Ora, quando usi la libreria Wire
, chiami la funzione TwoWire::write
che copia i tuoi dati in un secondo buffer. Successivamente, Wire
utilizza la TWI
libreria dove twi_writeTo
copia nuovamente i dati in un 3 ° tampone. È “un po goffo, non è” vero?
Ho visto DSSCircuits / I2C-Master-Library ma non ne sono sicuro quanto è maturo perché non cè stato alcun commit dopo il commit iniziale che ora ha 3 anni.
Commenti
- Hai effettivamente problemi di utilizzo della ram? Ottimizzare qualcosa prima che diventi un problema è spesso uno sforzo inutile.
- Tutto si riduce alla questione di voler farlo funzionare presto e / o portabile anziché voler farlo funzionare in modo ottimale . Ovviamente sei libero di scaricare il manuale del programmatore ATmega ' e scrivere sulla periferica si registra.
- dsscircuits ' Arduino I2C master library La pagina web mostra cinque revisioni dellI2C libreria a cui è destinato il tuo collegamento GitHub. Probabilmente è un buon punto di partenza per le revisioni che hai in mente. Se Wire ha avuto correzioni da gennaio 2012 potresti è necessario aggiungerli a I2C.
- > Le alternative alla libreria Wire per I2C scrivono la propria. i2c è uno dei protocolli più facili da scrivere da zero.
Risposta
Non vedo alcuna obiezione per utilizzare DSS Circuits I2C Master Library .
Potrebbe non essere stato aggiornato per un paio di anni, ma se funziona non funziona ” non è necessario. Non è che le librerie per microcontrollori debbano supportare nuovi driver di stampa, driver video, ecc.
Se funziona, funziona.
Il chip non è cambiato e lunica vera ragione per gli aggiornamenti in questi giorni è se lIDE cambia (o il compilatore cambia) in modo tale da introdurre errori di compilazione. Cose del genere sono accadute abbastanza di recente con cose come PROGMEM che hanno regole più rigide, per esempio.
Commenti
- Questa libreria sembrava molto promettente, ma nota che lo fa supporta solo target AVR. Poiché i core Arduino sono stati sviluppati per una varietà di architetture, questa libreria non " funziona solo " per qualsiasi scheda compatibile con Arduino. Ad esempio, non è compatibile con Adafruit ' s Feather basato su STM32F405
Answer
Anche la libreria AVR Procyon vale la pena controllare. È un po vecchio ora ma molto professionale e un po minimalista. Non molte dipendenze, dovrebbe andare bene usare solo il modulo I2C. Da allora non cè praticamente nulla di nuovo nella parte I2C di AVR.
Risposta
La classe Cosa TWI è un approccio molto diverso al supporto del driver di dispositivo I2C. Non utilizza affatto SRAM extra per i buffer. Se un driver di dispositivo non blocca, deve gestire il buffering necessario. Anche la classe Cosa TWI supporta linterazione tipica con dispositivi I2C come master / slave, schemi di “scrittura registro-lettura dati” e transazioni quando si utilizza il multi-threading.
È disponibile una libreria Arduino-TWI di software e hardware. Utilizza la libreria Arduino-GPIO e può essere utilizzato su schede basate su AVR e SAM.
Alcuni esempi: TWI Scanner , Orologio / calendario in tempo reale DS3231 , Adattatore LCD I2C con PCF8574 .
Risposta
Ho creato personalmente 2 librerie per un utilizzo più semplice e chiamate coerenti:
una per i target AVR:
cI2C
un altro che utilizza le stesse funzioni per tutti gli altri target (che fondamentalmente è un wrapper per la libreria Wire):
WireWrapper
Entrambi sono disponibili allinterno del gestore di librerie IDE.
Entrambi funzionano come master senza utilizzare interrupt e vengono testati su diverse destinazioni con diversi slave:
– UNO, Nano per cI2C
– Zero, Due & ESP8266 per WireWrapper
Risposta
Puoi utilizzare un approccio completamente diverso alla domanda principale.Chiedendo alternative hai dato ragione a questo: sbarazzarti del codice inutilizzato nel binario. È possibile ottenere la rimozione del codice inutilizzato senza utilizzare effettivamente una libreria alternativa. Tieni presente che puoi istruire il compilatore e il linker per escludere il codice inutilizzato dal binario compilato. Usa semplicemente i flag di compilazione:
CFLAGS += -Wl,-static CFLAGS += -ffunction-sections CFLAGS += -Wl,--gc-sections
La funzione Rach sarà nella sua sezione.
LDFLAGS += -Wl,-gc-sections
Questo dice a GCC di inviare il flag -gc-sezioni al linker che rimuoverà le sezioni inutilizzate. E voilla! Le sezioni inutilizzate vengono rimosse.