Mercurial > public > ostc4
comparison Common/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c @ 160:e3ca52b8e7fa
Merge with FlipDisplay
author | heinrichsweikamp |
---|---|
date | Thu, 07 Mar 2019 15:06:43 +0100 |
parents | c78bcbd5deda |
children |
comparison
equal
deleted
inserted
replaced
80:cc2bb7bb8456 | 160:e3ca52b8e7fa |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @file stm32f4xx_hal_nor.c | |
4 * @author MCD Application Team | |
5 * @brief NOR HAL module driver. | |
6 * This file provides a generic firmware to drive NOR memories mounted | |
7 * as external device. | |
8 * | |
9 @verbatim | |
10 ============================================================================== | |
11 ##### How to use this driver ##### | |
12 ============================================================================== | |
13 [..] | |
14 This driver is a generic layered driver which contains a set of APIs used to | |
15 control NOR flash memories. It uses the FMC/FSMC layer functions to interface | |
16 with NOR devices. This driver is used as follows: | |
17 | |
18 (+) NOR flash memory configuration sequence using the function HAL_NOR_Init() | |
19 with control and timing parameters for both normal and extended mode. | |
20 | |
21 (+) Read NOR flash memory manufacturer code and device IDs using the function | |
22 HAL_NOR_Read_ID(). The read information is stored in the NOR_ID_TypeDef | |
23 structure declared by the function caller. | |
24 | |
25 (+) Access NOR flash memory by read/write data unit operations using the functions | |
26 HAL_NOR_Read(), HAL_NOR_Program(). | |
27 | |
28 (+) Perform NOR flash erase block/chip operations using the functions | |
29 HAL_NOR_Erase_Block() and HAL_NOR_Erase_Chip(). | |
30 | |
31 (+) Read the NOR flash CFI (common flash interface) IDs using the function | |
32 HAL_NOR_Read_CFI(). The read information is stored in the NOR_CFI_TypeDef | |
33 structure declared by the function caller. | |
34 | |
35 (+) You can also control the NOR device by calling the control APIs HAL_NOR_WriteOperation_Enable()/ | |
36 HAL_NOR_WriteOperation_Disable() to respectively enable/disable the NOR write operation | |
37 | |
38 (+) You can monitor the NOR device HAL state by calling the function | |
39 HAL_NOR_GetState() | |
40 [..] | |
41 (@) This driver is a set of generic APIs which handle standard NOR flash operations. | |
42 If a NOR flash device contains different operations and/or implementations, | |
43 it should be implemented separately. | |
44 | |
45 *** NOR HAL driver macros list *** | |
46 ============================================= | |
47 [..] | |
48 Below the list of most used macros in NOR HAL driver. | |
49 | |
50 (+) NOR_WRITE : NOR memory write data to specified address | |
51 | |
52 @endverbatim | |
53 ****************************************************************************** | |
54 * @attention | |
55 * | |
56 * <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |
57 * | |
58 * Redistribution and use in source and binary forms, with or without modification, | |
59 * are permitted provided that the following conditions are met: | |
60 * 1. Redistributions of source code must retain the above copyright notice, | |
61 * this list of conditions and the following disclaimer. | |
62 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
63 * this list of conditions and the following disclaimer in the documentation | |
64 * and/or other materials provided with the distribution. | |
65 * 3. Neither the name of STMicroelectronics nor the names of its contributors | |
66 * may be used to endorse or promote products derived from this software | |
67 * without specific prior written permission. | |
68 * | |
69 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
70 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
71 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
72 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
73 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
74 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
75 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
76 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
77 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
78 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
79 * | |
80 ****************************************************************************** | |
81 */ | |
82 | |
83 /* Includes ------------------------------------------------------------------*/ | |
84 #include "stm32f4xx_hal.h" | |
85 | |
86 /** @addtogroup STM32F4xx_HAL_Driver | |
87 * @{ | |
88 */ | |
89 | |
90 /** @defgroup NOR NOR | |
91 * @brief NOR driver modules | |
92 * @{ | |
93 */ | |
94 #ifdef HAL_NOR_MODULE_ENABLED | |
95 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ | |
96 defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ | |
97 defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ | |
98 defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) | |
99 /* Private typedef -----------------------------------------------------------*/ | |
100 /* Private define ------------------------------------------------------------*/ | |
101 | |
102 /** @defgroup NOR_Private_Defines NOR Private Defines | |
103 * @{ | |
104 */ | |
105 | |
106 /* Constants to define address to set to write a command */ | |
107 #define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555 | |
108 #define NOR_CMD_ADDRESS_FIRST_CFI (uint16_t)0x0055 | |
109 #define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AA | |
110 #define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555 | |
111 #define NOR_CMD_ADDRESS_FOURTH (uint16_t)0x0555 | |
112 #define NOR_CMD_ADDRESS_FIFTH (uint16_t)0x02AA | |
113 #define NOR_CMD_ADDRESS_SIXTH (uint16_t)0x0555 | |
114 | |
115 /* Constants to define data to program a command */ | |
116 #define NOR_CMD_DATA_READ_RESET (uint16_t)0x00F0 | |
117 #define NOR_CMD_DATA_FIRST (uint16_t)0x00AA | |
118 #define NOR_CMD_DATA_SECOND (uint16_t)0x0055 | |
119 #define NOR_CMD_DATA_AUTO_SELECT (uint16_t)0x0090 | |
120 #define NOR_CMD_DATA_PROGRAM (uint16_t)0x00A0 | |
121 #define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (uint16_t)0x0080 | |
122 #define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (uint16_t)0x00AA | |
123 #define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (uint16_t)0x0055 | |
124 #define NOR_CMD_DATA_CHIP_ERASE (uint16_t)0x0010 | |
125 #define NOR_CMD_DATA_CFI (uint16_t)0x0098 | |
126 | |
127 #define NOR_CMD_DATA_BUFFER_AND_PROG (uint8_t)0x25 | |
128 #define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM (uint8_t)0x29 | |
129 #define NOR_CMD_DATA_BLOCK_ERASE (uint8_t)0x30 | |
130 | |
131 /* Mask on NOR STATUS REGISTER */ | |
132 #define NOR_MASK_STATUS_DQ5 (uint16_t)0x0020 | |
133 #define NOR_MASK_STATUS_DQ6 (uint16_t)0x0040 | |
134 | |
135 /** | |
136 * @} | |
137 */ | |
138 | |
139 /* Private macro -------------------------------------------------------------*/ | |
140 /* Private variables ---------------------------------------------------------*/ | |
141 /** @defgroup NOR_Private_Variables NOR Private Variables | |
142 * @{ | |
143 */ | |
144 | |
145 static uint32_t uwNORMemoryDataWidth = NOR_MEMORY_8B; | |
146 | |
147 /** | |
148 * @} | |
149 */ | |
150 | |
151 /* Private functions ---------------------------------------------------------*/ | |
152 /* Exported functions --------------------------------------------------------*/ | |
153 /** @defgroup NOR_Exported_Functions NOR Exported Functions | |
154 * @{ | |
155 */ | |
156 | |
157 /** @defgroup NOR_Exported_Functions_Group1 Initialization and de-initialization functions | |
158 * @brief Initialization and Configuration functions | |
159 * | |
160 @verbatim | |
161 ============================================================================== | |
162 ##### NOR Initialization and de_initialization functions ##### | |
163 ============================================================================== | |
164 [..] | |
165 This section provides functions allowing to initialize/de-initialize | |
166 the NOR memory | |
167 | |
168 @endverbatim | |
169 * @{ | |
170 */ | |
171 | |
172 /** | |
173 * @brief Perform the NOR memory Initialization sequence | |
174 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
175 * the configuration information for NOR module. | |
176 * @param Timing pointer to NOR control timing structure | |
177 * @param ExtTiming pointer to NOR extended mode timing structure | |
178 * @retval HAL status | |
179 */ | |
180 HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDef *Timing, FMC_NORSRAM_TimingTypeDef *ExtTiming) | |
181 { | |
182 /* Check the NOR handle parameter */ | |
183 if(hnor == NULL) | |
184 { | |
185 return HAL_ERROR; | |
186 } | |
187 | |
188 if(hnor->State == HAL_NOR_STATE_RESET) | |
189 { | |
190 /* Allocate lock resource and initialize it */ | |
191 hnor->Lock = HAL_UNLOCKED; | |
192 /* Initialize the low level hardware (MSP) */ | |
193 HAL_NOR_MspInit(hnor); | |
194 } | |
195 | |
196 /* Initialize NOR control Interface */ | |
197 FMC_NORSRAM_Init(hnor->Instance, &(hnor->Init)); | |
198 | |
199 /* Initialize NOR timing Interface */ | |
200 FMC_NORSRAM_Timing_Init(hnor->Instance, Timing, hnor->Init.NSBank); | |
201 | |
202 /* Initialize NOR extended mode timing Interface */ | |
203 FMC_NORSRAM_Extended_Timing_Init(hnor->Extended, ExtTiming, hnor->Init.NSBank, hnor->Init.ExtendedMode); | |
204 | |
205 /* Enable the NORSRAM device */ | |
206 __FMC_NORSRAM_ENABLE(hnor->Instance, hnor->Init.NSBank); | |
207 | |
208 /* Initialize NOR Memory Data Width*/ | |
209 if (hnor->Init.MemoryDataWidth == FMC_NORSRAM_MEM_BUS_WIDTH_8) | |
210 { | |
211 uwNORMemoryDataWidth = NOR_MEMORY_8B; | |
212 } | |
213 else | |
214 { | |
215 uwNORMemoryDataWidth = NOR_MEMORY_16B; | |
216 } | |
217 | |
218 /* Check the NOR controller state */ | |
219 hnor->State = HAL_NOR_STATE_READY; | |
220 | |
221 return HAL_OK; | |
222 } | |
223 | |
224 /** | |
225 * @brief Perform NOR memory De-Initialization sequence | |
226 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
227 * the configuration information for NOR module. | |
228 * @retval HAL status | |
229 */ | |
230 HAL_StatusTypeDef HAL_NOR_DeInit(NOR_HandleTypeDef *hnor) | |
231 { | |
232 /* De-Initialize the low level hardware (MSP) */ | |
233 HAL_NOR_MspDeInit(hnor); | |
234 | |
235 /* Configure the NOR registers with their reset values */ | |
236 FMC_NORSRAM_DeInit(hnor->Instance, hnor->Extended, hnor->Init.NSBank); | |
237 | |
238 /* Update the NOR controller state */ | |
239 hnor->State = HAL_NOR_STATE_RESET; | |
240 | |
241 /* Release Lock */ | |
242 __HAL_UNLOCK(hnor); | |
243 | |
244 return HAL_OK; | |
245 } | |
246 | |
247 /** | |
248 * @brief NOR MSP Init | |
249 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
250 * the configuration information for NOR module. | |
251 * @retval None | |
252 */ | |
253 __weak void HAL_NOR_MspInit(NOR_HandleTypeDef *hnor) | |
254 { | |
255 /* Prevent unused argument(s) compilation warning */ | |
256 UNUSED(hnor); | |
257 /* NOTE : This function Should not be modified, when the callback is needed, | |
258 the HAL_NOR_MspInit could be implemented in the user file | |
259 */ | |
260 } | |
261 | |
262 /** | |
263 * @brief NOR MSP DeInit | |
264 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
265 * the configuration information for NOR module. | |
266 * @retval None | |
267 */ | |
268 __weak void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor) | |
269 { | |
270 /* Prevent unused argument(s) compilation warning */ | |
271 UNUSED(hnor); | |
272 /* NOTE : This function Should not be modified, when the callback is needed, | |
273 the HAL_NOR_MspDeInit could be implemented in the user file | |
274 */ | |
275 } | |
276 | |
277 /** | |
278 * @brief NOR MSP Wait for Ready/Busy signal | |
279 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
280 * the configuration information for NOR module. | |
281 * @param Timeout Maximum timeout value | |
282 * @retval None | |
283 */ | |
284 __weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) | |
285 { | |
286 /* Prevent unused argument(s) compilation warning */ | |
287 UNUSED(hnor); | |
288 UNUSED(Timeout); | |
289 | |
290 /* NOTE : This function Should not be modified, when the callback is needed, | |
291 the HAL_NOR_MspWait could be implemented in the user file | |
292 */ | |
293 } | |
294 | |
295 /** | |
296 * @} | |
297 */ | |
298 | |
299 /** @defgroup NOR_Exported_Functions_Group2 Input and Output functions | |
300 * @brief Input Output and memory control functions | |
301 * | |
302 @verbatim | |
303 ============================================================================== | |
304 ##### NOR Input and Output functions ##### | |
305 ============================================================================== | |
306 [..] | |
307 This section provides functions allowing to use and control the NOR memory | |
308 | |
309 @endverbatim | |
310 * @{ | |
311 */ | |
312 | |
313 /** | |
314 * @brief Read NOR flash IDs | |
315 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
316 * the configuration information for NOR module. | |
317 * @param pNOR_ID pointer to NOR ID structure | |
318 * @retval HAL status | |
319 */ | |
320 HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_ID) | |
321 { | |
322 uint32_t deviceaddress = 0U; | |
323 | |
324 /* Process Locked */ | |
325 __HAL_LOCK(hnor); | |
326 | |
327 /* Check the NOR controller state */ | |
328 if(hnor->State == HAL_NOR_STATE_BUSY) | |
329 { | |
330 return HAL_BUSY; | |
331 } | |
332 | |
333 /* Select the NOR device address */ | |
334 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
335 { | |
336 deviceaddress = NOR_MEMORY_ADRESS1; | |
337 } | |
338 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
339 { | |
340 deviceaddress = NOR_MEMORY_ADRESS2; | |
341 } | |
342 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
343 { | |
344 deviceaddress = NOR_MEMORY_ADRESS3; | |
345 } | |
346 else /* FMC_NORSRAM_BANK4 */ | |
347 { | |
348 deviceaddress = NOR_MEMORY_ADRESS4; | |
349 } | |
350 | |
351 /* Update the NOR controller state */ | |
352 hnor->State = HAL_NOR_STATE_BUSY; | |
353 | |
354 /* Send read ID command */ | |
355 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
356 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
357 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_AUTO_SELECT); | |
358 | |
359 /* Read the NOR IDs */ | |
360 pNOR_ID->Manufacturer_Code = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, MC_ADDRESS); | |
361 pNOR_ID->Device_Code1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, DEVICE_CODE1_ADDR); | |
362 pNOR_ID->Device_Code2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, DEVICE_CODE2_ADDR); | |
363 pNOR_ID->Device_Code3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, DEVICE_CODE3_ADDR); | |
364 | |
365 /* Check the NOR controller state */ | |
366 hnor->State = HAL_NOR_STATE_READY; | |
367 | |
368 /* Process unlocked */ | |
369 __HAL_UNLOCK(hnor); | |
370 | |
371 return HAL_OK; | |
372 } | |
373 | |
374 /** | |
375 * @brief Returns the NOR memory to Read mode. | |
376 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
377 * the configuration information for NOR module. | |
378 * @retval HAL status | |
379 */ | |
380 HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor) | |
381 { | |
382 uint32_t deviceaddress = 0U; | |
383 | |
384 /* Process Locked */ | |
385 __HAL_LOCK(hnor); | |
386 | |
387 /* Check the NOR controller state */ | |
388 if(hnor->State == HAL_NOR_STATE_BUSY) | |
389 { | |
390 return HAL_BUSY; | |
391 } | |
392 | |
393 /* Select the NOR device address */ | |
394 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
395 { | |
396 deviceaddress = NOR_MEMORY_ADRESS1; | |
397 } | |
398 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
399 { | |
400 deviceaddress = NOR_MEMORY_ADRESS2; | |
401 } | |
402 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
403 { | |
404 deviceaddress = NOR_MEMORY_ADRESS3; | |
405 } | |
406 else /* FMC_NORSRAM_BANK4 */ | |
407 { | |
408 deviceaddress = NOR_MEMORY_ADRESS4; | |
409 } | |
410 | |
411 NOR_WRITE(deviceaddress, NOR_CMD_DATA_READ_RESET); | |
412 | |
413 /* Check the NOR controller state */ | |
414 hnor->State = HAL_NOR_STATE_READY; | |
415 | |
416 /* Process unlocked */ | |
417 __HAL_UNLOCK(hnor); | |
418 | |
419 return HAL_OK; | |
420 } | |
421 | |
422 /** | |
423 * @brief Read data from NOR memory | |
424 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
425 * the configuration information for NOR module. | |
426 * @param pAddress pointer to Device address | |
427 * @param pData pointer to read data | |
428 * @retval HAL status | |
429 */ | |
430 HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) | |
431 { | |
432 uint32_t deviceaddress = 0U; | |
433 | |
434 /* Process Locked */ | |
435 __HAL_LOCK(hnor); | |
436 | |
437 /* Check the NOR controller state */ | |
438 if(hnor->State == HAL_NOR_STATE_BUSY) | |
439 { | |
440 return HAL_BUSY; | |
441 } | |
442 | |
443 /* Select the NOR device address */ | |
444 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
445 { | |
446 deviceaddress = NOR_MEMORY_ADRESS1; | |
447 } | |
448 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
449 { | |
450 deviceaddress = NOR_MEMORY_ADRESS2; | |
451 } | |
452 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
453 { | |
454 deviceaddress = NOR_MEMORY_ADRESS3; | |
455 } | |
456 else /* FMC_NORSRAM_BANK4 */ | |
457 { | |
458 deviceaddress = NOR_MEMORY_ADRESS4; | |
459 } | |
460 | |
461 /* Update the NOR controller state */ | |
462 hnor->State = HAL_NOR_STATE_BUSY; | |
463 | |
464 /* Send read data command */ | |
465 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
466 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
467 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET); | |
468 | |
469 /* Read the data */ | |
470 *pData = *(__IO uint32_t *)(uint32_t)pAddress; | |
471 | |
472 /* Check the NOR controller state */ | |
473 hnor->State = HAL_NOR_STATE_READY; | |
474 | |
475 /* Process unlocked */ | |
476 __HAL_UNLOCK(hnor); | |
477 | |
478 return HAL_OK; | |
479 } | |
480 | |
481 /** | |
482 * @brief Program data to NOR memory | |
483 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
484 * the configuration information for NOR module. | |
485 * @param pAddress Device address | |
486 * @param pData pointer to the data to write | |
487 * @retval HAL status | |
488 */ | |
489 HAL_StatusTypeDef HAL_NOR_Program(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) | |
490 { | |
491 uint32_t deviceaddress = 0U; | |
492 | |
493 /* Process Locked */ | |
494 __HAL_LOCK(hnor); | |
495 | |
496 /* Check the NOR controller state */ | |
497 if(hnor->State == HAL_NOR_STATE_BUSY) | |
498 { | |
499 return HAL_BUSY; | |
500 } | |
501 | |
502 /* Select the NOR device address */ | |
503 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
504 { | |
505 deviceaddress = NOR_MEMORY_ADRESS1; | |
506 } | |
507 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
508 { | |
509 deviceaddress = NOR_MEMORY_ADRESS2; | |
510 } | |
511 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
512 { | |
513 deviceaddress = NOR_MEMORY_ADRESS3; | |
514 } | |
515 else /* FMC_NORSRAM_BANK4 */ | |
516 { | |
517 deviceaddress = NOR_MEMORY_ADRESS4; | |
518 } | |
519 | |
520 /* Update the NOR controller state */ | |
521 hnor->State = HAL_NOR_STATE_BUSY; | |
522 | |
523 /* Send program data command */ | |
524 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
525 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
526 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_PROGRAM); | |
527 | |
528 /* Write the data */ | |
529 NOR_WRITE(pAddress, *pData); | |
530 | |
531 /* Check the NOR controller state */ | |
532 hnor->State = HAL_NOR_STATE_READY; | |
533 | |
534 /* Process unlocked */ | |
535 __HAL_UNLOCK(hnor); | |
536 | |
537 return HAL_OK; | |
538 } | |
539 | |
540 /** | |
541 * @brief Reads a half-word buffer from the NOR memory. | |
542 * @param hnor pointer to the NOR handle | |
543 * @param uwAddress NOR memory internal address to read from. | |
544 * @param pData pointer to the buffer that receives the data read from the | |
545 * NOR memory. | |
546 * @param uwBufferSize number of Half word to read. | |
547 * @retval HAL status | |
548 */ | |
549 HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize) | |
550 { | |
551 uint32_t deviceaddress = 0U; | |
552 | |
553 /* Process Locked */ | |
554 __HAL_LOCK(hnor); | |
555 | |
556 /* Check the NOR controller state */ | |
557 if(hnor->State == HAL_NOR_STATE_BUSY) | |
558 { | |
559 return HAL_BUSY; | |
560 } | |
561 | |
562 /* Select the NOR device address */ | |
563 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
564 { | |
565 deviceaddress = NOR_MEMORY_ADRESS1; | |
566 } | |
567 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
568 { | |
569 deviceaddress = NOR_MEMORY_ADRESS2; | |
570 } | |
571 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
572 { | |
573 deviceaddress = NOR_MEMORY_ADRESS3; | |
574 } | |
575 else /* FMC_NORSRAM_BANK4 */ | |
576 { | |
577 deviceaddress = NOR_MEMORY_ADRESS4; | |
578 } | |
579 | |
580 /* Update the NOR controller state */ | |
581 hnor->State = HAL_NOR_STATE_BUSY; | |
582 | |
583 /* Send read data command */ | |
584 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
585 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
586 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_READ_RESET); | |
587 | |
588 /* Read buffer */ | |
589 while( uwBufferSize > 0U) | |
590 { | |
591 *pData++ = *(__IO uint16_t *)uwAddress; | |
592 uwAddress += 2U; | |
593 uwBufferSize--; | |
594 } | |
595 | |
596 /* Check the NOR controller state */ | |
597 hnor->State = HAL_NOR_STATE_READY; | |
598 | |
599 /* Process unlocked */ | |
600 __HAL_UNLOCK(hnor); | |
601 | |
602 return HAL_OK; | |
603 } | |
604 | |
605 /** | |
606 * @brief Writes a half-word buffer to the NOR memory. This function must be used | |
607 only with S29GL128P NOR memory. | |
608 * @param hnor pointer to the NOR handle | |
609 * @param uwAddress NOR memory internal start write address | |
610 * @param pData pointer to source data buffer. | |
611 * @param uwBufferSize Size of the buffer to write | |
612 * @retval HAL status | |
613 */ | |
614 HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize) | |
615 { | |
616 uint16_t * p_currentaddress = (uint16_t *)NULL; | |
617 uint16_t * p_endaddress = (uint16_t *)NULL; | |
618 uint32_t lastloadedaddress = 0U, deviceaddress = 0U; | |
619 | |
620 /* Process Locked */ | |
621 __HAL_LOCK(hnor); | |
622 | |
623 /* Check the NOR controller state */ | |
624 if(hnor->State == HAL_NOR_STATE_BUSY) | |
625 { | |
626 return HAL_BUSY; | |
627 } | |
628 | |
629 /* Select the NOR device address */ | |
630 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
631 { | |
632 deviceaddress = NOR_MEMORY_ADRESS1; | |
633 } | |
634 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
635 { | |
636 deviceaddress = NOR_MEMORY_ADRESS2; | |
637 } | |
638 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
639 { | |
640 deviceaddress = NOR_MEMORY_ADRESS3; | |
641 } | |
642 else /* FMC_NORSRAM_BANK4 */ | |
643 { | |
644 deviceaddress = NOR_MEMORY_ADRESS4; | |
645 } | |
646 | |
647 /* Update the NOR controller state */ | |
648 hnor->State = HAL_NOR_STATE_BUSY; | |
649 | |
650 /* Initialize variables */ | |
651 p_currentaddress = (uint16_t*)((uint32_t)(uwAddress)); | |
652 p_endaddress = p_currentaddress + (uwBufferSize-1U); | |
653 lastloadedaddress = (uint32_t)(uwAddress); | |
654 | |
655 /* Issue unlock command sequence */ | |
656 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
657 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
658 | |
659 /* Write Buffer Load Command */ | |
660 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, uwAddress), NOR_CMD_DATA_BUFFER_AND_PROG); | |
661 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, uwAddress), (uwBufferSize - 1U)); | |
662 | |
663 /* Load Data into NOR Buffer */ | |
664 while(p_currentaddress <= p_endaddress) | |
665 { | |
666 /* Store last loaded address & data value (for polling) */ | |
667 lastloadedaddress = (uint32_t)p_currentaddress; | |
668 | |
669 NOR_WRITE(p_currentaddress, *pData++); | |
670 | |
671 p_currentaddress ++; | |
672 } | |
673 | |
674 NOR_WRITE((uint32_t)(lastloadedaddress), NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM); | |
675 | |
676 /* Check the NOR controller state */ | |
677 hnor->State = HAL_NOR_STATE_READY; | |
678 | |
679 /* Process unlocked */ | |
680 __HAL_UNLOCK(hnor); | |
681 | |
682 return HAL_OK; | |
683 | |
684 } | |
685 | |
686 /** | |
687 * @brief Erase the specified block of the NOR memory | |
688 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
689 * the configuration information for NOR module. | |
690 * @param BlockAddress Block to erase address | |
691 * @param Address Device address | |
692 * @retval HAL status | |
693 */ | |
694 HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAddress, uint32_t Address) | |
695 { | |
696 uint32_t deviceaddress = 0U; | |
697 | |
698 /* Process Locked */ | |
699 __HAL_LOCK(hnor); | |
700 | |
701 /* Check the NOR controller state */ | |
702 if(hnor->State == HAL_NOR_STATE_BUSY) | |
703 { | |
704 return HAL_BUSY; | |
705 } | |
706 | |
707 /* Select the NOR device address */ | |
708 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
709 { | |
710 deviceaddress = NOR_MEMORY_ADRESS1; | |
711 } | |
712 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
713 { | |
714 deviceaddress = NOR_MEMORY_ADRESS2; | |
715 } | |
716 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
717 { | |
718 deviceaddress = NOR_MEMORY_ADRESS3; | |
719 } | |
720 else /* FMC_NORSRAM_BANK4 */ | |
721 { | |
722 deviceaddress = NOR_MEMORY_ADRESS4; | |
723 } | |
724 | |
725 /* Update the NOR controller state */ | |
726 hnor->State = HAL_NOR_STATE_BUSY; | |
727 | |
728 /* Send block erase command sequence */ | |
729 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
730 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
731 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); | |
732 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); | |
733 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); | |
734 NOR_WRITE((uint32_t)(BlockAddress + Address), NOR_CMD_DATA_BLOCK_ERASE); | |
735 | |
736 /* Check the NOR memory status and update the controller state */ | |
737 hnor->State = HAL_NOR_STATE_READY; | |
738 | |
739 /* Process unlocked */ | |
740 __HAL_UNLOCK(hnor); | |
741 | |
742 return HAL_OK; | |
743 | |
744 } | |
745 | |
746 /** | |
747 * @brief Erase the entire NOR chip. | |
748 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
749 * the configuration information for NOR module. | |
750 * @param Address Device address | |
751 * @retval HAL status | |
752 */ | |
753 HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address) | |
754 { | |
755 uint32_t deviceaddress = 0U; | |
756 | |
757 /* Prevent unused argument(s) compilation warning */ | |
758 UNUSED(Address); | |
759 | |
760 /* Process Locked */ | |
761 __HAL_LOCK(hnor); | |
762 | |
763 /* Check the NOR controller state */ | |
764 if(hnor->State == HAL_NOR_STATE_BUSY) | |
765 { | |
766 return HAL_BUSY; | |
767 } | |
768 | |
769 /* Select the NOR device address */ | |
770 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
771 { | |
772 deviceaddress = NOR_MEMORY_ADRESS1; | |
773 } | |
774 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
775 { | |
776 deviceaddress = NOR_MEMORY_ADRESS2; | |
777 } | |
778 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
779 { | |
780 deviceaddress = NOR_MEMORY_ADRESS3; | |
781 } | |
782 else /* FMC_NORSRAM_BANK4 */ | |
783 { | |
784 deviceaddress = NOR_MEMORY_ADRESS4; | |
785 } | |
786 | |
787 /* Update the NOR controller state */ | |
788 hnor->State = HAL_NOR_STATE_BUSY; | |
789 | |
790 /* Send NOR chip erase command sequence */ | |
791 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); | |
792 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); | |
793 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); | |
794 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); | |
795 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); | |
796 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_SIXTH), NOR_CMD_DATA_CHIP_ERASE); | |
797 | |
798 /* Check the NOR memory status and update the controller state */ | |
799 hnor->State = HAL_NOR_STATE_READY; | |
800 | |
801 /* Process unlocked */ | |
802 __HAL_UNLOCK(hnor); | |
803 | |
804 return HAL_OK; | |
805 } | |
806 | |
807 /** | |
808 * @brief Read NOR flash CFI IDs | |
809 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
810 * the configuration information for NOR module. | |
811 * @param pNOR_CFI pointer to NOR CFI IDs structure | |
812 * @retval HAL status | |
813 */ | |
814 HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR_CFI) | |
815 { | |
816 uint32_t deviceaddress = 0U; | |
817 | |
818 /* Process Locked */ | |
819 __HAL_LOCK(hnor); | |
820 | |
821 /* Check the NOR controller state */ | |
822 if(hnor->State == HAL_NOR_STATE_BUSY) | |
823 { | |
824 return HAL_BUSY; | |
825 } | |
826 | |
827 /* Select the NOR device address */ | |
828 if (hnor->Init.NSBank == FMC_NORSRAM_BANK1) | |
829 { | |
830 deviceaddress = NOR_MEMORY_ADRESS1; | |
831 } | |
832 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK2) | |
833 { | |
834 deviceaddress = NOR_MEMORY_ADRESS2; | |
835 } | |
836 else if (hnor->Init.NSBank == FMC_NORSRAM_BANK3) | |
837 { | |
838 deviceaddress = NOR_MEMORY_ADRESS3; | |
839 } | |
840 else /* FMC_NORSRAM_BANK4 */ | |
841 { | |
842 deviceaddress = NOR_MEMORY_ADRESS4; | |
843 } | |
844 | |
845 /* Update the NOR controller state */ | |
846 hnor->State = HAL_NOR_STATE_BUSY; | |
847 | |
848 /* Send read CFI query command */ | |
849 NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, NOR_CMD_ADDRESS_FIRST_CFI), NOR_CMD_DATA_CFI); | |
850 | |
851 /* read the NOR CFI information */ | |
852 pNOR_CFI->CFI_1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI1_ADDRESS); | |
853 pNOR_CFI->CFI_2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI2_ADDRESS); | |
854 pNOR_CFI->CFI_3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI3_ADDRESS); | |
855 pNOR_CFI->CFI_4 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, uwNORMemoryDataWidth, CFI4_ADDRESS); | |
856 | |
857 /* Check the NOR controller state */ | |
858 hnor->State = HAL_NOR_STATE_READY; | |
859 | |
860 /* Process unlocked */ | |
861 __HAL_UNLOCK(hnor); | |
862 | |
863 return HAL_OK; | |
864 } | |
865 | |
866 /** | |
867 * @} | |
868 */ | |
869 | |
870 /** @defgroup NOR_Exported_Functions_Group3 NOR Control functions | |
871 * @brief management functions | |
872 * | |
873 @verbatim | |
874 ============================================================================== | |
875 ##### NOR Control functions ##### | |
876 ============================================================================== | |
877 [..] | |
878 This subsection provides a set of functions allowing to control dynamically | |
879 the NOR interface. | |
880 | |
881 @endverbatim | |
882 * @{ | |
883 */ | |
884 | |
885 /** | |
886 * @brief Enables dynamically NOR write operation. | |
887 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
888 * the configuration information for NOR module. | |
889 * @retval HAL status | |
890 */ | |
891 HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor) | |
892 { | |
893 /* Process Locked */ | |
894 __HAL_LOCK(hnor); | |
895 | |
896 /* Enable write operation */ | |
897 FMC_NORSRAM_WriteOperation_Enable(hnor->Instance, hnor->Init.NSBank); | |
898 | |
899 /* Update the NOR controller state */ | |
900 hnor->State = HAL_NOR_STATE_READY; | |
901 | |
902 /* Process unlocked */ | |
903 __HAL_UNLOCK(hnor); | |
904 | |
905 return HAL_OK; | |
906 } | |
907 | |
908 /** | |
909 * @brief Disables dynamically NOR write operation. | |
910 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
911 * the configuration information for NOR module. | |
912 * @retval HAL status | |
913 */ | |
914 HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) | |
915 { | |
916 /* Process Locked */ | |
917 __HAL_LOCK(hnor); | |
918 | |
919 /* Update the SRAM controller state */ | |
920 hnor->State = HAL_NOR_STATE_BUSY; | |
921 | |
922 /* Disable write operation */ | |
923 FMC_NORSRAM_WriteOperation_Disable(hnor->Instance, hnor->Init.NSBank); | |
924 | |
925 /* Update the NOR controller state */ | |
926 hnor->State = HAL_NOR_STATE_PROTECTED; | |
927 | |
928 /* Process unlocked */ | |
929 __HAL_UNLOCK(hnor); | |
930 | |
931 return HAL_OK; | |
932 } | |
933 | |
934 /** | |
935 * @} | |
936 */ | |
937 | |
938 /** @defgroup NOR_Exported_Functions_Group4 NOR State functions | |
939 * @brief Peripheral State functions | |
940 * | |
941 @verbatim | |
942 ============================================================================== | |
943 ##### NOR State functions ##### | |
944 ============================================================================== | |
945 [..] | |
946 This subsection permits to get in run-time the status of the NOR controller | |
947 and the data flow. | |
948 | |
949 @endverbatim | |
950 * @{ | |
951 */ | |
952 | |
953 /** | |
954 * @brief return the NOR controller state | |
955 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
956 * the configuration information for NOR module. | |
957 * @retval NOR controller state | |
958 */ | |
959 HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor) | |
960 { | |
961 return hnor->State; | |
962 } | |
963 | |
964 /** | |
965 * @brief Returns the NOR operation status. | |
966 * @param hnor pointer to a NOR_HandleTypeDef structure that contains | |
967 * the configuration information for NOR module. | |
968 * @param Address Device address | |
969 * @param Timeout NOR programming Timeout | |
970 * @retval NOR_Status: The returned value can be: HAL_NOR_STATUS_SUCCESS, HAL_NOR_STATUS_ERROR | |
971 * or HAL_NOR_STATUS_TIMEOUT | |
972 */ | |
973 HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout) | |
974 { | |
975 HAL_NOR_StatusTypeDef status = HAL_NOR_STATUS_ONGOING; | |
976 uint16_t tmpSR1 = 0, tmpSR2 = 0; | |
977 uint32_t tickstart = 0U; | |
978 | |
979 /* Poll on NOR memory Ready/Busy signal ------------------------------------*/ | |
980 HAL_NOR_MspWait(hnor, Timeout); | |
981 | |
982 /* Get the NOR memory operation status -------------------------------------*/ | |
983 | |
984 /* Get tick */ | |
985 tickstart = HAL_GetTick(); | |
986 while((status != HAL_NOR_STATUS_SUCCESS ) && (status != HAL_NOR_STATUS_TIMEOUT)) | |
987 { | |
988 /* Check for the Timeout */ | |
989 if(Timeout != HAL_MAX_DELAY) | |
990 { | |
991 if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) | |
992 { | |
993 status = HAL_NOR_STATUS_TIMEOUT; | |
994 } | |
995 } | |
996 | |
997 /* Read NOR status register (DQ6 and DQ5) */ | |
998 tmpSR1 = *(__IO uint16_t *)Address; | |
999 tmpSR2 = *(__IO uint16_t *)Address; | |
1000 | |
1001 /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ | |
1002 if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6)) | |
1003 { | |
1004 return HAL_NOR_STATUS_SUCCESS ; | |
1005 } | |
1006 | |
1007 if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) | |
1008 { | |
1009 status = HAL_NOR_STATUS_ONGOING; | |
1010 } | |
1011 | |
1012 tmpSR1 = *(__IO uint16_t *)Address; | |
1013 tmpSR2 = *(__IO uint16_t *)Address; | |
1014 | |
1015 /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ | |
1016 if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6)) | |
1017 { | |
1018 return HAL_NOR_STATUS_SUCCESS; | |
1019 } | |
1020 if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) | |
1021 { | |
1022 return HAL_NOR_STATUS_ERROR; | |
1023 } | |
1024 } | |
1025 | |
1026 /* Return the operation status */ | |
1027 return status; | |
1028 } | |
1029 | |
1030 /** | |
1031 * @} | |
1032 */ | |
1033 | |
1034 /** | |
1035 * @} | |
1036 */ | |
1037 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx ||\ | |
1038 STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ | |
1039 STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx ||\ | |
1040 STM32F423xx */ | |
1041 #endif /* HAL_NOR_MODULE_ENABLED */ | |
1042 /** | |
1043 * @} | |
1044 */ | |
1045 | |
1046 /** | |
1047 * @} | |
1048 */ | |
1049 | |
1050 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |