mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-25 07:43:38 +00:00
stm32-sx1280: implement DMA TX only and TX+RX
# Conflicts: # port/stm32-l073rz-nucleo-sx1280/Inc/main.h
This commit is contained in:
parent
ec59e7868b
commit
78bb22e917
@ -133,16 +133,70 @@ const struct Radio_s Radio =
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifndef USE_BK_SPI
|
#ifndef USE_BK_SPI
|
||||||
static uint8_t halRxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
|
|
||||||
#endif
|
#endif
|
||||||
|
static uint8_t halRxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
|
||||||
static uint8_t halTxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
|
static uint8_t halTxBuffer[MAX_HAL_BUFFER_SIZE] = {0x00};
|
||||||
|
|
||||||
static DioIrqHandler **dioIrqHandlers;
|
static DioIrqHandler **dioIrqHandlers;
|
||||||
|
|
||||||
extern SPI_HandleTypeDef RADIO_SPI_HANDLE;
|
extern SPI_HandleTypeDef RADIO_SPI_HANDLE;
|
||||||
|
extern DMA_HandleTypeDef RADIO_SPI_DMA_RX;
|
||||||
|
extern DMA_HandleTypeDef RADIO_SPI_DMA_TX;
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_BK_SPI
|
#ifdef USE_BK_SPI
|
||||||
|
|
||||||
|
static void spi_tx_only_dma(const uint8_t * tx_data, uint16_t tx_len) {
|
||||||
|
|
||||||
|
// Enable & Config SPI
|
||||||
|
#ifdef STM32L4XX_FAMILY
|
||||||
|
/* Set fiforxthreshold according the reception data length: 8bit */
|
||||||
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_RXFIFO_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check if the SPI is already enabled */
|
||||||
|
if ((RADIO_SPI_HANDLE.Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) {
|
||||||
|
/* Enable SPI peripheral */
|
||||||
|
__HAL_SPI_ENABLE(&RADIO_SPI_HANDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_DMA_Start(&RADIO_SPI_DMA_TX, (uintptr_t) tx_data, (uintptr_t) &RADIO_SPI_HANDLE.Instance->DR, tx_len);
|
||||||
|
|
||||||
|
/* Enable Tx DMA Request */
|
||||||
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_CR2_TXDMAEN);
|
||||||
|
|
||||||
|
HAL_DMA_PollForTransfer(&RADIO_SPI_DMA_TX, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
|
||||||
|
|
||||||
|
/* Discard received byte */
|
||||||
|
(void) RADIO_SPI_HANDLE.Instance->DR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_tx_rx_dma(const uint8_t * tx_data, uint8_t * rx_buffer, uint16_t size) {
|
||||||
|
|
||||||
|
#ifdef STM32L4XX_FAMILY
|
||||||
|
/* Set fiforxthreshold according the reception data length: 8bit */
|
||||||
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_RXFIFO_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check if the SPI is already enabled */
|
||||||
|
if ((RADIO_SPI_HANDLE.Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) {
|
||||||
|
/* Enable SPI peripheral */
|
||||||
|
__HAL_SPI_ENABLE(&RADIO_SPI_HANDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable Rx DMA Request */
|
||||||
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_CR2_RXDMAEN);
|
||||||
|
|
||||||
|
HAL_DMA_Start(&RADIO_SPI_DMA_RX, (uintptr_t) &RADIO_SPI_HANDLE.Instance->DR, (uintptr_t) rx_buffer, size);
|
||||||
|
HAL_DMA_Start(&RADIO_SPI_DMA_TX, (uintptr_t) tx_data, (uintptr_t) &RADIO_SPI_HANDLE.Instance->DR, size);
|
||||||
|
|
||||||
|
/* Enable Tx DMA Request */
|
||||||
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_CR2_TXDMAEN);
|
||||||
|
|
||||||
|
HAL_DMA_PollForTransfer(&RADIO_SPI_DMA_TX, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
|
||||||
|
HAL_DMA_PollForTransfer(&RADIO_SPI_DMA_RX, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
static void spi_tx_then_rx(SPI_HandleTypeDef *hspi, const uint8_t * tx_data, uint16_t tx_len, uint8_t * rx_buffer, uint16_t rx_len){
|
static void spi_tx_then_rx(SPI_HandleTypeDef *hspi, const uint8_t * tx_data, uint16_t tx_len, uint8_t * rx_buffer, uint16_t rx_len){
|
||||||
|
|
||||||
/* Set fiforxthreshold according the reception data length: 8bit */
|
/* Set fiforxthreshold according the reception data length: 8bit */
|
||||||
@ -184,29 +238,36 @@ static void spi_tx_then_rx(SPI_HandleTypeDef *hspi, const uint8_t * tx_data, uin
|
|||||||
// assert: tx_data == tx_buffer (local call)
|
// assert: tx_data == tx_buffer (local call)
|
||||||
void SX1280HalSpiTxThenRx(uint16_t tx_len, uint8_t * rx_buffer, uint16_t rx_len){
|
void SX1280HalSpiTxThenRx(uint16_t tx_len, uint8_t * rx_buffer, uint16_t rx_len){
|
||||||
|
|
||||||
#ifdef USE_BK_SPI
|
// min size for dma to be faster (L073@24 Mhz)
|
||||||
spi_tx_then_rx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len, rx_buffer, rx_len);
|
const uint16_t dma_tx_min_size = 8;
|
||||||
#else
|
const uint16_t dma_tx_rx_min_size = 16;
|
||||||
|
|
||||||
if (rx_len == 0){
|
if (rx_len == 0){
|
||||||
|
if (tx_len < dma_tx_min_size) {
|
||||||
// SPI Transfer
|
// Custom Polling
|
||||||
HAL_SPI_Transmit( &RADIO_SPI_HANDLE, halTxBuffer, size, HAL_MAX_DELAY );
|
spi_tx_then_rx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len, NULL, 0);
|
||||||
|
} else {
|
||||||
|
// Custom DMA
|
||||||
|
spi_tx_only_dma( halTxBuffer, tx_len );
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
uint16_t total_len = tx_len + rx_len;
|
||||||
|
|
||||||
// fill TX buffer with zeros
|
// fill TX buffer with zeros
|
||||||
memset(&halTxBuffer[tx_len], 0, rx_len);
|
memset(&halTxBuffer[tx_len], 0, rx_len);
|
||||||
|
|
||||||
// SPI Transfer
|
if (total_len < dma_tx_rx_min_size){
|
||||||
#ifdef STM32L4XX_FAMILY
|
// Custom Polling
|
||||||
// Comment For STM32L0XX and STM32L1XX Intégration, uncomment for STM32L4XX Intégration
|
spi_tx_then_rx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len, rx_buffer, rx_len);
|
||||||
HAL_SPIEx_FlushRxFifo( &RADIO_SPI_HANDLE );
|
} else {
|
||||||
#endif
|
// Custom DMA
|
||||||
HAL_SPI_TransmitReceive( &RADIO_SPI_HANDLE, halTxBuffer, halRxBuffer, size, HAL_MAX_DELAY );
|
spi_tx_rx_dma( halTxBuffer, halRxBuffer, total_len);
|
||||||
|
// return rx data
|
||||||
|
memcpy( rx_buffer, &halRxBuffer[tx_len], rx_len );
|
||||||
|
}
|
||||||
|
|
||||||
// return rx data
|
|
||||||
memcpy( rx_buffer, &halRxBuffer[tx_len], size );
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user