AT25DF081A stm32 驱动代码
时间: 2023-08-03 11:07:33 浏览: 56
以下是AT25DF081A在STM32上的SPI驱动代码示例(使用CubeMX生成的代码):
```c
#include "spi.h"
#include "main.h"
/* AT25DF081A SPI commands */
#define CMD_WREN 0x06 // Write Enable
#define CMD_WRDI 0x04 // Write Disable
#define CMD_RDSR 0x05 // Read Status Register
#define CMD_ERASE 0xC7 // Erase Chip
#define CMD_READ 0x03 // Read Data Bytes
#define CMD_PP 0x02 // Page Program
/* AT25DF081A Status Register bits */
#define SR_WIP 0x01 // Write In Progress
#define SR_WEL 0x02 // Write Enable Latch
/* AT25DF081A page size */
#define PAGE_SIZE 256
SPI_HandleTypeDef hspi1;
/**
* @brief Write enable command.
*/
void AT25DF081A_WriteEnable(void)
{
uint8_t cmd = CMD_WREN;
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
}
/**
* @brief Write disable command.
*/
void AT25DF081A_WriteDisable(void)
{
uint8_t cmd = CMD_WRDI;
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
}
/**
* @brief Read status register.
* @return Status register value.
*/
uint8_t AT25DF081A_ReadStatus(void)
{
uint8_t cmd = CMD_RDSR;
uint8_t status;
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, &status, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
return status;
}
/**
* @brief Wait for write operation to complete.
*/
void AT25DF081A_WaitForWriteComplete(void)
{
while (AT25DF081A_ReadStatus() & SR_WIP);
}
/**
* @brief Erase chip.
*/
void AT25DF081A_EraseChip(void)
{
AT25DF081A_WriteEnable();
uint8_t cmd = CMD_ERASE;
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
AT25DF081A_WaitForWriteComplete();
}
/**
* @brief Read data from memory.
* @param address: Start address.
* @param data: Pointer to read buffer.
* @param size: Number of bytes to read.
*/
void AT25DF081A_ReadData(uint32_t address, uint8_t *data, uint16_t size)
{
uint8_t cmd[4] = {CMD_READ, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, data, size, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
}
/**
* @brief Write data to memory.
* @param address: Start address.
* @param data: Pointer to write buffer.
* @param size: Number of bytes to write.
*/
void AT25DF081A_WriteData(uint32_t address, uint8_t *data, uint16_t size)
{
uint16_t page_size = PAGE_SIZE;
uint16_t bytes_left = size;
uint8_t *data_ptr = data;
while (bytes_left > 0)
{
uint16_t page_offset = address % page_size;
uint16_t page_remaining = page_size - page_offset;
uint16_t write_size = (bytes_left < page_remaining) ? bytes_left : page_remaining;
AT25DF081A_WriteEnable();
uint8_t cmd[4] = {CMD_PP, (address >> 16) & 0xFF, (address >> 8) & 0xFF, address & 0xFF};
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);
HAL_SPI_Transmit(&hspi1, data_ptr, write_size, HAL_MAX_DELAY);
HAL_GPIO_WritePin(AT25DF081A_CS_GPIO_Port, AT25DF081A_CS_Pin, GPIO_PIN_SET);
AT25DF081A_WaitForWriteComplete();
address += write_size;
data_ptr += write_size;
bytes_left -= write_size;
}
}
```
其中,AT25DF081A_WriteEnable() 和 AT25DF081A_WriteDisable() 函数用于发送写使能和写禁用命令;AT25DF081A_ReadStatus() 函数用于读取状态寄存器;AT25DF081A_WaitForWriteComplete() 函数用于等待写操作完成;AT25DF081A_EraseChip() 函数用于擦除整个芯片;AT25DF081A_ReadData() 函数用于从指定地址读取数据;AT25DF081A_WriteData() 函数用于向指定地址写入数据。注意,具体的引脚定义和 SPI 初始化代码需要根据实际情况进行修改。