171 lines
4.9 KiB
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) == HAL_RET_OK;
|
|
}
|
|
|
|
/**
|
|
* @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) == HAL_RET_OK;
|
|
}
|
|
|
|
/**
|
|
* @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) == HAL_RET_OK;
|
|
}
|
|
|
|
/**
|
|
* @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) != HAL_RET_OK) {
|
|
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();
|
|
} |