写一个mm32F0144C6p对于W25Q128的快速擦除代码
时间: 2024-03-12 17:47:02 浏览: 19
好的,这是mm32F0144C6p对于W25Q128的快速擦除代码:
```c
#include "mm32f0144.h"
#include "spi.h"
// 定义W25Q128的指令集
#define W25Q128_CMD_WRITE_ENABLE 0x06
#define W25Q128_CMD_WRITE_DISABLE 0x04
#define W25Q128_CMD_CHIP_ERASE 0xC7
#define W25Q128_CMD_SECTOR_ERASE 0x20
#define W25Q128_CMD_BLOCK_ERASE_32K 0x52
#define W25Q128_CMD_BLOCK_ERASE_64K 0xD8
#define W25Q128_CMD_READ_STATUS_REG 0x05
#define W25Q128_CMD_WRITE_STATUS_REG 0x01
// 定义擦除状态
#define W25Q128_ERASE_OK 0x00
#define W25Q128_ERASE_ERROR 0x01
// 定义W25Q128的芯片选择引脚
#define W25Q128_CS_PIN GPIO_Pin_15
#define W25Q128_CS_PORT GPIOB
// 定义SPI接口
#define W25Q128_SPI SPI1
// 函数声明
void W25Q128_WriteEnable(void);
void W25Q128_WriteDisable(void);
uint8_t W25Q128_ChipErase(void);
uint8_t W25Q128_SectorErase(uint32_t address);
uint8_t W25Q128_BlockErase32K(uint32_t address);
uint8_t W25Q128_BlockErase64K(uint32_t address);
// W25Q128写使能
void W25Q128_WriteEnable(void)
{
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_WRITE_ENABLE);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
}
// W25Q128写禁止
void W25Q128_WriteDisable(void)
{
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_WRITE_DISABLE);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
}
// W25Q128整片擦除
uint8_t W25Q128_ChipErase(void)
{
uint8_t status;
W25Q128_WriteEnable(); // 写使能
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_CHIP_ERASE);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
// 等待擦除完成
do {
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_READ_STATUS_REG);
status = SPI_ReceiveData(W25Q128_SPI);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
} while ((status & 0x01) == 0x01);
if (status & 0x20) {
return W25Q128_ERASE_ERROR;
} else {
return W25Q128_ERASE_OK;
}
}
// W25Q128扇区擦除
uint8_t W25Q128_SectorErase(uint32_t address)
{
uint8_t status;
W25Q128_WriteEnable(); // 写使能
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_SECTOR_ERASE);
SPI_SendData(W25Q128_SPI, (address >> 16) & 0xFF);
SPI_SendData(W25Q128_SPI, (address >> 8) & 0xFF);
SPI_SendData(W25Q128_SPI, address & 0xFF);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
// 等待擦除完成
do {
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_READ_STATUS_REG);
status = SPI_ReceiveData(W25Q128_SPI);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
} while ((status & 0x01) == 0x01);
if (status & 0x20) {
return W25Q128_ERASE_ERROR;
} else {
return W25Q128_ERASE_OK;
}
}
// W25Q12832K块擦除
uint8_t W25Q128_BlockErase32K(uint32_t address)
{
uint8_t status;
W25Q128_WriteEnable(); // 写使能
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_BLOCK_ERASE_32K);
SPI_SendData(W25Q128_SPI, (address >> 16) & 0xFF);
SPI_SendData(W25Q128_SPI, (address >> 8) & 0xFF);
SPI_SendData(W25Q128_SPI, address & 0xFF);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
// 等待擦除完成
do {
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_READ_STATUS_REG);
status = SPI_ReceiveData(W25Q128_SPI);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
} while ((status & 0x01) == 0x01);
if (status & 0x20) {
return W25Q128_ERASE_ERROR;
} else {
return W25Q128_ERASE_OK;
}
}
// W25Q12864K块擦除
uint8_t W25Q128_BlockErase64K(uint32_t address)
{
uint8_t status;
W25Q128_WriteEnable(); // 写使能
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_BLOCK_ERASE_64K);
SPI_SendData(W25Q128_SPI, (address >> 16) & 0xFF);
SPI_SendData(W25Q128_SPI, (address >> 8) & 0xFF);
SPI_SendData(W25Q128_SPI, address & 0xFF);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
// 等待擦除完成
do {
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(W25Q128_SPI, W25Q128_CMD_READ_STATUS_REG);
status = SPI_ReceiveData(W25Q128_SPI);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
} while ((status & 0x01) == 0x01);
if (status & 0x20) {
return W25Q128_ERASE_ERROR;
} else {
return W25Q128_ERASE_OK;
}
}
```
这是基于SPI接口的W25Q128擦除函数,可以实现整片擦除、扇区擦除、32K块擦除和64K块擦除。其中,W25Q128_WriteEnable和W25Q128_WriteDisable函数用于写使能和写禁止,其他函数中均包含了这两个函数的调用。需要注意的是,这个代码中使用的是mm32F0144C6p的SPI1接口,如果你使用的是其他的芯片或者接口,需要进行相应的修改。