stm32f1读写w25q128
时间: 2023-08-07 19:31:29 浏览: 100
要使用STM32F1读写W25Q128,可以按照以下步骤进行:
1. 配置SPI接口,设置其时钟分频、数据传输模式、数据位宽、CPOL和CPHA等参数。
2. 初始化W25Q128,发送相应的命令和参数,如复位指令、读取设备ID指令等。
3. 读取或写入数据时,先发送读取或写入命令,再发送地址和数据。
4. 在读取数据时,需要注意W25Q128的页和块的大小,以及是否需要进行页对齐和块对齐等操作。
以下是一个简单的示例代码,供参考:
```c
#include "stm32f1xx.h"
#include "spi.h"
#define W25Q128_CMD_WRITE_ENABLE 0x06
#define W25Q128_CMD_CHIP_ERASE 0xC7
#define W25Q128_CMD_PAGE_PROGRAM 0x02
#define W25Q128_CMD_READ_DATA 0x03
#define W25Q128_CMD_READ_DEVICE_ID 0x90
#define W25Q128_FLASH_SIZE (16*1024*1024) // 128Mbit
#define W25Q128_PAGE_SIZE 256
#define W25Q128_SECTOR_SIZE (4*1024)
#define W25Q128_BLOCK_SIZE (64*1024)
void W25Q128_WriteEnable(void)
{
SPI_CS_LOW();
SPI_Transmit(W25Q128_CMD_WRITE_ENABLE);
SPI_CS_HIGH();
}
void W25Q128_ChipErase(void)
{
W25Q128_WriteEnable();
SPI_CS_LOW();
SPI_Transmit(W25Q128_CMD_CHIP_ERASE);
SPI_CS_HIGH();
}
void W25Q128_PageProgram(uint32_t addr, const uint8_t *data, uint32_t size)
{
W25Q128_WriteEnable();
SPI_CS_LOW();
SPI_Transmit(W25Q128_CMD_PAGE_PROGRAM);
SPI_Transmit((uint8_t)(addr >> 16));
SPI_Transmit((uint8_t)(addr >> 8));
SPI_Transmit((uint8_t)addr);
SPI_TransmitArray(data, size);
SPI_CS_HIGH();
}
void W25Q128_ReadData(uint32_t addr, uint8_t *data, uint32_t size)
{
SPI_CS_LOW();
SPI_Transmit(W25Q128_CMD_READ_DATA);
SPI_Transmit((uint8_t)(addr >> 16));
SPI_Transmit((uint8_t)(addr >> 8));
SPI_Transmit((uint8_t)addr);
SPI_ReceiveArray(data, size);
SPI_CS_HIGH();
}
void W25Q128_ReadDeviceID(uint8_t *data)
{
SPI_CS_LOW();
SPI_Transmit(W25Q128_CMD_READ_DEVICE_ID);
SPI_Transmit(0x00);
SPI_Transmit(0x00);
SPI_Transmit(0x00);
SPI_ReceiveArray(data, 2);
SPI_CS_HIGH();
}
int main(void)
{
uint8_t data[] = "Hello, world!";
uint8_t read_data[16] = {0};
uint8_t device_id[2] = {0};
SPI_Init();
W25Q128_ChipErase();
W25Q128_PageProgram(0, data, sizeof(data));
W25Q128_ReadData(0, read_data, sizeof(read_data));
W25Q128_ReadDeviceID(device_id);
while (1)
{
// do something
}
}
```
需要注意的是,以上仅为一个简单的示例代码,实际使用时还需要根据具体情况进行修改和调试。
阅读全文