|
|
|
@ -52,21 +52,7 @@
|
|
|
|
|
/* Includes: */
|
|
|
|
|
#include "../AT90USBXXX/SPI.h"
|
|
|
|
|
#include "../../Common/Common.h"
|
|
|
|
|
|
|
|
|
|
#if !defined(BOARD)
|
|
|
|
|
#error BOARD must be set in makefile to a value specified in BoardTypes.h.
|
|
|
|
|
#elif (BOARD == BOARD_USBKEY)
|
|
|
|
|
#include "USBKEY/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_STK525)
|
|
|
|
|
#include "STK525/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_STK526)
|
|
|
|
|
#include "STK526/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_USER)
|
|
|
|
|
#include "Board/Dataflash.h"
|
|
|
|
|
#else
|
|
|
|
|
#error The selected board does not contain a dataflash IC.
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Enable C linkage for C++ Compilers: */
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
|
extern "C" {
|
|
|
|
@ -89,19 +75,6 @@
|
|
|
|
|
#define Dataflash_DeselectChip() Dataflash_SelectChip(DATAFLASH_NO_CHIP)
|
|
|
|
|
|
|
|
|
|
/* Inline Functions: */
|
|
|
|
|
/** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
|
|
|
|
|
* sent to an attached dataflash IC.
|
|
|
|
|
*
|
|
|
|
|
* \param PrescalerMask SPI prescaler mask, see SPI.h documentation
|
|
|
|
|
*/
|
|
|
|
|
static inline void Dataflash_Init(const uint8_t PrescalerMask)
|
|
|
|
|
{
|
|
|
|
|
DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK;
|
|
|
|
|
DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
|
|
|
|
|
|
|
|
|
|
SPI_Init(PrescalerMask, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
|
|
|
|
|
*
|
|
|
|
|
* \param Byte of data to send to the dataflash
|
|
|
|
@ -133,21 +106,45 @@
|
|
|
|
|
{
|
|
|
|
|
return SPI_ReceiveByte();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Includes: */
|
|
|
|
|
#if !defined(BOARD)
|
|
|
|
|
#error BOARD must be set in makefile to a value specified in BoardTypes.h.
|
|
|
|
|
#elif (BOARD == BOARD_USBKEY)
|
|
|
|
|
#include "USBKEY/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_STK525)
|
|
|
|
|
#include "STK525/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_STK526)
|
|
|
|
|
#include "STK526/Dataflash.h"
|
|
|
|
|
#elif (BOARD == BOARD_USER)
|
|
|
|
|
#include "Board/Dataflash.h"
|
|
|
|
|
#else
|
|
|
|
|
#error The selected board does not contain a dataflash IC.
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Inline Functions: */
|
|
|
|
|
/** Initializes the dataflash driver (including the SPI driver) so that commands and data may be
|
|
|
|
|
* sent to an attached dataflash IC.
|
|
|
|
|
*
|
|
|
|
|
* \param PrescalerMask SPI prescaler mask, see SPI.h documentation
|
|
|
|
|
*/
|
|
|
|
|
static inline void Dataflash_Init(const uint8_t PrescalerMask)
|
|
|
|
|
{
|
|
|
|
|
DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK;
|
|
|
|
|
DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
|
|
|
|
|
|
|
|
|
|
SPI_Init(PrescalerMask, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
|
|
|
|
|
* a new command.
|
|
|
|
|
*/
|
|
|
|
|
static inline void Dataflash_ToggleSelectedChipCS(void)
|
|
|
|
|
{
|
|
|
|
|
#if (DATAFLASH_TOTALCHIPS == 2)
|
|
|
|
|
uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
|
|
|
|
|
uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
|
|
|
|
|
|
|
|
|
|
Dataflash_DeselectChip();
|
|
|
|
|
Dataflash_SelectChip(SelectedChipMask);
|
|
|
|
|
#else
|
|
|
|
|
Dataflash_DeselectChip();
|
|
|
|
|
Dataflash_SelectChip(DATAFLASH_CHIP1);
|
|
|
|
|
#endif
|
|
|
|
|
Dataflash_DeselectChip();
|
|
|
|
|
Dataflash_SelectChip(SelectedChipMask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Spinloops while the currently selected dataflash is busy executing a command, such as a main
|
|
|
|
@ -162,28 +159,14 @@
|
|
|
|
|
|
|
|
|
|
/** Selects a dataflash IC from the given page number, which should range from 0 to
|
|
|
|
|
* ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
|
|
|
|
|
* dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside the total number
|
|
|
|
|
* of pages contained in the boards dataflash ICs, all dataflash ICs are deselected.
|
|
|
|
|
* dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
|
|
|
|
|
* the total number of pages contained in the boards dataflash ICs, all dataflash ICs
|
|
|
|
|
* are deselected.
|
|
|
|
|
*
|
|
|
|
|
* \param PageAddress Address of the page to manipulate, ranging from
|
|
|
|
|
* ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
|
|
|
|
|
*/
|
|
|
|
|
static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
|
|
|
|
|
{
|
|
|
|
|
Dataflash_DeselectChip();
|
|
|
|
|
|
|
|
|
|
if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
#if (DATAFLASH_TOTALCHIPS == 2)
|
|
|
|
|
if (PageAddress & 0x01)
|
|
|
|
|
Dataflash_SelectChip(DATAFLASH_CHIP2);
|
|
|
|
|
else
|
|
|
|
|
Dataflash_SelectChip(DATAFLASH_CHIP1);
|
|
|
|
|
#else
|
|
|
|
|
Dataflash_SelectChip(DATAFLASH_CHIP1);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress);
|
|
|
|
|
|
|
|
|
|
/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
|
|
|
|
|
* dataflash commands which require a complete 24-byte address.
|
|
|
|
@ -191,16 +174,7 @@
|
|
|
|
|
* \param PageAddress Page address within the selected dataflash IC
|
|
|
|
|
* \param BufferByte Address within the dataflash's buffer
|
|
|
|
|
*/
|
|
|
|
|
static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)
|
|
|
|
|
{
|
|
|
|
|
#if (DATAFLASH_TOTALCHIPS == 2)
|
|
|
|
|
PageAddress >>= 1;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Dataflash_SendByte(PageAddress >> 5);
|
|
|
|
|
Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
|
|
|
|
|
Dataflash_SendByte(BufferByte);
|
|
|
|
|
}
|
|
|
|
|
static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte);
|
|
|
|
|
|
|
|
|
|
/* Disable C linkage for C++ Compilers: */
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
|