112#if defined(FMC_Bank3) || defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
118#ifdef HAL_NAND_MODULE_ENABLED
159HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FMC_NAND_PCC_TimingTypeDef *ComSpace_Timing,
160 FMC_NAND_PCC_TimingTypeDef *AttSpace_Timing)
168 if (hnand->State == HAL_NAND_STATE_RESET)
173#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
174 if (hnand->MspInitCallback == NULL)
176 hnand->MspInitCallback = HAL_NAND_MspInit;
178 hnand->ItCallback = HAL_NAND_ITCallback;
181 hnand->MspInitCallback(hnand);
184 HAL_NAND_MspInit(hnand);
189 (void)FMC_NAND_Init(hnand->Instance, &(hnand->Init));
192 (void)FMC_NAND_CommonSpace_Timing_Init(hnand->Instance, ComSpace_Timing, hnand->Init.NandBank);
195 (void)FMC_NAND_AttributeSpace_Timing_Init(hnand->Instance, AttSpace_Timing, hnand->Init.NandBank);
198#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
199 __FMC_NAND_ENABLE(hnand->Instance, hnand->Init.NandBank);
201 __FMC_NAND_ENABLE(hnand->Instance);
205 hnand->State = HAL_NAND_STATE_READY;
218#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
219 if (hnand->MspDeInitCallback == NULL)
221 hnand->MspDeInitCallback = HAL_NAND_MspDeInit;
225 hnand->MspDeInitCallback(hnand);
228 HAL_NAND_MspDeInit(hnand);
232 (void)FMC_NAND_DeInit(hnand->Instance, hnand->Init.NandBank);
235 hnand->State = HAL_NAND_STATE_RESET;
249__weak
void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand)
265__weak
void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand)
282void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand)
285 if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE))
288#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
289 hnand->ItCallback(hnand);
291 HAL_NAND_ITCallback(hnand);
295#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
296 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_RISING_EDGE);
298 __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_RISING_EDGE);
303 if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL))
306#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
307 hnand->ItCallback(hnand);
309 HAL_NAND_ITCallback(hnand);
313#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
314 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_LEVEL);
316 __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_LEVEL);
321 if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE))
324#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
325 hnand->ItCallback(hnand);
327 HAL_NAND_ITCallback(hnand);
331#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
332 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FALLING_EDGE);
334 __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_FALLING_EDGE);
339 if (__FMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT))
342#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
343 hnand->ItCallback(hnand);
345 HAL_NAND_ITCallback(hnand);
349#if defined(FMC_Bank2_3) || defined(FSMC_Bank2_3)
350 __FMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FMC_FLAG_FEMPT);
352 __FMC_NAND_CLEAR_FLAG(hnand->Instance, FMC_FLAG_FEMPT);
364__weak
void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand)
400HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID)
402 __IO uint32_t data = 0;
403 __IO uint32_t data1 = 0;
404 uint32_t deviceaddress;
407 if (hnand->State == HAL_NAND_STATE_BUSY)
411 else if (hnand->State == HAL_NAND_STATE_READY)
417 hnand->State = HAL_NAND_STATE_BUSY;
420#if defined(FMC_Bank2_3)
421 if (hnand->Init.NandBank == FMC_NAND_BANK2)
423 deviceaddress = NAND_DEVICE1;
427 deviceaddress = NAND_DEVICE2;
430 deviceaddress = NAND_DEVICE;
434 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_READID;
436 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00;
441 if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8)
443 if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8)
446 data = *(__IO uint32_t *)deviceaddress;
449 pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data);
450 pNAND_ID->Device_Id = ADDR_2ND_CYCLE(data);
451 pNAND_ID->Third_Id = ADDR_3RD_CYCLE(data);
452 pNAND_ID->Fourth_Id = ADDR_4TH_CYCLE(data);
456 data = *(__IO uint32_t *)deviceaddress;
457 data1 = *((__IO uint32_t *)deviceaddress + 4);
460 pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data);
461 pNAND_ID->Device_Id = ADDR_3RD_CYCLE(data);
462 pNAND_ID->Third_Id = ADDR_1ST_CYCLE(data1);
463 pNAND_ID->Fourth_Id = ADDR_3RD_CYCLE(data1);
467 hnand->State = HAL_NAND_STATE_READY;
488 uint32_t deviceaddress;
491 if (hnand->State == HAL_NAND_STATE_BUSY)
495 else if (hnand->State == HAL_NAND_STATE_READY)
501 hnand->State = HAL_NAND_STATE_BUSY;
504#if defined(FMC_Bank2_3)
505 if (hnand->Init.NandBank == FMC_NAND_BANK2)
507 deviceaddress = NAND_DEVICE1;
511 deviceaddress = NAND_DEVICE2;
514 deviceaddress = NAND_DEVICE;
518 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = 0xFF;
521 hnand->State = HAL_NAND_STATE_READY;
542HAL_StatusTypeDef HAL_NAND_ConfigDevice(NAND_HandleTypeDef *hnand, NAND_DeviceConfigTypeDef *pDeviceConfig)
544 hnand->Config.PageSize = pDeviceConfig->PageSize;
545 hnand->Config.SpareAreaSize = pDeviceConfig->SpareAreaSize;
546 hnand->Config.BlockSize = pDeviceConfig->BlockSize;
547 hnand->Config.BlockNbr = pDeviceConfig->BlockNbr;
548 hnand->Config.PlaneSize = pDeviceConfig->PlaneSize;
549 hnand->Config.PlaneNbr = pDeviceConfig->PlaneNbr;
550 hnand->Config.ExtraCommandEnable = pDeviceConfig->ExtraCommandEnable;
564HAL_StatusTypeDef HAL_NAND_Read_Page_8b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
565 uint8_t *pBuffer, uint32_t NumPageToRead)
569 uint32_t deviceaddress;
570 uint32_t numpagesread = 0U;
571 uint32_t nandaddress;
572 uint32_t nbpages = NumPageToRead;
573 uint8_t *buff = pBuffer;
576 if (hnand->State == HAL_NAND_STATE_BUSY)
580 else if (hnand->State == HAL_NAND_STATE_READY)
586 hnand->State = HAL_NAND_STATE_BUSY;
589#if defined(FMC_Bank2_3)
590 if (hnand->Init.NandBank == FMC_NAND_BANK2)
592 deviceaddress = NAND_DEVICE1;
596 deviceaddress = NAND_DEVICE2;
599 deviceaddress = NAND_DEVICE;
603 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
606 while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
609 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
613 if ((hnand->Config.PageSize) <= 512U)
615 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
617 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
619 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
621 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
626 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
628 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
630 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
632 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
638 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
640 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
642 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
644 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
646 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
651 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
653 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
655 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
657 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
659 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
664 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1;
668 if (hnand->Config.ExtraCommandEnable == ENABLE)
674 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
676 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
679 hnand->State = HAL_NAND_STATE_ERROR;
689 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00);
694 for (index = 0U; index < hnand->Config.PageSize; index++)
696 *buff = *(uint8_t *)deviceaddress;
707 nandaddress = (uint32_t)(nandaddress + 1U);
711 hnand->State = HAL_NAND_STATE_READY;
733HAL_StatusTypeDef HAL_NAND_Read_Page_16b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
734 uint16_t *pBuffer, uint32_t NumPageToRead)
738 uint32_t deviceaddress;
739 uint32_t numpagesread = 0U;
740 uint32_t nandaddress;
741 uint32_t nbpages = NumPageToRead;
742 uint16_t *buff = pBuffer;
745 if (hnand->State == HAL_NAND_STATE_BUSY)
749 else if (hnand->State == HAL_NAND_STATE_READY)
755 hnand->State = HAL_NAND_STATE_BUSY;
758#if defined(FMC_Bank2_3)
759 if (hnand->Init.NandBank == FMC_NAND_BANK2)
761 deviceaddress = NAND_DEVICE1;
765 deviceaddress = NAND_DEVICE2;
768 deviceaddress = NAND_DEVICE;
772 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
775 while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
778 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
782 if ((hnand->Config.PageSize) <= 512U)
784 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
786 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
788 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
790 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
795 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
797 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
799 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
801 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
807 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
809 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
811 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
813 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
815 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
820 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
822 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
824 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
826 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
828 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
833 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1;
836 if (hnand->Config.ExtraCommandEnable == ENABLE)
842 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
844 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
847 hnand->State = HAL_NAND_STATE_ERROR;
857 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00);
862#if defined(FSMC_PCR2_PWID)
863 if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8)
865 if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8)
868 hnand->Config.PageSize = hnand->Config.PageSize / 2U;
877 for (index = 0U; index < hnand->Config.PageSize; index++)
879 *buff = *(uint16_t *)deviceaddress;
890 nandaddress = (uint32_t)(nandaddress + 1U);
894 hnand->State = HAL_NAND_STATE_READY;
916HAL_StatusTypeDef HAL_NAND_Write_Page_8b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
917 const uint8_t *pBuffer, uint32_t NumPageToWrite)
921 uint32_t deviceaddress;
922 uint32_t numpageswritten = 0U;
923 uint32_t nandaddress;
924 uint32_t nbpages = NumPageToWrite;
925 const uint8_t *buff = pBuffer;
928 if (hnand->State == HAL_NAND_STATE_BUSY)
932 else if (hnand->State == HAL_NAND_STATE_READY)
938 hnand->State = HAL_NAND_STATE_BUSY;
941#if defined(FMC_Bank2_3)
942 if (hnand->Init.NandBank == FMC_NAND_BANK2)
944 deviceaddress = NAND_DEVICE1;
948 deviceaddress = NAND_DEVICE2;
951 deviceaddress = NAND_DEVICE;
955 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
958 while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
961 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
963 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
967 if ((hnand->Config.PageSize) <= 512U)
969 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
971 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
973 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
975 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
980 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
982 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
984 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
986 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
992 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
994 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
996 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
998 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1000 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1005 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1007 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1009 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1011 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1013 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1019 for (index = 0U; index < hnand->Config.PageSize; index++)
1021 *(__IO uint8_t *)deviceaddress = *buff;
1026 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1;
1033 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1035 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1038 hnand->State = HAL_NAND_STATE_ERROR;
1054 nandaddress = (uint32_t)(nandaddress + 1U);
1058 hnand->State = HAL_NAND_STATE_READY;
1080HAL_StatusTypeDef HAL_NAND_Write_Page_16b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
1081 const uint16_t *pBuffer, uint32_t NumPageToWrite)
1085 uint32_t deviceaddress;
1086 uint32_t numpageswritten = 0U;
1087 uint32_t nandaddress;
1088 uint32_t nbpages = NumPageToWrite;
1089 const uint16_t *buff = pBuffer;
1092 if (hnand->State == HAL_NAND_STATE_BUSY)
1096 else if (hnand->State == HAL_NAND_STATE_READY)
1102 hnand->State = HAL_NAND_STATE_BUSY;
1105#if defined(FMC_Bank2_3)
1106 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1108 deviceaddress = NAND_DEVICE1;
1112 deviceaddress = NAND_DEVICE2;
1115 deviceaddress = NAND_DEVICE;
1119 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
1122 while ((nbpages != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
1125 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
1127 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
1131 if ((hnand->Config.PageSize) <= 512U)
1133 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1135 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1137 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1139 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1144 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1146 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1148 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1150 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1156 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1158 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1160 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1162 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1164 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1169 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1171 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1173 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1175 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1177 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1183#if defined(FSMC_PCR2_PWID)
1184 if (hnand->Init.MemoryDataWidth == FSMC_NAND_PCC_MEM_BUS_WIDTH_8)
1186 if (hnand->Init.MemoryDataWidth == FMC_NAND_PCC_MEM_BUS_WIDTH_8)
1189 hnand->Config.PageSize = hnand->Config.PageSize / 2U;
1198 for (index = 0U; index < hnand->Config.PageSize; index++)
1200 *(__IO uint16_t *)deviceaddress = *buff;
1205 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1;
1212 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1214 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1217 hnand->State = HAL_NAND_STATE_ERROR;
1233 nandaddress = (uint32_t)(nandaddress + 1U);
1237 hnand->State = HAL_NAND_STATE_READY;
1259HAL_StatusTypeDef HAL_NAND_Read_SpareArea_8b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
1260 uint8_t *pBuffer, uint32_t NumSpareAreaToRead)
1264 uint32_t deviceaddress;
1265 uint32_t numsparearearead = 0U;
1266 uint32_t nandaddress;
1267 uint32_t columnaddress;
1268 uint32_t nbspare = NumSpareAreaToRead;
1269 uint8_t *buff = pBuffer;
1272 if (hnand->State == HAL_NAND_STATE_BUSY)
1276 else if (hnand->State == HAL_NAND_STATE_READY)
1282 hnand->State = HAL_NAND_STATE_BUSY;
1285#if defined(FMC_Bank2_3)
1286 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1288 deviceaddress = NAND_DEVICE1;
1292 deviceaddress = NAND_DEVICE2;
1295 deviceaddress = NAND_DEVICE;
1299 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
1302 columnaddress = COLUMN_ADDRESS(hnand);
1305 while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
1308 if ((hnand->Config.PageSize) <= 512U)
1311 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C;
1314 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1316 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1318 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1320 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1325 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1327 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1329 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1331 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1338 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
1341 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1343 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1345 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1347 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1349 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1354 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1356 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1358 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1360 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1362 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1367 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1;
1370 if (hnand->Config.ExtraCommandEnable == ENABLE)
1376 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1378 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1381 hnand->State = HAL_NAND_STATE_ERROR;
1391 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00);
1396 for (index = 0U; index < hnand->Config.SpareAreaSize; index++)
1398 *buff = *(uint8_t *)deviceaddress;
1409 nandaddress = (uint32_t)(nandaddress + 1U);
1413 hnand->State = HAL_NAND_STATE_READY;
1435HAL_StatusTypeDef HAL_NAND_Read_SpareArea_16b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
1436 uint16_t *pBuffer, uint32_t NumSpareAreaToRead)
1440 uint32_t deviceaddress;
1441 uint32_t numsparearearead = 0U;
1442 uint32_t nandaddress;
1443 uint32_t columnaddress;
1444 uint32_t nbspare = NumSpareAreaToRead;
1445 uint16_t *buff = pBuffer;
1448 if (hnand->State == HAL_NAND_STATE_BUSY)
1452 else if (hnand->State == HAL_NAND_STATE_READY)
1458 hnand->State = HAL_NAND_STATE_BUSY;
1461#if defined(FMC_Bank2_3)
1462 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1464 deviceaddress = NAND_DEVICE1;
1468 deviceaddress = NAND_DEVICE2;
1471 deviceaddress = NAND_DEVICE;
1475 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
1478 columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand));
1481 while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
1484 if ((hnand->Config.PageSize) <= 512U)
1487 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C;
1490 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1492 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1494 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1496 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1501 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1503 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1505 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1507 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1514 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
1517 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1519 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1521 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1523 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1525 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1530 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1532 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1534 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1536 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1538 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1543 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1;
1546 if (hnand->Config.ExtraCommandEnable == ENABLE)
1552 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1554 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1557 hnand->State = HAL_NAND_STATE_ERROR;
1567 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = ((uint8_t)0x00);
1572 for (index = 0U; index < hnand->Config.SpareAreaSize; index++)
1574 *buff = *(uint16_t *)deviceaddress;
1585 nandaddress = (uint32_t)(nandaddress + 1U);
1589 hnand->State = HAL_NAND_STATE_READY;
1611HAL_StatusTypeDef HAL_NAND_Write_SpareArea_8b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
1612 const uint8_t *pBuffer, uint32_t NumSpareAreaTowrite)
1616 uint32_t deviceaddress;
1617 uint32_t numspareareawritten = 0U;
1618 uint32_t nandaddress;
1619 uint32_t columnaddress;
1620 uint32_t nbspare = NumSpareAreaTowrite;
1621 const uint8_t *buff = pBuffer;
1624 if (hnand->State == HAL_NAND_STATE_BUSY)
1628 else if (hnand->State == HAL_NAND_STATE_READY)
1634 hnand->State = HAL_NAND_STATE_BUSY;
1637#if defined(FMC_Bank2_3)
1638 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1640 deviceaddress = NAND_DEVICE1;
1644 deviceaddress = NAND_DEVICE2;
1647 deviceaddress = NAND_DEVICE;
1651 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
1654 columnaddress = COLUMN_ADDRESS(hnand);
1657 while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
1660 if ((hnand->Config.PageSize) <= 512U)
1663 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C;
1665 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
1668 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1670 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1672 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1674 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1679 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1681 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1683 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1685 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1692 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
1694 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
1697 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1699 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1701 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1703 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1705 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1710 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1712 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1714 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1716 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1718 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1724 for (index = 0U; index < hnand->Config.SpareAreaSize; index++)
1726 *(__IO uint8_t *)deviceaddress = *buff;
1731 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1;
1738 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1740 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1743 hnand->State = HAL_NAND_STATE_ERROR;
1753 numspareareawritten++;
1759 nandaddress = (uint32_t)(nandaddress + 1U);
1763 hnand->State = HAL_NAND_STATE_READY;
1785HAL_StatusTypeDef HAL_NAND_Write_SpareArea_16b(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress,
1786 const uint16_t *pBuffer, uint32_t NumSpareAreaTowrite)
1790 uint32_t deviceaddress;
1791 uint32_t numspareareawritten = 0U;
1792 uint32_t nandaddress;
1793 uint32_t columnaddress;
1794 uint32_t nbspare = NumSpareAreaTowrite;
1795 const uint16_t *buff = pBuffer;
1798 if (hnand->State == HAL_NAND_STATE_BUSY)
1802 else if (hnand->State == HAL_NAND_STATE_READY)
1808 hnand->State = HAL_NAND_STATE_BUSY;
1811#if defined(FMC_Bank2_3)
1812 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1814 deviceaddress = NAND_DEVICE1;
1818 deviceaddress = NAND_DEVICE2;
1821 deviceaddress = NAND_DEVICE;
1825 nandaddress = ARRAY_ADDRESS(pAddress, hnand);
1828 columnaddress = (uint32_t)(COLUMN_ADDRESS(hnand));
1831 while ((nbspare != 0U) && (nandaddress < ((hnand->Config.BlockSize) * (hnand->Config.BlockNbr))))
1834 if ((hnand->Config.PageSize) <= 512U)
1837 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C;
1839 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
1842 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1844 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1846 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1848 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1853 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
1855 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1857 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1859 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1866 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A;
1868 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0;
1871 if (((hnand->Config.BlockSize) * (hnand->Config.BlockNbr)) <= 65535U)
1873 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1875 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1877 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1879 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1884 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_1ST_CYCLE(columnaddress);
1886 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = COLUMN_2ND_CYCLE(columnaddress);
1888 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(nandaddress);
1890 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(nandaddress);
1892 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(nandaddress);
1898 for (index = 0U; index < hnand->Config.SpareAreaSize; index++)
1900 *(__IO uint16_t *)deviceaddress = *buff;
1905 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1;
1912 while (HAL_NAND_Read_Status(hnand) != NAND_READY)
1914 if ((
HAL_GetTick() - tickstart) > NAND_WRITE_TIMEOUT)
1917 hnand->State = HAL_NAND_STATE_ERROR;
1927 numspareareawritten++;
1933 nandaddress = (uint32_t)(nandaddress + 1U);
1937 hnand->State = HAL_NAND_STATE_READY;
1957HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand,
const NAND_AddressTypeDef *pAddress)
1959 uint32_t deviceaddress;
1962 if (hnand->State == HAL_NAND_STATE_BUSY)
1966 else if (hnand->State == HAL_NAND_STATE_READY)
1972 hnand->State = HAL_NAND_STATE_BUSY;
1975#if defined(FMC_Bank2_3)
1976 if (hnand->Init.NandBank == FMC_NAND_BANK2)
1978 deviceaddress = NAND_DEVICE1;
1982 deviceaddress = NAND_DEVICE2;
1985 deviceaddress = NAND_DEVICE;
1989 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE0;
1991 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
1993 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
1995 *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(ARRAY_ADDRESS(pAddress, hnand));
1998 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE1;
2002 hnand->State = HAL_NAND_STATE_READY;
2024uint32_t HAL_NAND_Address_Inc(
const NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress)
2026 uint32_t status = NAND_VALID_ADDRESS;
2032 if (pAddress->Page == hnand->Config.BlockSize)
2037 if (pAddress->Block == hnand->Config.PlaneSize)
2039 pAddress->Block = 0;
2042 if (pAddress->Plane == (hnand->Config.PlaneNbr))
2044 status = NAND_INVALID_ADDRESS;
2052#if (USE_HAL_NAND_REGISTER_CALLBACKS == 1)
2065HAL_StatusTypeDef HAL_NAND_RegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId,
2066 pNAND_CallbackTypeDef pCallback)
2070 if (pCallback == NULL)
2075 if (hnand->State == HAL_NAND_STATE_READY)
2079 case HAL_NAND_MSP_INIT_CB_ID :
2080 hnand->MspInitCallback = pCallback;
2082 case HAL_NAND_MSP_DEINIT_CB_ID :
2083 hnand->MspDeInitCallback = pCallback;
2085 case HAL_NAND_IT_CB_ID :
2086 hnand->ItCallback = pCallback;
2094 else if (hnand->State == HAL_NAND_STATE_RESET)
2098 case HAL_NAND_MSP_INIT_CB_ID :
2099 hnand->MspInitCallback = pCallback;
2101 case HAL_NAND_MSP_DEINIT_CB_ID :
2102 hnand->MspDeInitCallback = pCallback;
2130HAL_StatusTypeDef HAL_NAND_UnRegisterCallback(NAND_HandleTypeDef *hnand, HAL_NAND_CallbackIDTypeDef CallbackId)
2134 if (hnand->State == HAL_NAND_STATE_READY)
2138 case HAL_NAND_MSP_INIT_CB_ID :
2139 hnand->MspInitCallback = HAL_NAND_MspInit;
2141 case HAL_NAND_MSP_DEINIT_CB_ID :
2142 hnand->MspDeInitCallback = HAL_NAND_MspDeInit;
2144 case HAL_NAND_IT_CB_ID :
2145 hnand->ItCallback = HAL_NAND_ITCallback;
2153 else if (hnand->State == HAL_NAND_STATE_RESET)
2157 case HAL_NAND_MSP_INIT_CB_ID :
2158 hnand->MspInitCallback = HAL_NAND_MspInit;
2160 case HAL_NAND_MSP_DEINIT_CB_ID :
2161 hnand->MspDeInitCallback = HAL_NAND_MspDeInit;
2208 if (hnand->State == HAL_NAND_STATE_BUSY)
2212 else if (hnand->State == HAL_NAND_STATE_READY)
2215 hnand->State = HAL_NAND_STATE_BUSY;
2218 (void)FMC_NAND_ECC_Enable(hnand->Instance, hnand->Init.NandBank);
2221 hnand->State = HAL_NAND_STATE_READY;
2240 if (hnand->State == HAL_NAND_STATE_BUSY)
2244 else if (hnand->State == HAL_NAND_STATE_READY)
2247 hnand->State = HAL_NAND_STATE_BUSY;
2250 (void)FMC_NAND_ECC_Disable(hnand->Instance, hnand->Init.NandBank);
2253 hnand->State = HAL_NAND_STATE_READY;
2271HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout)
2276 if (hnand->State == HAL_NAND_STATE_BUSY)
2280 else if (hnand->State == HAL_NAND_STATE_READY)
2283 hnand->State = HAL_NAND_STATE_BUSY;
2286 status = FMC_NAND_GetECC(hnand->Instance, ECCval, hnand->Init.NandBank, Timeout);
2289 hnand->State = HAL_NAND_STATE_READY;
2325HAL_NAND_StateTypeDef HAL_NAND_GetState(
const NAND_HandleTypeDef *hnand)
2327 return hnand->State;
2336uint32_t HAL_NAND_Read_Status(
const NAND_HandleTypeDef *hnand)
2339 uint32_t deviceaddress;
2343#if defined(FMC_Bank2_3)
2344 if (hnand->Init.NandBank == FMC_NAND_BANK2)
2346 deviceaddress = NAND_DEVICE1;
2350 deviceaddress = NAND_DEVICE2;
2353 deviceaddress = NAND_DEVICE;
2357 *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_STATUS;
2360 data = *(__IO uint8_t *)deviceaddress;
2363 if ((data & NAND_ERROR) == NAND_ERROR)
2367 else if ((data & NAND_READY) == NAND_READY)
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)