RMUL2025/hw/bsp/f103_can/drivers/bsp_spi.c

82 lines
2.0 KiB
C

#include "bsp_spi.h"
#include "main.h"
extern SPI_HandleTypeDef hspi1;
static bsp_callback_t callback_list[BSP_SPI_NUM][BSP_SPI_CB_NUM];
static bsp_spi_t spi_get(SPI_HandleTypeDef *hspi) {
if (hspi->Instance == SPI1) {
return BSP_SPI1;
/*
else if (hspi->Instance == SPIX)
return BSP_SPI_XXX;
*/
} else {
return BSP_SPI_ERR;
}
}
static void bsp_spi_callback(bsp_spi_callback_t cb_type,
SPI_HandleTypeDef *hspi) {
bsp_spi_t bsp_spi = spi_get(hspi);
if (bsp_spi != BSP_SPI_ERR) {
bsp_callback_t cb = callback_list[bsp_spi][cb_type];
if (cb.fn) {
cb.fn(cb.arg);
}
}
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) {
bsp_spi_callback(BSP_SPI_RX_CPLT_CB, hspi);
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) {
bsp_spi_callback(BSP_SPI_TX_CPLT_CB, hspi);
}
SPI_HandleTypeDef *bsp_spi_get_handle(bsp_spi_t spi) {
switch (spi) {
case BSP_SPI1:
return &hspi1;
/*
case BSP_SPI_XXX:
return &hspiX;
*/
default:
return NULL;
}
}
bsp_status_t bsp_spi_register_callback(bsp_spi_t spi, bsp_spi_callback_t type,
void (*callback)(void *),
void *callback_arg) {
assert_param(callback);
assert_param(type != BSP_SPI_CB_NUM);
callback_list[spi][type].fn = callback;
callback_list[spi][type].arg = callback_arg;
return BSP_OK;
}
bsp_status_t bsp_spi_transmit(bsp_spi_t spi, uint8_t *data, size_t size,
bool block) {
if (block) {
return HAL_SPI_Transmit(bsp_spi_get_handle(spi), data, size, 10) != HAL_OK;
} else {
return HAL_SPI_Transmit_DMA(bsp_spi_get_handle(spi), data, size) != HAL_OK;
}
}
bsp_status_t bsp_spi_receive(bsp_spi_t spi, uint8_t *buff, size_t size,
bool block) {
if (block) {
return HAL_SPI_Receive(bsp_spi_get_handle(spi), buff, size, 10) != HAL_OK;
} else {
return HAL_SPI_Receive_DMA(bsp_spi_get_handle(spi), buff, size) != HAL_OK;
}
}