Estoy buscando alternativas (razonablemente fáciles de usar y bien probadas) a la Wire
biblioteca. Wire
funciona muy bien, pero: solo necesito que Arduino actúe como maestro I2C y la biblioteca Wire
parece ser un verdadero desperdicio de recursos:
Mi objetivo es enviar datos en bloque (por ejemplo, 32 o 64 bytes). Estos datos ya se encuentran en una matriz en SRAM. Ahora, cuando usa la biblioteca Wire
, llama a la función TwoWire::write
que copia sus datos en un segundo búfer. Luego, Wire
hace uso de la biblioteca TWI
donde twi_writeTo
copia los datos nuevamente en un 3er búfer. Eso es un poco torpe, ¿no?
He visto la DSSCircuits / I2C-Master-Library pero no estoy seguro cuán maduro es porque no ha habido ningún compromiso después del compromiso inicial, que ahora tiene 3 años.
Comentarios
- ¿De verdad tiene ¿Problemas de uso de RAM? Optimizar algo antes de que se convierta en un problema a menudo es un esfuerzo inútil.
- Todo se reduce a la cuestión de querer que funcione pronto y / o portátil vs querer que funcione óptimamente . Por supuesto, puede obtener el manual del programador ATmega ' y escribir en el periférico se registra usted mismo.
- La página web dsscircuits ' Arduino I2C master library muestra cinco revisiones de I2C biblioteca para la que es su enlace de github. Probablemente sea un buen punto de partida para las revisiones que tiene en mente. Si Wire ha tenido correcciones desde enero de 2012, Necesito agregarlos a I2C.
- > Alternativas a la biblioteca Wire para I2C escriba la suya propia. i2c es uno de los protocolos más fáciles de escribir desde cero.
Respuesta
No veo ninguna objeción para usar DSS Circuits I2C Master Library .
Puede que no se haya actualizado durante un par de años, pero si funciona, no lo hace » no es necesario. No es como si las bibliotecas para microcontroladores tuvieran que admitir nuevos controladores de impresora, controladores de video, etc.
Si funciona, funciona.
El chip no ha cambiado , y la única razón real para las actualizaciones en estos días es si el IDE cambia (o el compilador cambia) de tal manera que introduce errores de compilación. Tales cosas han sucedido recientemente con cosas como PROGMEM que tiene reglas más estrictas, por ejemplo.
Comentarios
- Esta biblioteca parecía muy prometedora, pero tenga en cuenta que sí solo admite objetivos AVR. Dado que los núcleos Arduino se han desarrollado para una variedad de arquitecturas, esta biblioteca no " solo funcionará " para cualquier placa compatible con Arduino. Por ejemplo, no es compatible con Adafruit ' s Feather basado en STM32F405
Responder
También vale la pena comprobar la biblioteca Procyon AVR . Es un poco viejo ahora, pero muy profesional y un poco minimalista. No hay muchas dependencias, debería estar bien usar solo el módulo I2C. Desde entonces, casi no hay nada nuevo en la parte AVR I2C.
Respuesta
La clase Cosa TWI es un enfoque muy diferente al soporte del controlador de dispositivo I2C. No utiliza ninguna SRAM adicional para los búferes. Si un controlador de dispositivo no bloquea, debe manejar el almacenamiento en búfer necesario. Además, la clase Cosa TWI admite la interacción típica con dispositivos I2C como maestro / esclavo, patrones de «escritura de registro-lectura de datos» y transacciones cuando se usa multi-threading.
Hay disponible una biblioteca de software y hardware Arduino-TWI . Utiliza la biblioteca Arduino-GPIO y se puede utilizar en placas basadas en AVR y SAM.
Algunos ejemplos: TWI Scanner , DS3231 Reloj / calendario en tiempo real , Adaptador LCD I2C con PCF8574 .
Respuesta
Yo mismo hice 2 bibliotecas para facilitar el uso y realizar llamadas consistentes:
una para objetivos AVR:
cI2C
otro que usa las mismas funciones para todos los demás objetivos (que básicamente es un contenedor para la biblioteca Wire):
WireWrapper
Ambos están disponibles dentro del administrador de la biblioteca IDE.
Ambos funcionan como maestros sin usar interrupciones y se prueban en diferentes objetivos con diferentes esclavos:
– UNO, Nano para cI2C
– Cero, con vencimiento & ESP8266 para WireWrapper
Respuesta
Puede utilizar un enfoque completamente diferente a la pregunta principal.Al pedir alternativas, ha dado una razón para esto: deshacerse del código no utilizado en el binario. Puede lograr la eliminación del código no utilizado sin utilizar una biblioteca alternativa. Tenga en cuenta que puede indicar al compilador y al enlazador que excluyan el código no utilizado del binario compilado. Solo use indicadores de compilación:
CFLAGS += -Wl,-static CFLAGS += -ffunction-sections CFLAGS += -Wl,--gc-sections
La función Rach estará en su propia sección.
LDFLAGS += -Wl,-gc-sections
Esto le dice a GCC que envíe la bandera -gc-section al enlazador que eliminará las secciones no utilizadas. ¡Y voilla! Se eliminan las secciones no utilizadas.