Basicamente, a escolha depende principalmente de dois critérios: se os dados a serem armazenados são grandes ou pequenos e se são reescritos com frequência ou não:
- A EEPROM é ótima para pequenos dados que mudam frequentemente. O motivo é: ele é vendido apenas para tamanhos pequenos, mas geralmente pode ser apagado em um byte. Além disso, a resistência da EEPROM é muito alta (milhões de ciclos).
- O Flash é ótimo para big data que não muda com frequência. Ele está disponível barato para tamanhos grandes, mas quando você precisa sobrescrever dados, pode fazê-lo apenas para uma página inteira, que pode ser de alguns kB. E a resistência está mais na faixa de 100.000 ciclos.
Não vou entrar em mais detalhes sobre a diferença entre os dois, já foi abordado:
Em relação aos cartões SD: o cartão SD é um tipo de flash removível e, como tal, segue as mesmas restrições que um flash comum. No entanto, ele normalmente usa flash NAND, enquanto, geralmente, os chips seriais usam o flash NOR. O flash NAND é mais conveniente para escrever (páginas menores, apagamento mais rápido), mas é menos confiável. Você pode obter blocos defeituosos depois de um tempo, se fizer muitas gravações. O nivelamento de desgaste pode atenuar isso, mas nem sempre é implementado em cartões SD baratos ( é verdade que um cartão SD / MMC usa nivelamento com seu próprio controlador? ). Você pode implementá-lo em software, mas não é trivial.
A escolha da interface (I2C ou SPI) é completamente independente, no entanto. I2C é mais lento, mas usa menos pinos. O I2C EEPROM também é geralmente mais barato que o SPI, mas você geralmente decide usar um ou outro, dependendo da maneira como atribuiu os pinos MCU em seu aplicativo.
Agora, você forneceu casos de uso específicos, então vamos examiná-los um por um:
Dados de configuração e calibração do sistema
Bem, este não impõe muitas restrições: esses dados geralmente são muito pequenos e não mudam frequentemente. Então, aqui, o mais simples é colocá-lo onde custa menos:
- MCE EEPROM interno, se você tiver um
- ou algum flash externo, se você já precisar para outros fins
- ou, eventualmente, um cartão SD, se você não tiver outro armazenamento persistente disponível. Observe, porém, que, como o cartão SD pode eventualmente ser removido e colocado em outro dispositivo, os dados de calibração não seriam mais consistentes. Então você pode querer evitar isso.
Se não houver outras necessidades de armazenamento persistente no dispositivo e não houver EEPROM interna no MCU, você poderá usar uma página de flash específica no flash do próprio MCU (se o MCU permitir). Caso contrário, você poderá recorrer a uma EEPROM externa pequena.
Observe que, no caso específico de endereços MAC, existem EEPROMs que são vendidas com um endereço MAC pré-programado, garantido que seja exclusivo (por exemplo, Microchip 24AAxxx). Portanto, esse seria o caminho, a menos que você tenha atribuído oficialmente um bloco de endereços pelo IEEE ou esteja disposto a arriscar usando endereços atribuídos localmente.
Histórico
Isso geralmente é grande e muda frequentemente. Grande significa flash, não EEPROM. Portanto, você pode usar um chip flash ou um cartão SD, mas se os registros forem realmente reescritos com frequência, é melhor usar um cartão SD. Caso contrário, você corre o risco de desgastar o chip flash e, se ele for soldado na placa, será mais difícil substituí-lo do que um cartão SD. Observe também que, ao gravar registros percorrendo as páginas flash inteiras, o nivelamento de desgaste se torna trivial de implementar.
Caso sejam pequenos logs, você tem sorte, use a EEPROM (desde que a resistência seja aceitável).
Observe que, se a resistência é um problema real, existem soluções adicionais com resistência praticamente ilimitada e tamanho relativamente grande: F-RAM e MRAM. Mas isso custa um braço e uma perna, e você não os mencionou como uma opção. Observe também que essas duas tecnologias mais recentes atingem uma velocidade de apagamento / gravação muito melhor que o flash, portanto, para o registro contínuo, isso pode ser interessante.
Código e recursos de código
Geralmente grande, mas não muda com frequência. Um chip flash externo (normalmente flash NOR) é ideal para isso.
Segurança e gerenciamento de direitos digitais
Este é mais complicado. Se ele realmente contém dados confidenciais que nunca devem ser extraídos, é melhor usar um cartão inteligente no formato SIM (eventualmente com algum firmware personalizado). Mas isso, claro, complica o design muito . Uma solução alternativa (mais fácil e barata) pode ser um chip de segurança dedicado como a série Atmel AT88SC, mas os comandos disponíveis no chip precisam fazer sentido para a sua aplicação específica. O que pode ser feito neste chip e sob quais condições devem ser cuidadosamente planejadas.
Se você precisar apenas de segurança "básica", o mais fácil é usar a EEPROM da MCU interna. Não será tão seguro quanto um cartão inteligente ou chip dedicado (que contém medidas de segurança específicas, como proteção contra ataques leves, contramedidas contra análise de energia / falha no chip, etc ...), mas é o melhor que você pode Faz.
Caso contrário, se não houver EEPROM interna, você terá as mesmas opções dos dados de configuração / calibração. No entanto, o uso de qualquer chip externo para armazenar dados seguros é um risco, pois as linhas de dados podem ser facilmente monitoradas com um simples analisador lógico e os dados confidenciais extraídos. Portanto, mesmo que se diga que a EEPROM é mais difícil de adulterar do que o flash, escolher um ou outro no caso de um chip externo não faz diferença do ponto de vista da segurança.
Finalmente, o cartão SD é definitivamente a pior idéia aqui, pois é removível. Os dados confidenciais podem ser lidos a partir de um PC, sem precisar de nenhum hardware específico.