Browse Source

update dataflash for 528 and 512 byte pages

git-svn-id: https://arducopter.googlecode.com/svn/trunk@1906 f9c3cf11-9bcb-44bc-f272-b75c42450872
master
mich146@hotmail.com 14 years ago
parent
commit
a107587af6
  1. 82
      libraries/DataFlash/DataFlash.cpp
  2. 5
      libraries/DataFlash/DataFlash.h

82
libraries/DataFlash/DataFlash.cpp

@ -9,7 +9,7 @@
version 2.1 of the License, or (at your option) any later version. version 2.1 of the License, or (at your option) any later version.
Dataflash library for AT45DB161D flash memory Dataflash library for AT45DB161D flash memory
Memory organization : 4096 pages of 512 bytes Memory organization : 4096 pages of 512 bytes or 528 bytes
Maximun write bandwidth : 512 bytes in 14ms Maximun write bandwidth : 512 bytes in 14ms
This code is written so the master never has to wait to write the data on the eeprom This code is written so the master never has to wait to write the data on the eeprom
@ -94,6 +94,9 @@ void DataFlash_Class::Init(void)
// Cleanup registers... // Cleanup registers...
tmp=SPSR; tmp=SPSR;
tmp=SPDR; tmp=SPDR;
// get page size: 512 or 528
df_PageSize=PageSize();
} }
// This function is mainly to test the device // This function is mainly to test the device
@ -113,20 +116,32 @@ void DataFlash_Class::ReadManufacturerID()
tmp = dataflash_SPI_transfer(0xff); tmp = dataflash_SPI_transfer(0xff);
} }
// Read the status of the DataFlash // Read the status register
byte DataFlash_Class::ReadStatus() byte DataFlash_Class::ReadStatusReg()
{ {
byte tmp;
dataflash_CS_inactive(); // Reset dataflash command decoder dataflash_CS_inactive(); // Reset dataflash command decoder
dataflash_CS_active(); dataflash_CS_active();
// Read status command // Read status command
dataflash_SPI_transfer(DF_STATUS_REGISTER_READ); dataflash_SPI_transfer(DF_STATUS_REGISTER_READ);
tmp = dataflash_SPI_transfer(0x00); return dataflash_SPI_transfer(0x00); // We only want to extract the READY/BUSY bit
return(tmp&0x80); // We only want to extract the READY/BUSY bit
} }
// Read the status of the DataFlash
inline
byte DataFlash_Class::ReadStatus()
{
return(ReadStatusReg()&0x80); // We only want to extract the READY/BUSY bit
}
inline
unsigned int DataFlash_Class::PageSize()
{
return(528-((ReadStatusReg()&0x01)<<4)); // if first bit 1 trhen 512 else 528 bytes
}
// Wait until DataFlash is in ready state... // Wait until DataFlash is in ready state...
void DataFlash_Class::WaitReady() void DataFlash_Class::WaitReady()
{ {
@ -140,9 +155,15 @@ void DataFlash_Class::PageToBuffer(unsigned char BufferNum, unsigned int PageAdr
if (BufferNum==1) if (BufferNum==1)
dataflash_SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_1); dataflash_SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_1);
else else
dataflash_SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_2); dataflash_SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_2);
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6));
dataflash_SPI_transfer((unsigned char)(PageAdr << 2)); if(df_PageSize==512){
dataflash_SPI_transfer((unsigned char)(PageAdr >> 7));
dataflash_SPI_transfer((unsigned char)(PageAdr << 1));
}else{
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6));
dataflash_SPI_transfer((unsigned char)(PageAdr << 2));
}
dataflash_SPI_transfer(0x00); // don´t care bytes dataflash_SPI_transfer(0x00); // don´t care bytes
dataflash_CS_inactive(); //initiate the transfer dataflash_CS_inactive(); //initiate the transfer
@ -160,8 +181,14 @@ void DataFlash_Class::BufferToPage (unsigned char BufferNum, unsigned int PageAd
dataflash_SPI_transfer(DF_BUFFER_1_TO_PAGE_WITH_ERASE); dataflash_SPI_transfer(DF_BUFFER_1_TO_PAGE_WITH_ERASE);
else else
dataflash_SPI_transfer(DF_BUFFER_2_TO_PAGE_WITH_ERASE); dataflash_SPI_transfer(DF_BUFFER_2_TO_PAGE_WITH_ERASE);
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6));
dataflash_SPI_transfer((unsigned char)(PageAdr << 2)); if(df_PageSize==512){
dataflash_SPI_transfer((unsigned char)(PageAdr >> 7));
dataflash_SPI_transfer((unsigned char)(PageAdr << 1));
}else{
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6));
dataflash_SPI_transfer((unsigned char)(PageAdr << 2));
}
dataflash_SPI_transfer(0x00); // don´t care bytes dataflash_SPI_transfer(0x00); // don´t care bytes
dataflash_CS_inactive(); //initiate the transfer dataflash_CS_inactive(); //initiate the transfer
@ -213,14 +240,37 @@ void DataFlash_Class::PageErase (unsigned int PageAdr)
dataflash_CS_inactive(); //make sure to toggle CS signal in order dataflash_CS_inactive(); //make sure to toggle CS signal in order
dataflash_CS_active(); //to reset Dataflash command decoder dataflash_CS_active(); //to reset Dataflash command decoder
dataflash_SPI_transfer(DF_PAGE_ERASE); // Command dataflash_SPI_transfer(DF_PAGE_ERASE); // Command
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6)); //upper part of page address
dataflash_SPI_transfer((unsigned char)(PageAdr << 2)); //lower part of page address and MSB of int.page adr. if(df_PageSize==512){
dataflash_SPI_transfer((unsigned char)(PageAdr >> 7));
dataflash_SPI_transfer((unsigned char)(PageAdr << 1));
}else{
dataflash_SPI_transfer((unsigned char)(PageAdr >> 6));
dataflash_SPI_transfer((unsigned char)(PageAdr << 2));
}
dataflash_SPI_transfer(0x00); // "dont cares" dataflash_SPI_transfer(0x00); // "dont cares"
dataflash_CS_inactive(); //initiate flash page erase dataflash_CS_inactive(); //initiate flash page erase
dataflash_CS_active(); dataflash_CS_active();
while(!ReadStatus()); while(!ReadStatus());
} }
void DataFlash_Class::ChipErase ()
{
dataflash_CS_inactive(); //make sure to toggle CS signal in order
dataflash_CS_active(); //to reset Dataflash command decoder
// opcodes for chip erase
dataflash_SPI_transfer(DF_CHIP_ERASE_0);
dataflash_SPI_transfer(DF_CHIP_ERASE_1);
dataflash_SPI_transfer(DF_CHIP_ERASE_2);
dataflash_SPI_transfer(DF_CHIP_ERASE_3);
dataflash_CS_inactive(); //initiate flash page erase
dataflash_CS_active();
while(!ReadStatus());
}
// *** DATAFLASH PUBLIC FUNCTIONS *** // *** DATAFLASH PUBLIC FUNCTIONS ***
void DataFlash_Class::StartWrite(int PageAdr) void DataFlash_Class::StartWrite(int PageAdr)
{ {
@ -260,7 +310,7 @@ void DataFlash_Class::WriteByte(byte data)
{ {
BufferWrite(df_BufferNum,df_BufferIdx,data); BufferWrite(df_BufferNum,df_BufferIdx,data);
df_BufferIdx++; df_BufferIdx++;
if (df_BufferIdx >= 512) // End of buffer? if (df_BufferIdx >= df_PageSize) // End of buffer?
{ {
df_BufferIdx=0; df_BufferIdx=0;
BufferToPage(df_BufferNum,df_PageAdr,0); // Write Buffer to memory, NO WAIT BufferToPage(df_BufferNum,df_PageAdr,0); // Write Buffer to memory, NO WAIT
@ -327,7 +377,7 @@ byte DataFlash_Class::ReadByte()
WaitReady(); WaitReady();
result = BufferRead(df_Read_BufferNum,df_Read_BufferIdx); result = BufferRead(df_Read_BufferNum,df_Read_BufferIdx);
df_Read_BufferIdx++; df_Read_BufferIdx++;
if (df_Read_BufferIdx >= 512) // End of buffer? if (df_Read_BufferIdx >= df_PageSize) // End of buffer?
{ {
df_Read_BufferIdx=0; df_Read_BufferIdx=0;
PageToBuffer(df_Read_BufferNum,df_Read_PageAdr); // Write memory page to Buffer PageToBuffer(df_Read_BufferNum,df_Read_PageAdr); // Write memory page to Buffer

5
libraries/DataFlash/DataFlash.h

@ -56,12 +56,15 @@ class DataFlash_Class
void BufferToPage (unsigned char BufferNum, unsigned int PageAdr, unsigned char wait); void BufferToPage (unsigned char BufferNum, unsigned int PageAdr, unsigned char wait);
void PageToBuffer(unsigned char BufferNum, unsigned int PageAdr); void PageToBuffer(unsigned char BufferNum, unsigned int PageAdr);
void WaitReady(); void WaitReady();
unsigned char ReadStatusReg();
unsigned char ReadStatus(); unsigned char ReadStatus();
unsigned int PageSize();
public: public:
unsigned char df_manufacturer; unsigned char df_manufacturer;
unsigned char df_device_0; unsigned char df_device_0;
unsigned char df_device_1; unsigned char df_device_1;
unsigned int df_PageSize;
DataFlash_Class(); // Constructor DataFlash_Class(); // Constructor
void Init(); void Init();
@ -69,12 +72,14 @@ class DataFlash_Class
int GetPage(); int GetPage();
int GetWritePage(); int GetWritePage();
void PageErase (unsigned int PageAdr); void PageErase (unsigned int PageAdr);
void ChipErase ();
// Write methods // Write methods
void StartWrite(int PageAdr); void StartWrite(int PageAdr);
void FinishWrite(); void FinishWrite();
void WriteByte(unsigned char data); void WriteByte(unsigned char data);
void WriteInt(int data); void WriteInt(int data);
void WriteLong(long data); void WriteLong(long data);
// Read methods // Read methods
void StartRead(int PageAdr); void StartRead(int PageAdr);
unsigned char ReadByte(); unsigned char ReadByte();

Loading…
Cancel
Save