Moderadores: 51, guest2003, Renie
alessandro escreveu:Oi barboza,
Estou verificando o ACK retornado pela memória e estou fazendo o polling (na forma de delay, acredito que poderia melhorar fazendo da forma sugerida pelo fabricante de fazer testes na linha durante o ciclo de gravação).
No modo de gravação de um byte somente, se gravar os 128 bytes nesse modo, grava certinho.
Vou implementar o polling descrito no datasheet, talvez o tempo que estava utilizando no polling para escrita de um byte não dê conta de realizar a gravação dos 128 bytes (apesar de ter aumentando o tempo).
Quanto as páginas, tenho que sempre começar no endereço inicial e terminar no endereço final de cada pagina? Ou posso começar no meio da página e terminar no final?
Cada endereço inicial das paginas começam sempre em múltiplos de 128? 0, 128, 256, 384,....?
Alessandro
// Quantidade de bytes da pagina na escrita
#define DEF_EEP_MSC_PAGE_I2C (128-1)
/************************************************************************
FUNCAO: p_eep_cmd
PARAMETROS: flag_rw - DEFINE SE É LEITURA(1) OU ESCRITA(0) NA EEPROM
u32_e_eeprom - ENDEREÇO NA EEPROM
*ptr_buf - PONTEIRO ONDE OS DADOS SERAO SALCOS OU LIDOS
NA RAM
qtd_bytes - QUANTIDADE DE BYTES TRANSFERIDOS
RETORNO: NENHUM
DESCRICAO: RECEBE OS PARAMETROS PASSADOS E EXECUTA A TRANFERENCIA DOS
DADOS PARA A EEPROM DE ACORDO SO DADOS RECEBIDOS.
SE JÁ HOUVER ALGUMA EXECUÇÃO, ESPERA O FIM PARA INICIAR
O COMANDO PASSADO
*************************************************************************/
void p_eep_cmd (en_bool flag_rw, U32 u32_e_eeprom, U8 *ptr_u8_buf, U32 u32_qtd_bytes)
{
// Comando leitura, escreva o endereço primeiro
if ( flag_rw == EEP_READ )
{
// Verifique e espere espaço no buffer para salvar
while ( !(p_put_cmd_eep (EEP_WRITE, u32_e_eeprom, NULL, 0)) );
// Verifique e espere espaço no buffer para salvar
while ( !(p_put_cmd_eep (EEP_READ, u32_e_eeprom, ptr_u8_buf, u32_qtd_bytes)) );
}
else
// Comando de escrita (subdividido em páginas)
{
U32 ptr_e_eep_fim, ptr_e_eep_fim_pag;
ptr_e_eep_fim = u32_e_eeprom + u32_qtd_bytes - 1;
do
{
ptr_e_eep_fim_pag = u32_e_eeprom | DEF_EEP_MSC_PAGE_I2C;
// Salve o menor
ptr_e_eep_fim_pag = ( (ptr_e_eep_fim_pag < ptr_e_eep_fim) ? ptr_e_eep_fim_pag : ptr_e_eep_fim );
u32_qtd_bytes = ptr_e_eep_fim_pag - u32_e_eeprom + 1;
// Verifique e espere espaço no buffer para salvar
while ( !(p_put_cmd_eep (EEP_WRITE, u32_e_eeprom, ptr_u8_buf, u32_qtd_bytes)) );
// Atualize o endereço da EEPROM
u32_e_eeprom = ptr_e_eep_fim_pag + 1;
// Atualize o endereço da RAM
ptr_u8_buf += u32_qtd_bytes;
}
while (ptr_e_eep_fim_pag != ptr_e_eep_fim);
}
}
RobL escreveu:Sua memo não tem mais que 128K bytes. Os endereços não podem estar acima disto.
Normalmente, endereços maior que o tamanho da memo faz ela gravar no seu início. Portanto, para endereços maiores que 128Kb, por exemplo, endereço 0x80 vair gravar no endereço zero.
Nota1 : sua página é de 128bytes mas o total de bits é de 128Kb x 8 = 1024.
Nota 2: O tempo de gravação de uma página é o mesmo de um byte, pois na verdade estas memos só gravam páginas. Em outras palavras, quando se grava um byte o processo interno é o mesmo que gravar uma página, onde somente um byte difere dos demais 0xFF.
Os primeiro seguimentos (0x100~0x17F e 0x180~0x1FF) grava corretamente, mas toda vez que tento gravar algum segmento seguinte a endereços terminados em FF (0x200~0x27F) da problema, simplesmente não grava após endereços terminados FF.
Faça a gravação e leitura sequencialmente,é mais fácil,voce escolhe o endereço inicial e final.
Voltar para Componentes\Equipamentos Eletrônicos
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante