at26.h
上传用户:xukun0987
上传日期:2022-07-16
资源大小:216k
文件大小:10k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, Atmel Corporation
  5.  *
  6.  * All rights reserved.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions are met:
  10.  *
  11.  * - Redistributions of source code must retain the above copyright notice,
  12.  * this list of conditions and the disclaimer below.
  13.  *
  14.  * Atmel's name may not be used to endorse or promote products derived from
  15.  * this software without specific prior written permission.
  16.  *
  17.  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20.  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23.  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24.  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25.  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * ----------------------------------------------------------------------------
  28.  */
  29. //------------------------------------------------------------------------------
  30. /// unit
  31. ///
  32. /// !Purpose
  33. /// 
  34. /// The AT26 serial firmware Dataflash driver is based on top of the 
  35. /// corresponding Spi driver. A Dataflash structure instance has to be 
  36. /// initialized using the DF_Init function. Then basic dataflash 
  37. /// operations can be launched using macros such as DF_continuous_read. 
  38. /// These macros invoke the DF_Command() function which invokes the 
  39. /// DPI low driver using the SPI_SendCommand() function.
  40. /// Beware to compute the dataflash internal address, the dataflash sector
  41. /// description must be known (DataflashDesc). Dataflash can be automatically
  42. /// detected using the DF_Scan() function.
  43. ///
  44. /// !Usage
  45. /// 
  46. /// -# Initializes an AT26 instance and configures SPI chip select pin
  47. ///    using AT26_Configure().
  48. /// -# Detect DF and returns DF description corresponding to the device
  49. ///    connected using AT26_FindDevice().This function shall be called by 
  50. ///    the application before AT26_SendCommand().
  51. /// -# Sends a command to the DF through the SPI using AT26_SendCommand().
  52. ///    The command is identified by its command code and the number of 
  53. ///    bytes to transfer.
  54. ///    -# Example code for sending command to write a page to DF.
  55. /// code
  56. ///    // Program page
  57. ///    error = AT26_SendCommand(pAt26, AT26_BYTE_PAGE_PROGRAM, 4,
  58. ///            pData, writeSize, address, 0, 0);
  59. /// endcode
  60. ///    -# Example code for sending command to read a page from DF.
  61. ///       If data needs to be received, then a data buffer must be 
  62. ///       provided.
  63. /// code
  64. ///    // Start a read operation
  65. ///    error = AT26_SendCommand(pAt26, AT26_READ_ARRAY_LF, 
  66. ///            4, pData, size, address, 0, 0);
  67. /// endcode
  68. ///    -# This function does not block; its optional callback will 
  69. ///       be invoked when the transfer completes.
  70. /// -# Check the AT26 driver is ready or not by polling AT26_IsBusy().
  71. ///
  72. //------------------------------------------------------------------------------
  73. #ifndef AT26_H
  74. #define AT26_H
  75. //------------------------------------------------------------------------------
  76. //         Headers
  77. //------------------------------------------------------------------------------
  78. #include "spid.h"
  79. //------------------------------------------------------------------------------
  80. //         Macros
  81. //------------------------------------------------------------------------------
  82. #define AT26_Size(pAt26)            ((pAt26)->pDesc->size)
  83. #define AT26_PageSize(pAt26)        ((pAt26)->pDesc->pageSize)
  84. #define AT26_BlockSize(pAt26)       ((pAt26)->pDesc->blockSize)
  85. #define AT26_Name(pAt26)            ((pAt26)->pDesc->name)
  86. #define AT26_PageNumber(pAt26)      (AT26_Size(pAt26) / AT26_PageSize(pAt26))
  87. #define AT26_BlockNumber(pAt26)     (AT26_Size(pAt26) / AT26_BlockSize(pAt26))
  88. #define AT26_PagePerBlock(pAt26)    (AT26_BlockSize(pAt26) / AT26_PageSize(pAt26))
  89. #define AT26_BlockEraseCmd(pAt26)   ((pAt26)->pDesc->blockEraseCmd)
  90. //------------------------------------------------------------------------------
  91. //         Definitions
  92. //------------------------------------------------------------------------------
  93. /// Device is protected, operation cannot be carried out.
  94. #define AT26_ERROR_PROTECTED        1
  95. /// Device is busy executing a command.
  96. #define AT26_ERROR_BUSY             2
  97. /// There was a problem while trying to program page data.
  98. #define AT26_ERROR_PROGRAM          3
  99. /// There was an SPI communication error.
  100. #define AT26_ERROR_SPI              4
  101. /// Device ready/busy status bit.
  102. #define AT26_STATUS_RDYBSY          (1 << 0)
  103. /// Device is ready.
  104. #define AT26_STATUS_RDYBSY_READY    (0 << 0)
  105. /// Device is busy with internal operations.
  106. #define AT26_STATUS_RDYBSY_BUSY     (1 << 0)
  107. /// Write enable latch status bit.
  108. #define AT26_STATUS_WEL             (1 << 1)
  109. /// Device is not write enabled.
  110. #define AT26_STATUS_WEL_DISABLED    (0 << 1)
  111. /// Device is write enabled.
  112. #define AT26_STATUS_WEL_ENABLED     (1 << 1)
  113. /// Software protection status bitfield.
  114. #define AT26_STATUS_SWP             (3 << 2)
  115. /// All sectors are software protected.
  116. #define AT26_STATUS_SWP_PROTALL     (3 << 2)
  117. /// Some sectors are software protected.
  118. #define AT26_STATUS_SWP_PROTSOME    (1 << 2)
  119. /// No sector is software protected.
  120. #define AT26_STATUS_SWP_PROTNONE    (0 << 2)
  121. /// Write protect pin status bit.
  122. #define AT26_STATUS_WPP             (1 << 4)
  123. /// Write protect signal is not asserted.
  124. #define AT26_STATUS_WPP_NOTASSERTED (0 << 4)
  125. /// Write protect signal is asserted.
  126. #define AT26_STATUS_WPP_ASSERTED    (1 << 4)
  127. /// Erase/program error bit.
  128. #define AT26_STATUS_EPE             (1 << 5)
  129. /// Erase or program operation was successful.
  130. #define AT26_STATUS_EPE_SUCCESS     (0 << 5)
  131. /// Erase or program error detected.
  132. #define AT26_STATUS_EPE_ERROR       (1 << 5)
  133. /// Sector protection registers locked bit.
  134. #define AT26_STATUS_SPRL            (1 << 7)
  135. /// Sector protection registers are unlocked.
  136. #define AT26_STATUS_SPRL_UNLOCKED   (0 << 7)
  137. /// Sector protection registers are locked.
  138. #define AT26_STATUS_SPRL_LOCKED     (1 << 7)
  139. /// Read array command code.
  140. #define AT26_READ_ARRAY             0x0B
  141. /// Read array (low frequency) command code.
  142. #define AT26_READ_ARRAY_LF          0x03
  143. /// Block erase command code (4K block).
  144. #define AT26_BLOCK_ERASE_4K         0x20
  145. /// Block erase command code (32K block).
  146. #define AT26_BLOCK_ERASE_32K        0x52
  147. /// Block erase command code (64K block).
  148. #define AT26_BLOCK_ERASE_64K        0xD8
  149. /// Chip erase command code 1.
  150. #define AT26_CHIP_ERASE_1           0x60
  151. /// Chip erase command code 2.
  152. #define AT26_CHIP_ERASE_2           0xC7
  153. /// Byte/page program command code.
  154. #define AT26_BYTE_PAGE_PROGRAM      0x02
  155. /// Sequential program mode command code 1.
  156. #define AT26_SEQUENTIAL_PROGRAM_1   0xAD
  157. /// Sequential program mode command code 2.
  158. #define AT26_SEQUENTIAL_PROGRAM_2   0xAF
  159. /// Write enable command code.
  160. #define AT26_WRITE_ENABLE           0x06
  161. /// Write disable command code.
  162. #define AT26_WRITE_DISABLE          0x04
  163. /// Protect sector command code.
  164. #define AT26_PROTECT_SECTOR         0x36
  165. /// Unprotect sector command code.
  166. #define AT26_UNPROTECT_SECTOR       0x39
  167. /// Read sector protection registers command code.
  168. #define AT26_READ_SECTOR_PROT       0x3C
  169. /// Read status register command code.
  170. #define AT26_READ_STATUS            0x05
  171. /// Write status register command code.
  172. #define AT26_WRITE_STATUS           0x01
  173. /// Read manufacturer and device ID command code.
  174. #define AT26_READ_JEDEC_ID          0x9F
  175. /// Deep power-down command code.
  176. #define AT26_DEEP_PDOWN             0xB9
  177. /// Resume from deep power-down command code.
  178. #define AT26_RES_DEEP_PDOWN         0xAB
  179. //------------------------------------------------------------------------------
  180. //         Types
  181. //------------------------------------------------------------------------------
  182. //------------------------------------------------------------------------------
  183. /// Describes a serial firmware flash device parameters.
  184. //------------------------------------------------------------------------------
  185. typedef struct _At26Desc {
  186.     /// Device string name.
  187.     const char *name;
  188.     /// JEDEC ID of device.
  189.     unsigned int jedecId;
  190.     /// Size of device in bytes.
  191. unsigned int size;
  192.     /// Size of one page in bytes.
  193. unsigned int pageSize;
  194.     /// Block erase size in bytes.
  195. unsigned int blockSize;
  196.     /// Block erase command.
  197.     unsigned int blockEraseCmd;
  198. } At26Desc;
  199. //------------------------------------------------------------------------------
  200. /// Serial flash driver structure. Holds the current state of the driver, 
  201. /// including the current command and the descriptor for the underlying device.
  202. //------------------------------------------------------------------------------
  203. typedef struct _At26 {
  204.     /// Pointer to the underlying SPI driver.
  205. Spid *pSpid;
  206.     /// Current SPI command sent to the SPI driver.
  207. SpidCmd command;
  208.     /// Pointer to a descriptor for the serial firmware flash device.
  209. const At26Desc *pDesc;
  210.     /// Command buffer.
  211. unsigned int pCmdBuffer[2];
  212. } At26;
  213. //------------------------------------------------------------------------------
  214. //         Exported functions
  215. //------------------------------------------------------------------------------
  216. extern void AT26_Configure(At26 *pAt26, Spid *pSpid, unsigned char cs);
  217. extern unsigned char AT26_SendCommand(
  218. At26 *pAt26,
  219. unsigned char cmd,
  220. unsigned char cmdSize,
  221. unsigned char *pData,
  222. unsigned int dataSize,
  223. unsigned int address,
  224.     SpidCallback callback,
  225. void *pArgument);
  226. extern unsigned char AT26_IsBusy(At26 *pAt26);
  227. extern const At26Desc * AT26_FindDevice(
  228.     At26 *pAt26,
  229.     unsigned int jedecId);
  230. #endif //#ifndef AT26_H