/** * @brief Writes a half-word buffer to the FSMC NOR memory. This function * must be used only with S29GL128P NOR memory. * @param pBuffer: pointer to buffer. * @param WriteAddr: NOR memory internal address from which the data will be * written. * @param NumHalfwordToWrite: number of Half words to write. * The maximum allowed value is 32 Half words (64 bytes). * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT */ NOR_Status NOR_ProgramBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite) { uint32_t lastloadedaddress = 0x00; uint32_t currentaddress = 0x00; uint32_t endaddress = 0x00; /*!< Initialize variables */ currentaddress = WriteAddr; endaddress = WriteAddr + NumHalfwordToWrite - 1; lastloadedaddress = WriteAddr; /*!< Issue unlock command sequence */ NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); /*!< Write Write Buffer Load Command */ NOR_WRITE(ADDR_SHIFT(WriteAddr), 0x0025); NOR_WRITE(ADDR_SHIFT(WriteAddr), (NumHalfwordToWrite - 1)); /*!< Load Data into NOR Buffer */ while(currentaddress <= endaddress) { /*!< Store last loaded address & data value (for polling) */ lastloadedaddress = currentaddress; NOR_WRITE(ADDR_SHIFT(currentaddress), *pBuffer++); currentaddress += 1; } NOR_WRITE(ADDR_SHIFT(lastloadedaddress), 0x29); return(NOR_GetStatus(Program_Timeout)); }
/** * @brief Writes a half-word buffer to the FMC NOR memory. This function * must be used only with S29GL128P NOR memory. * @param pBuffer : pointer to buffer. * uwWriteAddress : NOR memory internal address from which the data * will be written. * uwBufferSize : number of Half words to write. The maximum allowed * value is 32 Half words (64 bytes). * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT. */ NOR_Status NOR_ProgramBuffer(uint16_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize) { uint32_t lastloadedaddress = 0; uint32_t currentaddress = 0; uint32_t endaddress = 0; /* Initialize variables */ currentaddress = uwWriteAddress; endaddress = uwWriteAddress + uwBufferSize - 1; lastloadedaddress = uwWriteAddress; /* Issue unlock command sequence */ NOR_WRITE(ADDR_SHIFT(0x00555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); /* Write Buffer Load Command */ NOR_WRITE(ADDR_SHIFT(uwWriteAddress), 0x0025); NOR_WRITE(ADDR_SHIFT(uwWriteAddress), (uwBufferSize - 1)); /* Load Data into NOR Buffer */ while(currentaddress <= endaddress) { /* Store last loaded address & data value (for polling) */ lastloadedaddress = currentaddress; NOR_WRITE(ADDR_SHIFT(currentaddress), *pBuffer++); currentaddress += 1; } NOR_WRITE(ADDR_SHIFT(lastloadedaddress), 0x29); return(NOR_GetStatus(PROGRAM_TIMEOUT)); }
/** * @brief Writes a half-word to the NOR memory. * This function returns the NOR memory status after block erase operation. * @param uwWriteAddress : NOR memory internal address to write to. * uhData : Data to write. * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT. */ NOR_Status NOR_WriteHalfWord(uint32_t uwWriteAddress, uint16_t uhData) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00A0); NOR_WRITE((NOR_BANK_ADDR + uwWriteAddress), uhData); return (NOR_GetStatus(PROGRAM_TIMEOUT)); }
/** * @brief Writes a half-word to the NOR memory. * @param WriteAddr: NOR memory internal address to write to. * @param Data: Data to write. * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT */ NOR_Status NOR_WriteHalfWord(uint32_t WriteAddr, uint16_t Data) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00A0); NOR_WRITE((Bank1_NOR2_ADDR + WriteAddr), Data); return (NOR_GetStatus(Program_Timeout)); }
/* ********************************************************************************************************* * 函 数 名: NOR_EraseSector * 功能说明: 擦除NOR Flash指定的扇区 * 形 参: 扇区地址 * 返 回 值: NOR_SUCCESS, NOR_ERROR, NOR_TIMEOUT ********************************************************************************************************* */ uint8_t NOR_EraseSector(uint32_t _uiBlockAddr) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE((NOR_FLASH_ADDR + _uiBlockAddr), 0x30); return (NOR_GetStatus(BlockErase_Timeout)); }
/* ********************************************************************************************************* * 函 数 名: NOR_StartEraseChip * 功能说明: 开始擦除NOR Flash整个芯片, 不等待结束 * 形 参: 无 * 返 回 值: 0表示成功 ********************************************************************************************************* */ void NOR_StartEraseChip(void) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0010); NOR_GetStatus(1000); }
/* ********************************************************************************************************* * 函 数 名: NOR_EraseChip * 功能说明: 擦除NOR Flash整个芯片 * 形 参: 无 * 返 回 值: 0表示成功 ********************************************************************************************************* */ uint8_t NOR_EraseChip(void) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0010); return (NOR_GetStatus(ChipErase_Timeout)); }
/** * @brief Erases the entire chip. * @param None * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT */ NOR_Status NOR_EraseChip(void) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0010); return (NOR_GetStatus(CHIPERASE_TIMEOUT)); }
/** * @brief Performs a block erase operation giving its address. * This function returns the NOR memory status after block erase operation. * @param uwBlockAddress: Address of the block to erase. * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT. */ NOR_Status NOR_EraseBlock(uint32_t uwBlockAddress) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE((NOR_BANK_ADDR + uwBlockAddress), 0x30); return (NOR_GetStatus(BLOCKERASE_TIMEOUT)); }
/** * @brief Erases the specified Nor memory block. * @param BlockAddr: address of the block to erase. * @retval NOR_Status: The returned value can be: NOR_SUCCESS, NOR_ERROR * or NOR_TIMEOUT */ NOR_Status NOR_EraseBlock(uint32_t BlockAddr) { NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE(ADDR_SHIFT(0x0555), 0x0080); NOR_WRITE(ADDR_SHIFT(0x0555), 0x00AA); NOR_WRITE(ADDR_SHIFT(0x02AA), 0x0055); NOR_WRITE((Bank1_NOR2_ADDR + BlockAddr), 0x30); return (NOR_GetStatus(BlockErase_Timeout)); }