Alternativas à biblioteca Wire para I2C

Estou procurando alternativas (razoavelmente fáceis de usar e bem testadas) para as Wire biblioteca. Wire funciona muito bem, mas: eu só preciso que o Arduino atue como mestre I2C e a biblioteca Wire parece ser um verdadeiro desperdício de recursos:

Meu objetivo é enviar dados em bloco (por exemplo, 32 ou 64 bytes). Esses dados já estão armazenados em uma matriz na SRAM. Agora, ao usar a biblioteca Wire, você chama a função TwoWire::write que copia seus dados em um segundo buffer. Posteriormente, Wire usa a TWI biblioteca em que twi_writeTo copia os dados novamente em um 3º buffer. Isso “um pouco desajeitado, não é?

Eu vi a DSSCircuits / I2C-Master-Library , mas não tenho certeza quão maduro é porque não houve nenhum commit após o commit inicial que já tem 3 anos.

Comentários

  • Você realmente tem Problemas de uso de memória RAM? Otimizar algo antes que se torne um problema costuma ser um esforço perdido.
  • Tudo se resume à questão de querer que funcione em breve e / ou portável vs querer fazê-lo funcionar de forma otimizada . Claro que você está livre para obter o manual do ' do programador ATmega e escrever no periférico registra-se.
  • dsscircuits ' A página da biblioteca mestre Arduino I2C mostra cinco revisões do I2C biblioteca para a qual seu link do github se destina. Provavelmente é um bom ponto de partida para as revisões que você tem em mente. Se o Wire teve correções desde janeiro de 2012, você pode precisa adicioná-los ao I2C.
  • > Alternativas para a biblioteca Wire para I2C escrever a sua. i2c é um dos protocolos mais fáceis de escrever do zero.

Resposta

Não vejo nenhuma objeção para usar a Biblioteca mestre I2C de circuitos DSS .

Pode não ter sido atualizada por alguns anos, mas se funcionar, não ” não precisa ser. Não é como se as bibliotecas para microcontroladores precisassem oferecer suporte a novos drivers de impressora, drivers de vídeo, etc.

Se funcionar, funciona.

O chip não mudou , e a única razão real para atualizações hoje em dia é se o IDE mudar (ou o compilador mudar) de tal forma que introduz erros de compilação. Essas coisas aconteceram recentemente com coisas como PROGMEM tendo regras mais rígidas, por exemplo.

Comentários

  • Esta biblioteca parecia muito promissora, mas observe que é suporta apenas alvos AVR. Como os núcleos do Arduino foram desenvolvidos para uma variedade de arquiteturas, esta biblioteca não " apenas funcionará " para qualquer placa compatível com o Arduino. Por exemplo, não é compatível com Adafruit ' s Feather baseado em STM32F405

Resposta

Também vale a pena verificar a biblioteca Procyon AVR . É um pouco velho agora, mas muito profissional e minimalista. Não há muitas dependências, deve ser adequado usar apenas o módulo I2C. Não há quase nada de novo na parte AVR I2C desde então.

Resposta

A classe Cosa TWI é uma abordagem muito diferente para o suporte de driver de dispositivo I2C. Ele não usa nenhuma SRAM extra para buffers. Se um driver de dispositivo não é bloqueador, ele deve tratar do buffer necessário. Além disso, a classe Cosa TWI oferece suporte à interação típica com dispositivos I2C, como mestre / escravo, padrões de “gravação de registro-leitura de dados” e transações ao usar multi-threading.

Uma biblioteca Arduino-TWI de software e hardware está disponível. Ele usa a biblioteca Arduino-GPIO e pode ser usado em placas baseadas em AVR e SAM.

Alguns exemplos: TWI Scanner , DS3231 Real-Time Clock / Calender , Adaptador I2C LCD com PCF8574 .

Resposta

Eu mesmo fiz 2 libs para uso mais fácil e chamadas consistentes:

uma para alvos AVR:
cI2C

outro usando as mesmas funções para todos os outros destinos (que basicamente é um wrapper para a biblioteca Wire):
WireWrapper

Ambos estão disponíveis no gerenciador de biblioteca IDE.
Ambos funcionam como mestre sem usar interrupção e são testados em destinos diferentes com escravos diferentes:
– UNO, Nano para cI2C
– Zero, Devido & ESP8266 para WireWrapper

Resposta

Você pode usar uma abordagem completamente diferente para a pergunta principal.Pedindo alternativas, você deu razão para isso: livrar-se do código não utilizado no binário. Você pode conseguir a remoção de código não utilizado sem realmente usar uma biblioteca alternativa. Lembre-se de que você pode instruir o compilador e o vinculador a excluir o código não utilizado do binário compilado. Apenas use sinalizadores de compilação:

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

A função Rach estará em sua própria seção.

LDFLAGS += -Wl,-gc-sections 

Isso diz ao GCC para enviar o sinalizador -gc-seções para o vinculador que removerá seções não utilizadas. E voilla! As seções não utilizadas são removidas.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *