Estou tentando me comunicar com uma FRAM conectada remotamente (FM24C04 da Ramtron) usando o I2C. Essa memória é incorporada em uma placa que pode ser inserida e removida a qualquer momento para / do sistema (a comunicação é finalizada corretamente antes da remoção da memória).
O problema é: logo após inserir o cartão que contém a FRAM, às vezes ele não reconhece o endereço.
Medições de sinais
Eu medi os sinais para ver o que está acontecendo e parece que os horários estão corretos nos dois casos (funcionando e não funcionando).
Comunicação I2C correta (leitura de 3 bytes):
Endereço I2C FRAM não reconhecido (o endereço escravo é enviado corretamente):
Ações já realizadas para solucionar esse problema (sem êxito)
- Atraso adicionado após a inserção do cartão com a FRAM incorporada para garantir que a sequência de energia seja respeitada.
- I2C interrompe a geração após a detecção de um endereço escravo sem reconhecimento
Configuração de barramento I2C
- Um mestre (microcontrolador STM32F205 da ST)
- Três escravos (EEPROM 24AA1025 da Microchip, RTC DS1339C da Maxim IC e a remota FRAM FM24C04 de Ramtron
- Um deslocador de nível I2C (MAX3373E da Maxim IC) é usado para permitir a comunicação entre o mestre e a FRAM
- Frequência de barramento definida para 100 kHz
EDITADO (17-04-2013)
Em primeiro lugar, obrigado a todos por seus comentários.
Como há muitas sugestões, aqui está a descrição das investigações que eu fiz.
Esquemas
A figura a seguir mostra um esquema simplificado do barramento I2C:
Os sinais I2C_SDA e I2C_SCL são conectados diretamente ao microcontrolador e os sinais FRAM_SDA e FRAM_SCL são conectados ao FRAM. Observe que os sinais SDA e SCL conectados à FRAM são filtrados usando ferritas BLM18 de Murata.
A FRAM está conectada da seguinte maneira:
- NC (pino 1) -> não conectado
- A1 (pino 2) -> GND
- A2 (pino 3) -> GND
- VSS (pino 4) -> GND
- SDA (pino 5) -> FRAM_SDA
- SCL (pino 6) -> FRAM_SCL
- WP (pino 7) -> GND (não protegido contra gravação)
- VDD (pino 8) -> + 5V
Descrição do cartão FRAM
Este cartão é um cartão "semelhante ao ISA" que incorpora apenas a FRAM.
Investigações
Diminuindo a frequência
Fiz testes com a frequência do SCL definida em 50kHz e 10kHz. Eu medi o sinal SCL com um osciloscópio para garantir que ele estivesse na frequência esperada.
Essas modificações não resolveram o problema. Verifiquei os horários e eles estão dentro das especificações da folha de dados do FRAM.
Garantindo a sequência de potência
@jippie.
- O deslocador de nível I2C é colocado no modo de três estados antes da inserção do cartão que incorpora a FRAM. Os sinais FRAM_SDA e FRAM_SCL estão baixos.
- Após a inserção do "cartão FRAM", é adicionado um atraso de 100 ms para garantir que a fonte de alimentação seja estabilizada (pelo menos 11 ms antes da primeira condição de partida, de acordo com a folha de dados).
- O comutador de nível I2C está ativado.
- É adicionado um atraso de 1 ms para garantir que o comutador de nível I2C seja ativado e que as linhas sejam puxadas para cima (~ 4us exigido pela folha de dados). Os sinais FRAM_SDA e FRAM_SCL são puxados para cima.
- A FRAM é acessada.
Os sinais FRAM_SDA e FRAM_SCL foram medidos após cada etapa.
O problema ainda ocorre.
Condição de parada / partida em vez de partida repetida
@gbarry.
Eu tentei parar antes do início repetido durante a transferência de bytes. Medi a transferência de bytes com o osciloscópio: a condição STOP seguida pela condição START está OK.
Infelizmente, esta solução não resolve o problema.
Pensamentos
Esse problema ocorre apenas após a conexão do cartão que incorpora a FRAM. Corri alguns milhares de acessos de leitura bem-sucedidos (endereçamento e leitura de escravos) depois que o "cartão FRAM" foi inserido e endereçado corretamente.
Parece-me cada vez mais um problema de hardware. Mas não sei se isso pode estar relacionado ao comutador de nível I2C ou aos outros escravos no barramento I2C.
Você tem outras idéias ou sugestões?
EDITADO (18/04/2013)
O problema parece estar resolvido
Substituí o conector do módulo FRAM e encontro uma maneira de fazer medições diretamente no FRAM. Parece que tudo está funcionando bem com este novo conector.
Farei mais testes para ter certeza de que o problema veio de uma conexão ruim.