Alternativas a la biblioteca Wire para I2C

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *