mirror of https://github.com/ArduPilot/ardupilot
DataFlash_APM2 - moved CS_inactive call (which disables the dataflash) from the beginning to the end of all methods. This means the dataflash does not monopolize the SPI bus.
Also formatting changes to use tab instead of space. Sorry, should have done this as a separate check-in to the above changes.
This commit is contained in:
parent
577f18a09c
commit
346ca5c865
|
@ -91,14 +91,16 @@ unsigned char DataFlash_APM2::SPI_transfer(unsigned char data)
|
||||||
return UDR3;
|
return UDR3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// disable device
|
||||||
void DataFlash_APM2::CS_inactive()
|
void DataFlash_APM2::CS_inactive()
|
||||||
{
|
{
|
||||||
digitalWrite(DF_SLAVESELECT,HIGH); //disable device
|
digitalWrite(DF_SLAVESELECT,HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enable device
|
||||||
void DataFlash_APM2::CS_active()
|
void DataFlash_APM2::CS_active()
|
||||||
{
|
{
|
||||||
digitalWrite(DF_SLAVESELECT,LOW); //enable device
|
digitalWrite(DF_SLAVESELECT,LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructors ////////////////////////////////////////////////////////////////
|
// Constructors ////////////////////////////////////////////////////////////////
|
||||||
|
@ -120,7 +122,8 @@ void DataFlash_APM2::Init(void)
|
||||||
delay(1);
|
delay(1);
|
||||||
digitalWrite(DF_RESET,HIGH);
|
digitalWrite(DF_RESET,HIGH);
|
||||||
|
|
||||||
CS_inactive(); //disable device
|
// disable device
|
||||||
|
CS_inactive();
|
||||||
|
|
||||||
// Setup Serial Port3 in SPI mode (MSPI), Mode 0, Clock: 8Mhz
|
// Setup Serial Port3 in SPI mode (MSPI), Mode 0, Clock: 8Mhz
|
||||||
UBRR3 = 0;
|
UBRR3 = 0;
|
||||||
|
@ -157,7 +160,7 @@ void DataFlash_APM2::Init(void)
|
||||||
// This function is mainly to test the device
|
// This function is mainly to test the device
|
||||||
void DataFlash_APM2::ReadManufacturerID()
|
void DataFlash_APM2::ReadManufacturerID()
|
||||||
{
|
{
|
||||||
CS_inactive(); // Reset dataflash command decoder
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
// Read manufacturer and ID command...
|
// Read manufacturer and ID command...
|
||||||
|
@ -167,6 +170,9 @@ void DataFlash_APM2::ReadManufacturerID()
|
||||||
df_device = SPI_transfer(0xff);
|
df_device = SPI_transfer(0xff);
|
||||||
df_device = (df_device<<8) | SPI_transfer(0xff);
|
df_device = (df_device<<8) | SPI_transfer(0xff);
|
||||||
SPI_transfer(0xff);
|
SPI_transfer(0xff);
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function return 1 if Card is inserted on SD slot
|
// This function return 1 if Card is inserted on SD slot
|
||||||
|
@ -178,12 +184,19 @@ bool DataFlash_APM2::CardInserted()
|
||||||
// Read the status register
|
// Read the status register
|
||||||
byte DataFlash_APM2::ReadStatusReg()
|
byte DataFlash_APM2::ReadStatusReg()
|
||||||
{
|
{
|
||||||
CS_inactive(); // Reset dataflash command decoder
|
byte tmp;
|
||||||
|
|
||||||
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
// Read status command
|
// Read status command
|
||||||
SPI_transfer(DF_STATUS_REGISTER_READ);
|
SPI_transfer(DF_STATUS_REGISTER_READ);
|
||||||
return SPI_transfer(0x00); // We only want to extract the READY/BUSY bit
|
tmp = SPI_transfer(0x00); // We only want to extract the READY/BUSY bit
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
|
|
||||||
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the status of the DataFlash
|
// Read the status of the DataFlash
|
||||||
|
@ -193,14 +206,12 @@ byte DataFlash_APM2::ReadStatus()
|
||||||
return(ReadStatusReg()&0x80); // We only want to extract the READY/BUSY bit
|
return(ReadStatusReg()&0x80); // We only want to extract the READY/BUSY bit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline
|
inline
|
||||||
uint16_t DataFlash_APM2::PageSize()
|
uint16_t DataFlash_APM2::PageSize()
|
||||||
{
|
{
|
||||||
return(528-((ReadStatusReg()&0x01)<<4)); // if first bit 1 trhen 512 else 528 bytes
|
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_APM2::WaitReady()
|
void DataFlash_APM2::WaitReady()
|
||||||
{
|
{
|
||||||
|
@ -209,8 +220,9 @@ void DataFlash_APM2::WaitReady()
|
||||||
|
|
||||||
void DataFlash_APM2::PageToBuffer(unsigned char BufferNum, uint16_t PageAdr)
|
void DataFlash_APM2::PageToBuffer(unsigned char BufferNum, uint16_t PageAdr)
|
||||||
{
|
{
|
||||||
CS_inactive();
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
if (BufferNum==1)
|
if (BufferNum==1)
|
||||||
SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_1);
|
SPI_transfer(DF_TRANSFER_PAGE_TO_BUFFER_1);
|
||||||
else
|
else
|
||||||
|
@ -225,15 +237,19 @@ void DataFlash_APM2::PageToBuffer(unsigned char BufferNum, uint16_t PageAdr)
|
||||||
}
|
}
|
||||||
SPI_transfer(0x00); // don´t care bytes
|
SPI_transfer(0x00); // don´t care bytes
|
||||||
|
|
||||||
CS_inactive(); //initiate the transfer
|
//initiate the transfer
|
||||||
|
CS_inactive();
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
while(!ReadStatus()); //monitor the status register, wait until busy-flag is high
|
while(!ReadStatus()); //monitor the status register, wait until busy-flag is high
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFlash_APM2::BufferToPage (unsigned char BufferNum, uint16_t PageAdr, unsigned char wait)
|
void DataFlash_APM2::BufferToPage (unsigned char BufferNum, uint16_t PageAdr, unsigned char wait)
|
||||||
{
|
{
|
||||||
CS_inactive(); // Reset dataflash command decoder
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
if (BufferNum==1)
|
if (BufferNum==1)
|
||||||
|
@ -250,55 +266,69 @@ void DataFlash_APM2::BufferToPage (unsigned char BufferNum, uint16_t PageAdr, un
|
||||||
}
|
}
|
||||||
SPI_transfer(0x00); // don´t care bytes
|
SPI_transfer(0x00); // don´t care bytes
|
||||||
|
|
||||||
CS_inactive(); //initiate the transfer
|
//initiate the transfer
|
||||||
|
CS_inactive();
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
// Check if we need to wait to write the buffer to memory or we can continue...
|
// Check if we need to wait to write the buffer to memory or we can continue...
|
||||||
if (wait)
|
if (wait)
|
||||||
while(!ReadStatus()); //monitor the status register, wait until busy-flag is high
|
while(!ReadStatus()); //monitor the status register, wait until busy-flag is high
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataFlash_APM2::BufferWrite (unsigned char BufferNum, uint16_t IntPageAdr, unsigned char Data)
|
void DataFlash_APM2::BufferWrite (unsigned char BufferNum, uint16_t IntPageAdr, unsigned char Data)
|
||||||
{
|
{
|
||||||
CS_inactive(); // Reset dataflash command decoder
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
if (BufferNum==1)
|
if (BufferNum==1)
|
||||||
SPI_transfer(DF_BUFFER_1_WRITE);
|
SPI_transfer(DF_BUFFER_1_WRITE);
|
||||||
else
|
else
|
||||||
SPI_transfer(DF_BUFFER_2_WRITE);
|
SPI_transfer(DF_BUFFER_2_WRITE);
|
||||||
SPI_transfer(0x00); //don't cares
|
|
||||||
|
SPI_transfer(0x00); // don't care
|
||||||
SPI_transfer((unsigned char)(IntPageAdr>>8)); // upper part of internal buffer address
|
SPI_transfer((unsigned char)(IntPageAdr>>8)); // upper part of internal buffer address
|
||||||
SPI_transfer((unsigned char)(IntPageAdr)); // lower part of internal buffer address
|
SPI_transfer((unsigned char)(IntPageAdr)); // lower part of internal buffer address
|
||||||
SPI_transfer(Data); // write data byte
|
SPI_transfer(Data); // write data byte
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char DataFlash_APM2::BufferRead (unsigned char BufferNum, uint16_t IntPageAdr)
|
unsigned char DataFlash_APM2::BufferRead (unsigned char BufferNum, uint16_t IntPageAdr)
|
||||||
{
|
{
|
||||||
byte tmp;
|
byte tmp;
|
||||||
|
|
||||||
CS_inactive(); // Reset dataflash command decoder
|
// activate dataflash command decoder
|
||||||
CS_active();
|
CS_active();
|
||||||
|
|
||||||
if (BufferNum==1)
|
if (BufferNum==1)
|
||||||
SPI_transfer(DF_BUFFER_1_READ);
|
SPI_transfer(DF_BUFFER_1_READ);
|
||||||
else
|
else
|
||||||
SPI_transfer(DF_BUFFER_2_READ);
|
SPI_transfer(DF_BUFFER_2_READ);
|
||||||
SPI_transfer(0x00); //don't cares
|
|
||||||
|
SPI_transfer(0x00);
|
||||||
SPI_transfer((unsigned char)(IntPageAdr>>8)); //upper part of internal buffer address
|
SPI_transfer((unsigned char)(IntPageAdr>>8)); //upper part of internal buffer address
|
||||||
SPI_transfer((unsigned char)(IntPageAdr)); //lower part of internal buffer address
|
SPI_transfer((unsigned char)(IntPageAdr)); //lower part of internal buffer address
|
||||||
SPI_transfer(0x00); //don't cares
|
SPI_transfer(0x00); //don't cares
|
||||||
tmp = SPI_transfer(0x00); //read data byte
|
tmp = SPI_transfer(0x00); //read data byte
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
|
|
||||||
return (tmp);
|
return (tmp);
|
||||||
}
|
}
|
||||||
// *** END OF INTERNAL FUNCTIONS ***
|
// *** END OF INTERNAL FUNCTIONS ***
|
||||||
|
|
||||||
void DataFlash_APM2::PageErase (uint16_t PageAdr)
|
void DataFlash_APM2::PageErase (uint16_t PageAdr)
|
||||||
{
|
{
|
||||||
CS_inactive(); //make sure to toggle CS signal in order
|
// activate dataflash command decoder
|
||||||
CS_active(); //to reset Dataflash command decoder
|
CS_active();
|
||||||
SPI_transfer(DF_PAGE_ERASE); // Command
|
|
||||||
|
// Send page erase command
|
||||||
|
SPI_transfer(DF_PAGE_ERASE);
|
||||||
|
|
||||||
if(df_PageSize==512){
|
if(df_PageSize==512){
|
||||||
SPI_transfer((unsigned char)(PageAdr >> 7));
|
SPI_transfer((unsigned char)(PageAdr >> 7));
|
||||||
|
@ -308,24 +338,34 @@ void DataFlash_APM2::PageErase (uint16_t PageAdr)
|
||||||
SPI_transfer((unsigned char)(PageAdr << 2));
|
SPI_transfer((unsigned char)(PageAdr << 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_transfer(0x00); // "dont cares"
|
SPI_transfer(0x00);
|
||||||
CS_inactive(); //initiate flash page erase
|
|
||||||
|
//initiate flash page erase
|
||||||
|
CS_inactive();
|
||||||
CS_active();
|
CS_active();
|
||||||
while(!ReadStatus());
|
while(!ReadStatus());
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DataFlash_APM2::ChipErase ()
|
void DataFlash_APM2::ChipErase ()
|
||||||
{
|
{
|
||||||
CS_inactive(); //make sure to toggle CS signal in order
|
// activate dataflash command decoder
|
||||||
CS_active(); //to reset Dataflash command decoder
|
CS_active();
|
||||||
|
|
||||||
// opcodes for chip erase
|
// opcodes for chip erase
|
||||||
SPI_transfer(DF_CHIP_ERASE_0);
|
SPI_transfer(DF_CHIP_ERASE_0);
|
||||||
SPI_transfer(DF_CHIP_ERASE_1);
|
SPI_transfer(DF_CHIP_ERASE_1);
|
||||||
SPI_transfer(DF_CHIP_ERASE_2);
|
SPI_transfer(DF_CHIP_ERASE_2);
|
||||||
SPI_transfer(DF_CHIP_ERASE_3);
|
SPI_transfer(DF_CHIP_ERASE_3);
|
||||||
|
|
||||||
CS_inactive(); //initiate flash page erase
|
//initiate flash page erase
|
||||||
|
CS_inactive();
|
||||||
CS_active();
|
CS_active();
|
||||||
while(!ReadStatus());
|
while(!ReadStatus());
|
||||||
|
|
||||||
|
// release SPI bus for use by other sensors
|
||||||
|
CS_inactive();
|
||||||
}
|
}
|
Loading…
Reference in New Issue