Dataflash.h 8.45 KB
 Dean Camera committed May 08, 2010 1 2 /* LUFA Library  Dean Camera committed Jan 01, 2011 3  Copyright (C) Dean Camera, 2011.  4   Dean Camera committed May 08, 2010 5  dean [at] fourwalledcubicle [dot] com  Dean Camera committed Oct 28, 2010 6  www.lufa-lib.org  Dean Camera committed May 08, 2010 7 8 9 */ /*  Dean Camera committed Jan 01, 2011 10  Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)  Dean Camera committed May 08, 2010 11   12  Permission to use, copy, modify, distribute, and sell this  Dean Camera committed May 08, 2010 13  software and its documentation for any purpose is hereby granted  14  without fee, provided that the above copyright notice appear in  Dean Camera committed May 08, 2010 15  all copies and that both that the copyright notice and this  16 17 18  permission notice and warranty disclaimer appear in supporting documentation, and that the name of the author not be used in advertising or publicity pertaining to distribution of the  Dean Camera committed May 08, 2010 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51  software without specific, written prior permission. The author disclaim all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall the author be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. */ /* This is a stub driver header file, for implementing custom board layout hardware with compatible LUFA board specific drivers. If the library is configured to use the BOARD_USER board mode, this driver file should be completed and copied into the "/Board/" folder inside the application's folder. This stub is for the board-specific component of the LUFA Dataflash driver. */ #ifndef __DATAFLASH_USER_H__ #define __DATAFLASH_USER_H__ /* Includes: */ // TODO: Add any required includes here /* Preprocessor Checks: */ #if !defined(__INCLUDE_FROM_DATAFLASH_H) #error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. #endif  52   Dean Camera committed May 08, 2010 53 54 55  /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Macros: */  Dean Camera committed Jul 29, 2010 56  #define DATAFLASH_CHIPCS_MASK // TODO: Replace this with a mask of all the /CS pins of all Dataflashes  Dean Camera committed May 08, 2010 57 58 59  #define DATAFLASH_CHIPCS_DDR // TODO: Replace with the DDR register name for the board's Dataflash ICs #define DATAFLASH_CHIPCS_PORT // TODO: Replace with the PORT register name for the board's Dataflash ICs #endif  60   Dean Camera committed May 08, 2010 61 62 63  /* Public Interface - May be used in end-application: */ /* Macros: */ /** Constant indicating the total number of dataflash ICs mounted on the selected board. */  Dean Camera committed Sep 11, 2010 64  #define DATAFLASH_TOTALCHIPS 1 // TODO: Replace with the number of Dataflashes on the board, max 2  Dean Camera committed May 08, 2010 65 66 67 68 69  /** Mask for no dataflash chip selected. */ #define DATAFLASH_NO_CHIP DATAFLASH_CHIPCS_MASK /** Mask for the first dataflash chip selected. */  Dean Camera committed Jul 04, 2010 70  #define DATAFLASH_CHIP1 // TODO: Replace with mask to hold /CS of first Dataflash low, and all others high  Dean Camera committed May 08, 2010 71 72  /** Mask for the second dataflash chip selected. */  Dean Camera committed Jul 04, 2010 73  #define DATAFLASH_CHIP2 // TODO: Replace with mask to hold /CS of second Dataflash low, and all others high  74   Dean Camera committed May 08, 2010 75 76 77 78 79 80 81  /** Internal main memory page size for the board's dataflash ICs. */ #define DATAFLASH_PAGE_SIZE // TODO: Replace with the page size for the Dataflash ICs /** Total number of pages inside each of the board's dataflash ICs. */ #define DATAFLASH_PAGES // TODO: Replace with the total number of pages inside one of the Dataflash ICs /* Inline Functions: */  Dean Camera committed Jun 01, 2011 82  /** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.  Dean Camera committed Feb 20, 2011 83  * The microcontroller's SPI driver MUST be initialized before any of the dataflash commands are used.  Dean Camera committed Jul 22, 2010 84 85 86 87 88 89  */ static inline void Dataflash_Init(void) { DATAFLASH_CHIPCS_DDR |= DATAFLASH_CHIPCS_MASK; DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; }  90   Dean Camera committed Nov 01, 2011 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122  /** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. * * \param[in] Byte of data to send to the dataflash * * \return Last response byte from the dataflash */ static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) { return SPI_TransferByte(Byte); } /** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. * * \param[in] Byte of data to send to the dataflash */ static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; static inline void Dataflash_SendByte(const uint8_t Byte) { SPI_SendByte(Byte); } /** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. * * \return Last response byte from the dataflash */ static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline uint8_t Dataflash_ReceiveByte(void) { return SPI_ReceiveByte(); }  Dean Camera committed Jul 22, 2010 123 124 125  /** Determines the currently selected dataflash chip. * * \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected  Dean Camera committed Aug 18, 2010 126  * or a DATAFLASH_CHIPn mask (where n is the chip number).  Dean Camera committed Jul 22, 2010 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151  */ static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; static inline uint8_t Dataflash_GetSelectedChip(void) { return (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); } /** Selects the given dataflash chip. * * \param[in] ChipMask Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is * the chip number). */ static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; static inline void Dataflash_SelectChip(const uint8_t ChipMask) { DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT & ~DATAFLASH_CHIPCS_MASK) | ChipMask); } /** Deselects the current dataflash chip, so that no dataflash is selected. */ static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; static inline void Dataflash_DeselectChip(void) { Dataflash_SelectChip(DATAFLASH_NO_CHIP); }  Dean Camera committed May 08, 2010 152 153 154 155 156 157 158  /** 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. * * \param[in] PageAddress Address of the page to manipulate, ranging from  Dean Camera committed Jun 05, 2011 159  * 0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).  Dean Camera committed May 08, 2010 160 161 162 163  */ static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) { Dataflash_DeselectChip();  164   Dean Camera committed May 08, 2010 165 166 167  if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS)) return;  Dean Camera committed Jul 04, 2010 168 169 170 171 172 173 174 175  #if (DATAFLASH_TOTALCHIPS == 2) if (PageAddress & 0x01) Dataflash_SelectChip(DATAFLASH_CHIP2); else Dataflash_SelectChip(DATAFLASH_CHIP1); #else Dataflash_SelectChip(DATAFLASH_CHIP1); #endif  Dean Camera committed May 08, 2010 176 177  }  Dean Camera committed Jul 22, 2010 178 179 180 181 182 183  /** 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) { uint8_t SelectedChipMask = Dataflash_GetSelectedChip();  184   Dean Camera committed Jul 22, 2010 185 186 187  Dataflash_DeselectChip(); Dataflash_SelectChip(SelectedChipMask); }  188   Dean Camera committed Jul 22, 2010 189 190 191 192 193 194 195 196  /** Spin-loops while the currently selected dataflash is busy executing a command, such as a main * memory page program or main memory to buffer transfer. */ static inline void Dataflash_WaitWhileBusy(void) { Dataflash_ToggleSelectedChipCS(); Dataflash_SendByte(DF_CMD_GETSTATUS); while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));  197  Dataflash_ToggleSelectedChipCS();  Dean Camera committed Jul 22, 2010 198 199  }  Dean Camera committed May 08, 2010 200  /** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with  Dean Camera committed Jun 05, 2011 201  * dataflash commands which require a complete 24-bit address.  Dean Camera committed May 08, 2010 202 203 204 205 206  * * \param[in] PageAddress Page address within the selected dataflash IC * \param[in] BufferByte Address within the dataflash's buffer */ static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, const uint16_t BufferByte)  Dean Camera committed Jul 04, 2010 207 208 209 210  { #if (DATAFLASH_TOTALCHIPS == 2) PageAddress >>= 1; #endif  211   Dean Camera committed May 08, 2010 212 213 214 215  Dataflash_SendByte(PageAddress >> 5); Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); Dataflash_SendByte(BufferByte); }  216   Dean Camera committed May 08, 2010 217 #endif  218