Página 1 de 1

EEPROM x DATAFlash

MensagemEnviado: 24 Jun 2015 10:40
por longo.251272
Bom dia pessoal,

Tenho um kit que veio com um DATAFlash AT45DBXX e quando testo o exemplo que veio com o kit, percebo que sempre que desconecto a alimentação do mesmo os dados são perdidos.
Tinha em mente que Flash é uma memoria não volátil.

Pensei errado ? Alguém pode me dizer uma aplicação pra ela.

Segue o código do exemplo, ele grava e depois lê, tudo ok,
Mas se eu desligo a alimentação do mesmo e mudo o código só pra ler resultado em dados errados.

Código: Selecionar todos
   
   printf("\r\nFALSH AT45DBXX Write Test: \r\n");
   for(num=0;num<255;num++) /*Written to the flash*/
   {
      write_buffer((u16)num,num);
      printf("%3d ",num);
   }

   printf("\r\nFALSH AT45DBXX Read Test: \r\n");

   for(num=0;num<255;num++) /*Read the flash*/
   {
      tmp=read_buffer((u16)num);
      printf("%3d ",tmp);
   }




void write_buffer(u16 BufferOffset,u8 Data)
{         
   AT45DBXX_Enable;
   SPI_Send_byte(0x84);         
   SPI_Send_byte(0xff);
   SPI_Send_byte((u8)BufferOffset>>8);
   SPI_Send_byte((u8)BufferOffset);      
   SPI_Send_byte(Data);
   AT45DBXX_Disable;
}

u8 read_buffer(u16 BufferOffset)
{      
   u8 temp=0;

   AT45DBXX_Enable;
    SPI_Send_byte(0xd4);
   SPI_Send_byte(0xff);
   SPI_Send_byte((u8)BufferOffset>>8);
   SPI_Send_byte((u8)BufferOffset); 
   //SPI_Send_byte(0xff);
   SPI_Send_byte(0xff);   
   temp=SPI_Receive_byte();
   AT45DBXX_Disable;
   return temp;      
}


Re: EEPROM x DATAFlash

MensagemEnviado: 24 Jun 2015 11:55
por longo.251272
Não encontrei ele listado em produtos no site da ATMEL, mas achei o datasheet dele e verifiquei que há o comando para jogar os dados no buffer para página da memória.

Estou pensando se compensa trabalhar com esse tipo de memória se ela não esta listada em produtos no site da atmel.

Re: EEPROM x DATAFlash

MensagemEnviado: 24 Jun 2015 13:29
por edsont
longo.251272 escreveu:Bom dia pessoal,

Tenho um kit que veio com um DATAFlash AT45DBXX e quando testo o exemplo que veio com o kit, percebo que sempre que desconecto a alimentação do mesmo os dados são perdidos.
Tinha em mente que Flash é uma memoria não volátil.

Pensei errado ? Alguém pode me dizer uma aplicação pra ela.

Segue o código do exemplo, ele grava e depois lê, tudo ok,
Mas se eu desligo a alimentação do mesmo e mudo o código só pra ler resultado em dados errados.

Código: Selecionar todos
   
   printf("\r\nFALSH AT45DBXX Write Test: \r\n");
   for(num=0;num<255;num++) /*Written to the flash*/
   {
      write_buffer((u16)num,num);
      printf("%3d ",num);
   }

   printf("\r\nFALSH AT45DBXX Read Test: \r\n");

   for(num=0;num<255;num++) /*Read the flash*/
   {
      tmp=read_buffer((u16)num);
      printf("%3d ",tmp);
   }




void write_buffer(u16 BufferOffset,u8 Data)
{         
   AT45DBXX_Enable;
   SPI_Send_byte(0x84);         
   SPI_Send_byte(0xff);
   SPI_Send_byte((u8)BufferOffset>>8);
   SPI_Send_byte((u8)BufferOffset);      
   SPI_Send_byte(Data);
   AT45DBXX_Disable;
}

u8 read_buffer(u16 BufferOffset)
{      
   u8 temp=0;

   AT45DBXX_Enable;
    SPI_Send_byte(0xd4);
   SPI_Send_byte(0xff);
   SPI_Send_byte((u8)BufferOffset>>8);
   SPI_Send_byte((u8)BufferOffset); 
   //SPI_Send_byte(0xff);
   SPI_Send_byte(0xff);   
   temp=SPI_Receive_byte();
   AT45DBXX_Disable;
   return temp;      
}



AT45DBXX é o código da placa, tem que ver qual o CI da sua placa para ver a capacidade (e os comandos se forem diferentes).
Você está gravando e lendo somente do buffer que é SRAM. O buffer não cobre toda a memória, mas uma página da Flash. Você grava e lê uma página por vez.
Não li o datasheet. Tem que ver se a escrita é direta ou se tem que apagar a página antes de escrever. A Flash dos MCUs normalmente tem que apagar e depois escrever. Ou apaga enquanto escreve. Ao apagar o valor fica 0xFF (seta todos os bits). A escrita só escreve os zeros (reseta os bits necessários).

Re: EEPROM x DATAFlash

MensagemEnviado: 24 Jun 2015 14:22
por Red Neck Guy
Eu já trabalhei com essa memória.
O buffer ajuda nas operações de escrita dentro da página.
Você copia pro buffer, alterar o buffer e depois apaga a página e regrava.
Menos custoso computacionalmente do que copiar toda a página para um buffer no processador, alterar,apagar e reescrever.