//擦除整个芯片 //整片擦除时间: //W25X16:25s //W25X32:40s //W25X64:40s //等待时间超长... void SPI_Flash_Erase_Chip(void) { SPI_FLASH_Write_Enable(); //SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; //使能器件 SPIx_ReadWriteByte(W25X_ChipErase); //发送片擦除命令 SPI_FLASH_CS=1; //取消片选 SPI_Flash_Wait_Busy(); //等待芯片擦除结束 }
/** *名称:SPI_Flash_Erase_Chip *输入:无 *输出:无 *返回:无 *功能:擦除整个芯片整片擦除时间: W25X16:25s W25X32:40s W25X64:40s 等待时间超长... *说明:擦除时间来源于手册,有待验证 **/ void SPI_Flash_Erase_Chip(void) { SPI_FLASH_Write_Enable(); //SET WEL SPI_Flash_Wait_Busy(); W25Q16_CS_LOW(); //使能器件 SPIx_ReadWriteByte(W25X_ChipErase); //发送片擦除命令 W25Q16_CS_HIGH(); //取消片选 SPI_Flash_Wait_Busy(); //等待芯片擦除结束 }
//擦除一个扇区 //Dst_Addr:扇区地址 0~511 for w25x16 //擦除一个山区的最少时间:150ms void SPI_Flash_Erase_Sector(u32 Dst_Addr) { Dst_Addr*=4096; SPI_FLASH_Write_Enable(); //SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; //使能器件 SPIx_ReadWriteByte(W25X_SectorErase); //发送扇区擦除指令 SPIx_ReadWriteByte((u8)((Dst_Addr)>>16)); //发送24bit地址 SPIx_ReadWriteByte((u8)((Dst_Addr)>>8)); SPIx_ReadWriteByte((u8)Dst_Addr); SPI_FLASH_CS=1; //取消片选 SPI_Flash_Wait_Busy(); //等待擦除完成 }
//SPI在一页(0~65535)内写入少于256个字节的数据 //在指定地址开始写入最大256字节的数据 //pBuffer:数据存储区 //WriteAddr:开始写入的地址(24bit) //NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!! void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u16 i; SPI_FLASH_Write_Enable(); //SET WEL SPI_FLASH_CS=0; //使能器件 SPIx_ReadWriteByte(W25X_PageProgram); //发送写页命令 SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址 SPIx_ReadWriteByte((u8)((WriteAddr)>>8)); SPIx_ReadWriteByte((u8)WriteAddr); for(i=0;i<NumByteToWrite;i++)SPIx_ReadWriteByte(pBuffer[i]);//循环写数 SPI_FLASH_CS=1; //取消片选 SPI_Flash_Wait_Busy(); //等待写入结束 }
//擦除一个扇区 //Dst_Addr:扇区地址 根据实际容量设置 //擦除一个山区的最少时间:150ms void SPI_Flash_Erase_Sector(u32 Dst_Addr) { //监视falsh擦除情况,测试用 printf("fe:%x\r\n",Dst_Addr); Dst_Addr*=4096; SPI_FLASH_Write_Enable(); //SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; //使能器件 SPI2_ReadWriteByte(W25X_SectorErase); //发送扇区擦除指令 SPI2_ReadWriteByte((u8)((Dst_Addr)>>16)); //发送24bit地址 SPI2_ReadWriteByte((u8)((Dst_Addr)>>8)); SPI2_ReadWriteByte((u8)Dst_Addr); SPI_FLASH_CS=1; //取消片选 SPI_Flash_Wait_Busy(); //等待擦除完成 }