Página 1 de 1

Como identificar Final de gravação i2c

MensagemEnviado: 20 Out 2019 17:14
por Guri
Eu liguei uma e2prom do tipo 24c256 no módulo i2c do stm32f103, ajustei a taxa para 100khz, não estou utilizando interrupção, e uso o módulo i2c do arm para controlar a memória externa.

Funciona tudo beleza. Eu quero fazer é o seguinte e não estou conseguindo raciocinar a respeito e peço ajuda.

Para se gravar um byte na e2prom externa eu necessito aguardar um time de 5ms entre uma gravação e outra, até ai tudo beleza, funciona redondo.

Eu quero saber se existe algum bit no módulo i2c do arm que me avisa se a gravação na e2prom externa terminou, assim eu não precisaria ficar aguardando um delay de 5ms entre uma gravação e outra.

Nos mcus pic eu sei que tem esse flag (agora não me lembro o nome), mas sei que existe e já até utilizei a anos atrás isso.

Alguém pode me ajudar :D

Re: Como identificar Final de gravação i2c

MensagemEnviado: 20 Out 2019 18:01
por vtrx
Posta a rotina de gravação que esta usando.

Re: Como identificar Final de gravação i2c

MensagemEnviado: 20 Out 2019 19:33
por eliveltonpsantos
Não é exatamente o que você quer, mas uma alternativa é, após a gravação, eu entro num loop fazendo um pooling de leitura de uma determinada posição da EEPROM; caso me retorne erro (EEPROM_Read() != HAL_OK), significa que a EEPROM está ocupada fazendo a gravação, caso retorno um byte com o ACK (EEPROM_Read == HAL_OK) então a EEPROM está disponível para novos comandos.

Re: Como identificar Final de gravação i2c

MensagemEnviado: 21 Out 2019 10:27
por ze
Vc pode também esperar a eeprom liberar a linha antes de gravar. Algo como
Código: Selecionar todos
writeeeprom(a,d)
{
while(!ACK());
eepromwrite(a,d);
}
Pra criar a função ACK() veja no ds do seu mc como o hw dele trata a condição ACK. Geralmente é só um bit (seu flag) de um registro I2C qualquer.
Perceba que se a eeprom ausente ou falha, deve travar. Neste caso, algo como um timeout deve resolver
Código: Selecionar todos
tmout=1000
while((!ACK()&&tmout--));
if (!tmout) return FALHA;


Outra alternativa pra agilizar ainda + é vc ver no d.s. - desta vez o da eeprom - como é gravada uma página - geralmente 64 bytes sequenciais. O próprio hw da eeprom incrementa o endereço.

Re: Como identificar Final de gravação i2c

MensagemEnviado: 23 Out 2019 10:28
por Guri
Agradeço as dicas dos amigos.

Vou estudar sobre as sugestões e ver se consigo entender direitinho
Peço desculpas pela demora no retorno,

Obrigado :)

Re: Como identificar Final de gravação i2c

MensagemEnviado: 23 Out 2019 21:55
por barboza
ze escreveu:Vc pode também esperar a eeprom liberar a linha antes de gravar. Algo como
Código: Selecionar todos
writeeeprom(a,d)
{
while(!ACK());
eepromwrite(a,d);
}
Pra criar a função ACK() veja no ds do seu mc como o hw dele trata a condição ACK. Geralmente é só um bit (seu flag) de um registro I2C qualquer.
Perceba que se a eeprom ausente ou falha, deve travar. Neste caso, algo como um timeout deve resolver
Código: Selecionar todos
tmout=1000
while((!ACK()&&tmout--));
if (!tmout) return FALHA;


Outra alternativa pra agilizar ainda + é vc ver no d.s. - desta vez o da eeprom - como é gravada uma página - geralmente 64 bytes sequenciais. O próprio hw da eeprom incrementa o endereço.


Normalmente uso essa técnica do polling antes de uma nova gravação e também o recurso de gravação em páginas.
Ia sugerir o mesmo.