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.