写一个mm32f0144c6p对于w25q128的写数据代码
时间: 2024-03-23 21:36:58 浏览: 24
好的,以下是mm32f0144c6p对于w25q128的写数据代码:
```c
#include "mm32f014.h"
// 定义W25Q128的指令
#define W25Q128_CMD_PAGE_PROGRAM 0x02
#define W25Q128_CMD_WRITE_ENABLE 0x06
#define W25Q128_CMD_WRITE_DISABLE 0x04
// 定义W25Q128的地址长度
#define W25Q128_ADDR_LEN 3
// 定义W25Q128的页大小
#define W25Q128_PAGE_SIZE 256
// 定义W25Q128的片选引脚
#define W25Q128_CS_PIN GPIO_Pin_4
#define W25Q128_CS_PORT GPIOA
// 初始化W25Q128的SPI接口
void W25Q128_SPI_Init(void)
{
// 配置SPI接口
SPI_DeInit(SPI1);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
// 配置W25Q128的片选引脚
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = W25Q128_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(W25Q128_CS_PORT, &GPIO_InitStructure);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
}
// 向W25Q128中写入数据
void W25Q128_Write_Data(u32 addr, u8* data, u32 len)
{
while(len > 0)
{
// 使能写入
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(SPI1, W25Q128_CMD_WRITE_ENABLE);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
// 写入数据
u32 page_remain = W25Q128_PAGE_SIZE - (addr % W25Q128_PAGE_SIZE);
u32 write_len = page_remain < len ? page_remain : len;
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(SPI1, W25Q128_CMD_PAGE_PROGRAM);
SPI_SendData(SPI1, (addr >> 16) & 0xFF);
SPI_SendData(SPI1, (addr >> 8) & 0xFF);
SPI_SendData(SPI1, addr & 0xFF);
while(write_len--)
{
SPI_SendData(SPI1, *data++);
}
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
addr += page_remain;
len -= page_remain;
}
// 禁止写入
GPIO_ResetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
SPI_SendData(SPI1, W25Q128_CMD_WRITE_DISABLE);
GPIO_SetBits(W25Q128_CS_PORT, W25Q128_CS_PIN);
}
```
这段代码使用SPI接口和GPIO控制W25Q128,通过发送写入数据的指令和地址,然后写入指定长度的数据。由于W25Q128只支持一页一页地写入,因此代码会将数据按页大小分块写入。你可以根据自己的需要对代码进行适当的修改。