piclist 2001\01\29\202128a >
Thread: Routine for AT45D161 Flash using PIC
www.piclist.com/techref/microchip/memory.htm?key=flash
flavicon
face BY : David Huisman email (remove spam text)



Does anyone here have experience with the AT45xx Flash Memory device ?
The following code is what I have written to write and read to memory using
an absolute address. It does not function. The spi_write routines work on
other devices.

//   *** AT45D161 Memory Routines ***
// format is cccccccc   rrpppppp      ppppppaa     aaaaaaaa
// cccccccc = command,rr = reserved,pppppppppppp = page address,aaaaaaaaaa =
byte location on page
// page size is 528 bytes

void AT45D161_Write(long abs_address,char Flash_Data)
{
  unsigned int page;
  unsigned int location;

  page     = ((unsigned int) (abs_address  / 528)) << 2;    //  page
address into 2 bytyes and shift left 2
  location = (unsigned int) abs_address % 528;              //  byte
address and store in integer

  AT45D161_EN = false;                                      // select
AT45D161 using CE
  Bit_Delay;                                                //  allow >
280ns settling time for CE

  cDummy = spi_io(ABS_WRITE_CMD);                         // issue write
cmd (0x82)
  cDummy = spi_io(hi_byte(page));                           // 6 MSB of
page
  cDummy = spi_io(lo_byte(page)|hi_byte(location));        // 6 LSB of page
and 2 MSB of byte location
  cDummy = spi_io(lo_byte(location));                       //  8 LSB of
byte location

  cDummy = spi_io(Flash_Data);                              //  write data

  AT45D161_EN = true;                                       // de-select
AT45D161
}

// format for read is cccccccc rrpppppp  ppppppaa aaaaaaaa xxxxxxxx xxxxxxxx
xxxxxxxx xxxxxxxx dddddddd
// cccccccc = command,rr = reserved,pppppppppppp = page address,aaaaaaaaaa =
address
// xxxxxxx ...  = Don't care,dddddddd = read data

char AT45D161_Read(long abs_address)
{
  unsigned int page;
  unsigned int location;

  page     = (unsigned int) (abs_address  / 528)<<2;      //  store page
address into 2 bytyes and shift left 2
  location = (unsigned int) abs_address % 528;             // calculate
byte address and store in integer

  AT45D161_EN = false;                                     // select
AT45D161 using CE
  Bit_Delay;                                               //  allow >
280ns settling time for CE

  cDummy = spi_io(READ_CMD);                               // issue write
cmd (0x52)
  cDummy = spi_io(hi_byte(page));                          // send 6 MSB of
page
  cDummy = spi_io(lo_byte(page)|hi_byte(location));        // 6 LSB of page
and 2 MSB of byte location
  cDummy = spi_io(lo_byte(location));                      // 8 LSB of byte
location
  cDummy = spi_io(NULL);                                   // 0x00 - ie.
Don't care byte
  cDummy = spi_io(NULL);                                   // 0x00 - ie.
Don't care byte
  cDummy = spi_io(NULL);                                   // 0x00 - ie.
Don't care byte
  cDummy = spi_io(NULL);                                   // 0x00 - ie.
Don't care byte
  cDummy = spi_io(NULL);                                  // read data

  AT45D161_EN = true;                                      // de-select
AT45D161

  return (cDummy);                                         // pass read
data back to main program
}

regards

David Huisman

--
http://www.piclist.com hint: The PICList is archived three different
ways.  See http://www.piclist.com/#archives for details.


<009301c08a55$51949880$3c00a8c0@advminingtech.com.au> 7bit

See also: www.piclist.com/techref/microchip/memory.htm?key=flash
Reply You must be a member of the piclist mailing list (not only a www.piclist.com member) to post to the piclist. This form requires JavaScript and a browser/email client that can handle form mailto: posts.
Subject (change) Routine for AT45D161 Flash using PIC

month overview.

new search...