Board Dataflash driver now allows for dataflash ICs which use different shifts for setting the current page/byte address (thanks to Kenneth Clubb).
This commit is contained in:
parent
e611b250c1
commit
d770d98bca
7 changed files with 181 additions and 64 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue