}/** * 函数功能: 读取串行Flash型号的ID * 输入参数: 无 * 返 回 值: u32:串行Flash的型号ID * 说 明: FLASH_ID IC型号 存储空间巨细 0xEF3015 W25X16 2M byte 0xEF4015 W25Q16 4M byte 0XEF4017 W25Q64 8M byte 0XEF4018 W25Q128 16M byte (YS-F1Pro开发板默认配置) */u32 SPI_FLASH_ReadID(void){ u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0; /* 选择串行FLASH: CS低电平 */ FLASH_SPI_CS_ENABLE(); /* 发送命令:读取芯片型号ID */ SPI_FLASH_SendByte(W25X_JedecDeviceID); /* 从串行Flash读取一个字节数据 */ Temp0 = SPI_FLASH_SendByte(Dummy_Byte); /* 从串行Flash读取一个字节数据 */ Temp1 = SPI_FLASH_SendByte(Dummy_Byte); /* 从串行Flash读取一个字节数据 */ Temp2 = SPI_FLASH_SendByte(Dummy_Byte); /* 禁用串行Flash:CS高电平 */ FLASH_SPI_CS_DISABLE(); Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; return Temp;}/** * 函数功能: 读取串行Flash装备ID * 输入参数: 无 * 返 回 值: u32:串行Flash的装备ID * 说 明: */u32 SPI_FLASH_ReadDeviceID(void){ u32 Temp = 0; /* 选择串行FLASH: CS低电平 */ FLASH_SPI_CS_ENABLE(); /* 发送命令:读取芯片装备ID * */ SPI_FLASH_SendByte(W25X_DeviceID); SPI_FLASH_SendByte(Dummy_Byte); SPI_FLASH_SendByte(Dummy_Byte); SPI_FLASH_SendByte(Dummy_Byte); /* 从串行Flash读取一个字节数据 */ Temp = SPI_FLASH_SendByte(Dummy_Byte); /* 禁用串行Flash:CS高电平 */ FLASH_SPI_CS_DISABLE(); return Temp;}/** * 函数功能: 启动连续读取数据串 * 输入参数: ReadAddr:读取地址 * 返 回 值: 无 * 说 明:Initiates a read data byte (READ) sequence from the Flash. * This is done by driving the /CS line low to select the device, * then the READ instruction is transmitted followed by 3 bytes * address. This function exit and keep the /CS line low, so the * Flash still being selected. With this technique the whole * content of the Flash is read with a single READ instruction. */void SPI_FLASH_StartReadSequence(u32 ReadAddr){ /* Select the FLASH: Chip Select low */ FLASH_SPI_CS_ENABLE(); /* Send "Read from Memory " instruction */ SPI_FLASH_SendByte(W25X_ReadData); /* Send the 24-bit address of the address to read from -----------------------*/ /* Send ReadAddr high nibble address byte */ SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16); /* Send ReadAddr medium nibble address byte */ SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8); /* Send ReadAddr low nibble address byte */ SPI_FLASH_SendByte(ReadAddr & 0xFF);}/** * 函数功能: 从串行Flash读取一个字节数据 * 输入参数: 无 * 返 回 值: u8:读取到的数据 * 说 明:This function must be used only if the Start_Read_Sequence * function has been previously called. */u8 SPI_FLASH_ReadByte(void){ return (SPI_FLASH_SendByte(Dummy_Byte));}/** * 函数功能: 往串行Flash读取写入一个字节数据并接收一个字节数据 * 输入参数: byte:待发送数据 * 返 回 值: u8:接收到的数据 * 说 明:无 */u8 SPI_FLASH_SendByte(u8 byte){ /* 循环等待直到SPI 数据寄存器DR为空,即当DR寄存器不为空时连续等待 */ while (SPI_I2S_GetFlagStatus(FLASH_SPIx , SPI_I2S_FLAG_TXE) == RESET); /* 通过SPI外设发送一个字节数据 */ SPI_I2S_SendData(FLASH_SPIx , byte); /* 等待接收到数据 */ while (SPI_I2S_GetFlagStatus(FLASH_SPIx , SPI_I2S_FLAG_RXNE) == RESET); /* 读取SPI总线接收到一个字节数据并返回 */ return SPI_I2S_ReceiveData(FLASH_SPIx );}/** * 函数功能: 往串行Flash读取写入半字(16bit)数据并接收半字数据 * 输入参数: byte:待发送数据 * 返 回 值: u16:接收到的数据 * 说 明:无 */u16 SPI_FLASH_SendHalfWord(u16 HalfWord){ /* 循环等待直到SPI 数据寄存器DR为空,即当DR寄存器不为空时连续等待 */ while (SPI_I2S_GetFlagStatus(FLASH_SPIx , SPI_I2S_FLAG_TXE) == RESET); /* 通过SPI外设发送半字数据 */ SPI_I2S_SendData(FLASH_SPIx , HalfWord); /* 等待接收到数据 */ while (SPI_I2S_GetFlagStatus(FLASH_SPIx , SPI_I2S_FLAG_RXNE) == RESET); /* 读取SPI总线接收到半字数据并返回 */ return SPI_I2S_ReceiveData(FLASH_SPIx );}/** * 函数功能: 使能串行Flash写操作 * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void SPI_FLASH_WriteEnable(void)
{
/* 选择串行FLASH: CS低电平 */
FLASH_SPI_CS_ENABLE();
/* 发送命令:写使能 */
SPI_FLASH_SendByte(W25X_WriteEnable);
/* 禁用串行Flash:CS高电平 */
FLASH_SPI_CS_DISABLE();
}/** * 函数功能: 等待数据写入完成 * 输入参数: 无 * 返 回 值: 无 * 说 明:Polls the status of the Write In Progress (WIP) flag in the * FLASH's status register and loop until write opertaion * has completed. */void SPI_FLASH_WaitForWriteEnd(void){ u8 FLASH_Status = 0; /* Select the FLASH: Chip Select low */ FLASH_SPI_CS_ENABLE(); /* Send "Read Status Register" instruction */ SPI_FLASH_SendByte(W25X_ReadStatusReg); /* Loop as long as the memory is busy with a write cycle */ do { /* Send a dummy byte to generate the clock needed by the FLASH and put the value of the status register in FLASH_Status variable */ FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte); } while ((FLASH_Status & WIP_Flag) == SET); /* Write in progress */ /* Deselect the FLASH: Chip Select high */ FLASH_SPI_CS_DISABLE();}/** * 函数功能: 进入掉电模式 * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void SPI_Flash_PowerDown(void) { /* Select the FLASH: Chip Select low */ FLASH_SPI_CS_ENABLE(); /* Send "Power Down" instruction */ SPI_FLASH_SendByte(W25X_PowerDown); /* Deselect the FLASH: Chip Select high */ FLASH_SPI_CS_DISABLE();} /** * 函数功能: 唤醒串行Flash * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */void SPI_Flash_WAKEUP(void) { /* Select the FLASH: Chip Select low */ FLASH_SPI_CS_ENABLE(); /* Send "Power Down" instruction */ SPI_FLASH_SendByte(W25X_ReleasePowerDown); /* Deselect the FLASH: Chip Select high */ FLASH_SPI_CS_DISABLE(); }