Files
stm32f407ve_black/BSP/Src/bsp_w25qxx.c

171 lines
4.9 KiB
C

/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : bsp_w25qxx.c
* @brief : BSP layer for W25QXX flash memory
******************************************************************************
*/
/* USER CODE END Header */
#include "bsp_w25qxx.h"
#include "delay.h"
/**
* @brief SPI send function for W25QXX
* @param data Pointer to data buffer to send
* @param size Size of data to send
* @return true if successful, false otherwise
*/
static bool w25qxx_spi_send(const uint8_t *data, uint16_t size) {
return hal_spi_transmit(W25QXX_SPI_INSTANCE, data, size);
}
/**
* @brief SPI receive function for W25QXX
* @param data Pointer to data buffer to receive
* @param size Size of data to receive
* @return true if successful, false otherwise
*/
static bool w25qxx_spi_receive(uint8_t *data, uint16_t size) {
return hal_spi_receive(W25QXX_SPI_INSTANCE, data, size);
}
/**
* @brief SPI transmit and receive function for W25QXX
* @param tx_data Pointer to transmit data buffer
* @param rx_data Pointer to receive data buffer
* @param size Size of data to transfer
* @return true if successful, false otherwise
*/
static bool w25qxx_spi_transceive(const uint8_t *tx_data, uint8_t *rx_data, uint16_t size) {
return hal_spi_transmit_receive(W25QXX_SPI_INSTANCE, tx_data, rx_data, size);
}
/**
* @brief Chip select function for W25QXX
* @param state true for selected, false for deselected
*/
static void w25qxx_cs_set(bool state) {
hal_gpio_write_pin(W25QXX_CS_PORT, W25QXX_CS_PIN, state ? HAL_GPIO_PIN_RESET : HAL_GPIO_PIN_SET);
}
/**
* @brief Delay function for W25QXX
* @param ms Delay time in milliseconds
*/
static void w25qxx_delay_ms(uint32_t ms) {
delay_ms(ms);
}
/**
* @brief W25QXX SPI interface structure
*/
static w25qxx_spi_interface_t w25qxx_spi_interface = {
.spi_send = w25qxx_spi_send,
.spi_receive = w25qxx_spi_receive,
.spi_transceive = w25qxx_spi_transceive,
.cs_set = w25qxx_cs_set,
.delay_ms = w25qxx_delay_ms
};
/**
* @brief Initialize W25QXX flash memory
* @retval true if initialization is successful, false otherwise
*/
bool bsp_w25qxx_init(void) {
/* Initialize CS pin */
hal_gpio_config_t gpio_config = {
.port = W25QXX_CS_PORT,
.pin = W25QXX_CS_PIN,
.mode = HAL_GPIO_MODE_OUTPUT_PP,
.speed = HAL_GPIO_SPEED_HIGH,
.pull = HAL_GPIO_PULL_NO
};
hal_gpio_configure_pin(&gpio_config);
/* Deselect chip initially */
w25qxx_cs_set(false);
/* Initialize SPI */
hal_spi_config_t spi_config = {
.instance = W25QXX_SPI_INSTANCE,
.mode = HAL_SPI_MODE_MASTER,
.baudrate = 1000000, /* 1 MHz */
.polarity = HAL_SPI_POLARITY_LOW,
.phase = HAL_SPI_PHASE_1EDGE,
.databits = HAL_SPI_DATABITS_8
};
if (!hal_spi_init(W25QXX_SPI_INSTANCE, &spi_config)) {
return false;
}
/* Initialize W25QXX driver */
return w25qxx_init(&w25qxx_spi_interface);
}
/**
* @brief Get W25QXX device information
* @param info Pointer to device information structure to fill
* @retval true if successful, false otherwise
*/
bool bsp_w25qxx_get_device_info(w25qxx_device_info_t *info) {
return w25qxx_get_device_info(info);
}
/**
* @brief Read data from W25QXX flash memory
* @param address Starting address to read from
* @param data Pointer to data buffer to store read data
* @param size Size of data to read
* @retval true if read is successful, false otherwise
*/
bool bsp_w25qxx_read(uint32_t address, uint8_t *data, uint32_t size) {
return w25qxx_read(address, data, size);
}
/**
* @brief Write data to W25QXX flash memory
* @param address Starting address to write to
* @param data Pointer to data buffer to write
* @param size Size of data to write
* @retval true if write is successful, false otherwise
*/
bool bsp_w25qxx_write(uint32_t address, const uint8_t *data, uint32_t size) {
return w25qxx_write(address, data, size);
}
/**
* @brief Erase 4KB block
* @param address Address within the block to erase
* @retval true if erase is successful, false otherwise
*/
bool bsp_w25qxx_erase_block_4kb(uint32_t address) {
return w25qxx_erase_block_4kb(address);
}
/**
* @brief Erase 32KB block
* @param address Address within the block to erase
* @retval true if erase is successful, false otherwise
*/
bool bsp_w25qxx_erase_block_32kb(uint32_t address) {
return w25qxx_erase_block_32kb(address);
}
/**
* @brief Erase 64KB block
* @param address Address within the block to erase
* @retval true if erase is successful, false otherwise
*/
bool bsp_w25qxx_erase_block_64kb(uint32_t address) {
return w25qxx_erase_block_64kb(address);
}
/**
* @brief Erase entire chip
* @retval true if erase is successful, false otherwise
*/
bool bsp_w25qxx_erase_chip(void) {
return w25qxx_erase_chip();
}