📄 stm32100e_eval_fsmc_onenand.c
字号:
while((status & 0x8000) != 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Get the Controller Status */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
return (status);
}
/**
* @brief Erases the specified OneNAND memory block (128Kb).
* @param BlockNumber: specifies the block number to be erased. This parameter
* should be between 0 and 511.
* @retval OneNAND memory Interrupt Status.
*/
uint16_t OneNAND_EraseBlock(uint32_t BlockNumber)
{
uint16_t status = 0x0;
/* Wait till no ongoing operation */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
while((status & 0x8000) == 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
}
/* Erase operation */
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESS1) = BlockNumber;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT) = 0x0000;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_COMMAND) = OneNAND_CMD_ERASE;
/* Wait till no error is generated */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
while((status & 0x0400) == 0x0400)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
}
/* Wait till the command is completed */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
while((status & 0x8000) != 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Get the Controller Status */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
return (status);
}
/**
* @brief Writes a Half-word buffer to the OneNAND memory.
* @param pBuffer: pointer to buffer.
* @param WriteAddr: OneNAND memory internal address from which the data will be
* written.
* @param NumHalfwordToWrite: number of half-words to write.
* @retval OneNAND memory Controller Status.
*/
uint16_t OneNAND_WriteBuffer(uint16_t* pBuffer, OneNAND_ADDRESS Address, uint32_t NumHalfwordToWrite)
{
uint32_t datacounter = 0;
uint16_t status = 0;
/* Load the buffer to be written into the DATA RAM0*/
for(datacounter = 0; datacounter < NumHalfwordToWrite; datacounter++)
{
*(__IO uint16_t *)((BANK1_ONENAND1_ADDR + OneNAND_DATA_RAM_0_0_ADD) + (2*datacounter)) = pBuffer[datacounter];
}
/* Write operation from DATA RAM0 to NAND address*/
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESS1) = Address.Block; /* NAND Flash block address*/
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESINT8_T) = (uint16_t)(Address.Page << 2); /* NAND Flash start page address */
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTBUFFER) = OneNAND_DATA_RAM_0_0_REG;/* BufferRAM Sector Count (BSC) and BufferRAM Sector Address (BSA).*/
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT) = 0x0000;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_COMMAND) = OneNAND_CMD_PROGRAM; /* Command */
/* Wait till the command is completed */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
while((status & 0x8000) != 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Wait till the write interrupt is set */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
while((status & 0x40) != 0x40)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Get the Controller Status */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
return (status);
}
/**
* @brief Reads a block of data from the OneNAND memory using asynchronous mode.
* @param pBuffer: pointer to the buffer that receives the data read from the
* OneNAND memory.
* @param ReadAddr: OneNAND memory internal address to read from.
* @param NumHalfwordToRead: number of half-words to read.
* @retval None
*/
void OneNAND_AsynchronousRead(uint16_t* pBuffer, OneNAND_ADDRESS Address, uint32_t NumHalfwordToRead)
{
uint16_t datatmp = 0x0, index = 0;
uint16_t status = 0;
datatmp = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_SYSTEMCONFIGURATION);
/* Set the asynchronous read mode */
OneNAND_WRITE(BANK1_ONENAND1_ADDR + OneNAND_REG_SYSTEMCONFIGURATION, (datatmp& 0x7FFF));
/* Load data from the read address to the DATA RAM 1 setor 1 */
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESS1) = Address.Block; /* NAND Flash block address*/
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESINT8_T) = (uint16_t)(Address.Page << 2);
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTBUFFER) = OneNAND_DATA_RAM_1_0_REG;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT) = 0x0000;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_COMMAND) = OneNAND_CMD_LOAD; /* Command */
/* Wait till the command is completed */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
while((status & 0x8000) != 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Read Controller status */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
/* Read data */
for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) /* While there is data to read */
{
/* Read a Halfword from the memory */
*pBuffer++ = *(__IO uint16_t *)((BANK1_ONENAND1_ADDR + OneNAND_DATA_RAM_1_0_ADD)+ 2*index);
index++;
}
}
/**
* @brief Reads a block of data from the OneNAND memory using synchronous mode.
* @param pBuffer: pointer to the buffer that receives the data read from the
* OneNAND memory.
* @param ReadAddr: OneNAND memory internal address to read from.
* @param NumHalfwordToRead: number of half-words to read.
* @retval None
*/
void OneNAND_SynchronousRead(uint16_t* pBuffer, OneNAND_ADDRESS Address, uint32_t NumHalfwordToRead)
{
uint16_t index = 0;
uint16_t status = 0;
/* Set the asynchronous read mode */
OneNAND_WRITE(BANK1_ONENAND1_ADDR + OneNAND_REG_SYSTEMCONFIGURATION, 0xB4C0);
/* Load data from the read address to the DATA RAM 1 setor 1 */
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESS1) = Address.Block; /* NAND Flash block address*/
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTADDRESINT8_T) = (uint16_t)(Address.Page << 2);
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_STARTBUFFER) = OneNAND_DATA_RAM_1_0_REG;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT) = 0x0000;
*(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_COMMAND) = OneNAND_CMD_LOAD; /* Command */
/* Wait till the command is completed */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
while((status & 0x8000) != 0x8000)
{
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT);
}
/* Read Controller status */
status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS);
/* Read data */
for(; NumHalfwordToRead != 0x00; NumHalfwordToRead--) /* While there is data to read */
{
*pBuffer++ = *(__IO uint16_t *)((BANK1_ONENAND1_ADDR + OneNAND_DATA_RAM_1_0_ADD + 2*index));
index++;
}
}
/**
* @brief Reads the OneNAND memory Interrupt status.
* @param None
* @retval OneNAND memory Interrupt Status.
*/
uint16_t OneNAND_ReadStatus(void)
{
__IO uint16_t status = 0x0;
/* Read Status */
return (status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_INTERRUPT));
}
/**
* @brief Reads the OneNAND Controller status.
* @param None
* @retval OneNAND Controller Status.
*/
uint16_t OneNAND_ReadControllerStatus(void)
{
__IO uint16_t status = 0x0;
/* Read Controller Status */
return (status = *(__IO uint16_t *)(BANK1_ONENAND1_ADDR + OneNAND_REG_CONTROLSTATUS));
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -