at25df081a HAL库驱动代码
时间: 2023-08-05 15:02:57 浏览: 56
以下是AT25DF081A的HAL库驱动代码,供您参考:
```c
#include "stm32f10x.h"
#include "spi.h"
#include "at25df081a.h"
#define AT25DF081A_PAGESIZE 256
#define AT25DF081A_PAGESIZE_MASK 0xFF
#define AT25DF081A_SECTORSIZE 4096
#define AT25DF081A_SECTORSIZE_MASK 0xFFF
#define AT25DF081A_MAXADDRESS 0x7FFFFF
static uint8_t at25df081a_tx_buf[AT25DF081A_PAGESIZE+4];
static uint8_t at25df081a_rx_buf[AT25DF081A_PAGESIZE+4];
void AT25DF081A_Init(void)
{
SPI2_Init();
}
void AT25DF081A_WriteEnable(void)
{
uint8_t cmd = AT25DF081A_CMD_WRITE_ENABLE;
SPI2_CS_LOW();
SPI2_SendData(&cmd, 1);
SPI2_CS_HIGH();
}
void AT25DF081A_WriteDisable(void)
{
uint8_t cmd = AT25DF081A_CMD_WRITE_DISABLE;
SPI2_CS_LOW();
SPI2_SendData(&cmd, 1);
SPI2_CS_HIGH();
}
uint8_t AT25DF081A_ReadStatusRegister(void)
{
uint8_t cmd = AT25DF081A_CMD_READ_STATUS_REGISTER;
uint8_t data;
SPI2_CS_LOW();
SPI2_SendData(&cmd, 1);
SPI2_ReceiveData(&data, 1);
SPI2_CS_HIGH();
return data;
}
void AT25DF081A_WriteStatusRegister(uint8_t value)
{
uint8_t cmd[2];
cmd[0] = AT25DF081A_CMD_WRITE_STATUS_REGISTER;
cmd[1] = value;
SPI2_CS_LOW();
SPI2_SendData(cmd, 2);
SPI2_CS_HIGH();
}
void AT25DF081A_EraseChip(void)
{
uint8_t cmd = AT25DF081A_CMD_ERASE_CHIP;
AT25DF081A_WriteEnable();
SPI2_CS_LOW();
SPI2_SendData(&cmd, 1);
SPI2_CS_HIGH();
while (AT25DF081A_ReadStatusRegister() & AT25DF081A_STATUS_REGISTER_BUSY_FLAG);
AT25DF081A_WriteDisable();
}
void AT25DF081A_EraseSector(uint32_t address)
{
uint8_t cmd[4];
cmd[0] = AT25DF081A_CMD_ERASE_SECTOR;
cmd[1] = (address >> 16) & 0xFF;
cmd[2] = (address >> 8) & 0xFF;
cmd[3] = address & 0xFF;
AT25DF081A_WriteEnable();
SPI2_CS_LOW();
SPI2_SendData(cmd, 4);
SPI2_CS_HIGH();
while (AT25DF081A_ReadStatusRegister() & AT25DF081A_STATUS_REGISTER_BUSY_FLAG);
AT25DF081A_WriteDisable();
}
void AT25DF081A_EraseBlock(uint32_t address)
{
uint8_t cmd[4];
cmd[0] = AT25DF081A_CMD_ERASE_BLOCK;
cmd[1] = (address >> 16) & 0xFF;
cmd[2] = (address >> 8) & 0xFF;
cmd[3] = address & 0xFF;
AT25DF081A_WriteEnable();
SPI2_CS_LOW();
SPI2_SendData(cmd, 4);
SPI2_CS_HIGH();
while (AT25DF081A_ReadStatusRegister() & AT25DF081A_STATUS_REGISTER_BUSY_FLAG);
AT25DF081A_WriteDisable();
}
void AT25DF081A_WritePage(uint32_t address, uint8_t *data, uint16_t length)
{
uint8_t cmd[4];
uint16_t i;
cmd[0] = AT25DF081A_CMD_PAGE_PROGRAM;
cmd[1] = (address >> 16) & 0xFF;
cmd[2] = (address >> 8) & 0xFF;
cmd[3] = address & 0xFF;
AT25DF081A_WriteEnable();
if (length > AT25DF081A_PAGESIZE)
{
length = AT25DF081A_PAGESIZE;
}
at25df081a_tx_buf[0] = cmd[0];
at25df081a_tx_buf[1] = cmd[1];
at25df081a_tx_buf[2] = cmd[2];
at25df081a_tx_buf[3] = cmd[3];
for (i = 0; i < length; i++)
{
at25df081a_tx_buf[i+4] = data[i];
}
SPI2_CS_LOW();
SPI2_SendData(at25df081a_tx_buf, length+4);
SPI2_CS_HIGH();
while (AT25DF081A_ReadStatusRegister() & AT25DF081A_STATUS_REGISTER_BUSY_FLAG);
AT25DF081A_WriteDisable();
}
void AT25DF081A_ReadPage(uint32_t address, uint8_t *data, uint16_t length)
{
uint8_t cmd[4];
uint16_t i;
cmd[0] = AT25DF081A_CMD_READ_DATA;
cmd[1] = (address >> 16) & 0xFF;
cmd[2] = (address >> 8) & 0xFF;
cmd[3] = address & 0xFF;
if (length > AT25DF081A_PAGESIZE)
{
length = AT25DF081A_PAGESIZE;
}
at25df081a_tx_buf[0] = cmd[0];
at25df081a_tx_buf[1] = cmd[1];
at25df081a_tx_buf[2] = cmd[2];
at25df081a_tx_buf[3] = cmd[3];
SPI2_CS_LOW();
SPI2_SendData(at25df081a_tx_buf, 4);
SPI2_ReceiveData(at25df081a_rx_buf, length+4);
SPI2_CS_HIGH();
for (i = 0; i < length; i++)
{
data[i] = at25df081a_rx_buf[i+4];
}
}
void AT25DF081A_Write(uint32_t address, uint8_t *data, uint16_t length)
{
uint16_t offset;
while (length > 0)
{
offset = address & AT25DF081A_PAGESIZE_MASK;
if (offset + length > AT25DF081A_PAGESIZE)
{
length = AT25DF081A_PAGESIZE - offset;
}
AT25DF081A_WritePage(address, data, length);
address += length;
data += length;
length -= length;
}
}
void AT25DF081A_Read(uint32_t address, uint8_t *data, uint16_t length)
{
uint16_t offset;
while (length > 0)
{
offset = address & AT25DF081A_PAGESIZE_MASK;
if (offset + length > AT25DF081A_PAGESIZE)
{
length = AT25DF081A_PAGESIZE - offset;
}
AT25DF081A_ReadPage(address, data, length);
address += length;
data += length;
length -= length;
}
}
```
注意,以上代码是基于STM32 HAL库编写的,如果您使用的是其他平台或库,需要相应地进行修改。另外,代码中还使用了SPI驱动,需要您先编写好SPI驱动,并在代码中调用相应的函数。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)