Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
11/01/06 15:43
Read: times


 
#127219 - 4Mb Flash 29C040
Has someone worked with this Flash?

I'm experiencing a lot of trouble to write and read. I am programing in c. here is the Code:

<quote>
/********************************************************************/
/* DIRECCION_PAGINA se le pasa como referencia el numero de pagina */
/********************************************************************/
long direccion_pagina(int pagina)
{
int page_address[MAX_PAGE_ADDRS];
long address=0;
int i;

/*inicializo el array PAGE_ADDRESS en 0*/
for(i=0;i< MAX_PAGE_ADDRS;i++)
page_address[i] = 0;

i = 0;
while (pagina>1)
{
page_address[i+8] = pagina%2;
pagina = pagina/2;
i++;
}
page_address[i+8] = pagina;

for (i=0;i<16;i++){
address=address + power(2,i)*page_address[i];
}

if (page_address[16] == 1)
a16 = 1;
else
a16 = 0;
if (page_address[17] == 1)
a17 = 1;
else
a17 = 0;
if (page_address[18] == 1)
a18 = 1;
else
//a18 = 1;
a18 = 0; //hago esto para simular la memoria Flash y que no se solape
//despues lo tengo que cambiar
return address;
}
/*****************************************************************/
/* WRITE_FLASH_SECTOR copia el buffer de datos de la SRAM en la */
/* pagina del 29C040 que se pasa como argumento. Page_num es el */
/* numero de paginas de la EPROM y debe estar comprendido entre */
/* los valores 0 y 2047. */
/* Para escribir en la Flash es necesario primero realizaar 3 */
/* escrituras de prueba antes de grabar un byte. Recien entonces */
/* se lee el primer byte de la SRAM se copia el micro y del micro*/
/* a la FLASH. Este proceso se repite hasta escribir una pagina */
/* entera. */
/*****************************************************************/
void write_Flash_sector(char *s, int page_num)
{
int i;
char datos; // datos: almacena un byte de datos
char xdata *address_pointer; // apunta a direccion dentro de una
// pagina de la FLASH
long temp;

EA = 0;
CE_RAM=1; //deshabilito la RAM externa

temp = direccion_pagina(page_num);

P10 = 0;
P11 = 0;
P12 = 0;

//Escribo 3 bytes de prueba e tres sectores especificos
/*Escribo 0xAA en la direccion 0x05555 de la FLASH */
CE_FLASH=0;
address_pointer = 0x5555;
*address_pointer = 0xAA;
CE_FLASH = 1;

CE_FLASH=0;
/*Escribo 0x55 en la direccion 0x02AAA de la FLASH */
address_pointer = 0x2AAA;
*address_pointer = 0x55;
CE_FLASH = 1;

CE_FLASH=0;
/*Escribo 0xA0 en la direccion 0x05555 de la FLASH */
address_pointer = 0x5555;
*address_pointer = 0xA0;
CE_FLASH = 1;


/* Sucesivamente lee un Byte de la posicion i de la SRAM y lo almacena en el uC */
/* para luego escribirlo en la FLASH hasta completar la pagina */

address_pointer = (char*) temp;
P10 = a16;
P11 = a17;
P12 = a18;

i=0;
while(i<=BUFFER_SIZE-1)
{
CE_RAM = 0; // HABILITO RAM EXTERNA
datos = s[i]; // ram interna + externa
CE_RAM = 1; // DESHABILITO RAM EXTERNA
CE_FLASH = 0; // HABILITO FLASH
*address_pointer = datos;
CE_FLASH = 1; // DESHABILITO FLASH
i++;
address_pointer++;
}
CE_RAM = 0;
EA = 1;
delayms(10); /*10 miliseg delay para escribir pagina*/
}

/**************************************************************************/
/* READ_FLASH_SECTOR copies a sector from the 29C040 into the SRAM buffer */
/* Either 256 or 512 bytes are transfered depending on the size of */
/* the sector. */
/**************************************************************************/

void read_Flash_sector(char *s, int page_num)
{
int i;
char datos; // datos: almacena un byte de datos
char xdata *address_pointer; // apunta a direccion dentro de una pagina de
// la FLASH
EA = 0;

//setea al uC para que apunte a la pagina indicada
address_pointer = (char *) direccion_pagina(page_num);
P10 = a16;
P11 = a17;
P12 = a18;

/* Sucesivamente lee un Byte de la posicion i de una pagina de la */
/* FLASH y lo almacena en el uC para luego escribirlo en la SRAM */
/* hasta completar el BUFFER */


i=0;
CE_RAM = 1;
while (i<MAX_msg_per_page*Msg_size)
{
CE_FLASH = 0;
datos = *address_pointer;
CE_FLASH = 1;
CE_RAM = 0;
s[i]=datos;
CE_RAM = 1;
address_pointer++;
i++;
}

for (i=MAX_msg_per_page*Msg_size;i<=BUFFER_SIZE-1;i++)
{
s[i]='\0';
}

CE_RAM = 0;
EA = 1;
}
</quote>

List of 13 messages in thread
TopicAuthorDate
4Mb Flash 29C040            01/01/70 00:00      
   project description            01/01/70 00:00      
      which brand?            01/01/70 00:00      
         manufacturers datasheet link            01/01/70 00:00      
            neat chip            01/01/70 00:00      
               re posting code            01/01/70 00:00      
               newbie            01/01/70 00:00      
                  a few things            01/01/70 00:00      
                     bitwise operations            01/01/70 00:00      
                        where are you?, please add location to profile            01/01/70 00:00      
                           from Argentina            01/01/70 00:00      
   Code            01/01/70 00:00      
      trouble description            01/01/70 00:00      

Back to Subject List