mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-21 12:40:42 +00:00
stm32-sx1280: split spi_tx_then_rx into spi_tx and spi_rx, temp disable DMA
This commit is contained in:
parent
c0c089bbef
commit
2fac2f8a90
@ -144,19 +144,44 @@ 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) {
|
static void spi_enable(SPI_HandleTypeDef *hspi){
|
||||||
|
|
||||||
// Enable & Config SPI
|
|
||||||
#ifdef STM32L4XX_FAMILY
|
|
||||||
/* Set fiforxthreshold according the reception data length: 8bit */
|
/* Set fiforxthreshold according the reception data length: 8bit */
|
||||||
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_RXFIFO_THRESHOLD);
|
SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Check if the SPI is already enabled */
|
/* Check if the SPI is already enabled */
|
||||||
if ((RADIO_SPI_HANDLE.Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) {
|
if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
|
||||||
|
{
|
||||||
/* Enable SPI peripheral */
|
/* Enable SPI peripheral */
|
||||||
__HAL_SPI_ENABLE(&RADIO_SPI_HANDLE);
|
__HAL_SPI_ENABLE(hspi);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_tx(SPI_HandleTypeDef *hspi, const uint8_t * tx_data, uint16_t tx_len){
|
||||||
|
// send tx / ignore rx
|
||||||
|
uint8_t tx_byte = *tx_data++;
|
||||||
|
while (tx_len > 0){
|
||||||
|
tx_len--;
|
||||||
|
// while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE) == 0);
|
||||||
|
*(__IO uint8_t *)&hspi->Instance->DR = tx_byte;
|
||||||
|
tx_byte = *tx_data++;
|
||||||
|
while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE) == 0);
|
||||||
|
uint8_t rx_byte = *(__IO uint8_t *)&hspi->Instance->DR;
|
||||||
|
(void) rx_byte;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_rx(SPI_HandleTypeDef *hspi, uint8_t * rx_buffer, uint16_t rx_len){
|
||||||
|
// send NOP / store rx
|
||||||
|
while (rx_len > 0){
|
||||||
|
rx_len--;
|
||||||
|
// while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE) == 0);
|
||||||
|
*(__IO uint8_t *)&hspi->Instance->DR = 0;
|
||||||
|
while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE) == 0);
|
||||||
|
*rx_buffer++ = *(__IO uint8_t *)&hspi->Instance->DR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void spi_tx_only_dma(const uint8_t * tx_data, uint16_t tx_len) {
|
||||||
|
|
||||||
HAL_DMA_Start(&RADIO_SPI_DMA_TX, (uintptr_t) tx_data, (uintptr_t) &RADIO_SPI_HANDLE.Instance->DR, tx_len);
|
HAL_DMA_Start(&RADIO_SPI_DMA_TX, (uintptr_t) tx_data, (uintptr_t) &RADIO_SPI_HANDLE.Instance->DR, tx_len);
|
||||||
|
|
||||||
@ -171,17 +196,6 @@ static void spi_tx_only_dma(const uint8_t * tx_data, uint16_t tx_len) {
|
|||||||
|
|
||||||
static void spi_tx_rx_dma(const uint8_t * tx_data, uint8_t * rx_buffer, uint16_t size) {
|
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 */
|
/* Enable Rx DMA Request */
|
||||||
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_CR2_RXDMAEN);
|
SET_BIT(RADIO_SPI_HANDLE.Instance->CR2, SPI_CR2_RXDMAEN);
|
||||||
|
|
||||||
@ -195,81 +209,39 @@ static void spi_tx_rx_dma(const uint8_t * tx_data, uint8_t * rx_buffer, uint16_t
|
|||||||
HAL_DMA_PollForTransfer(&RADIO_SPI_DMA_RX, 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){
|
|
||||||
|
|
||||||
/* Set fiforxthreshold according the reception data length: 8bit */
|
|
||||||
SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
|
|
||||||
|
|
||||||
/* Check if the SPI is already enabled */
|
|
||||||
if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
|
|
||||||
{
|
|
||||||
/* Enable SPI peripheral */
|
|
||||||
__HAL_SPI_ENABLE(hspi);
|
|
||||||
}
|
|
||||||
|
|
||||||
// send tx / ignore rx
|
|
||||||
|
|
||||||
uint8_t tx_byte = *tx_data++;
|
|
||||||
while (tx_len > 0){
|
|
||||||
tx_len--;
|
|
||||||
// while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE) == 0);
|
|
||||||
*(__IO uint8_t *)&hspi->Instance->DR = tx_byte;
|
|
||||||
tx_byte = *tx_data++;
|
|
||||||
while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE) == 0);
|
|
||||||
// *rx_buffer++ = *(__IO uint8_t *)&hspi->Instance->DR;
|
|
||||||
uint8_t rx_byte = *(__IO uint8_t *)&hspi->Instance->DR;
|
|
||||||
(void) rx_byte;
|
|
||||||
}
|
|
||||||
|
|
||||||
// send NOP / store rx
|
|
||||||
|
|
||||||
while (rx_len > 0){
|
|
||||||
rx_len--;
|
|
||||||
// while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE) == 0);
|
|
||||||
*(__IO uint8_t *)&hspi->Instance->DR = 0;
|
|
||||||
while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE) == 0);
|
|
||||||
*rx_buffer++ = *(__IO uint8_t *)&hspi->Instance->DR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// assert: tx_data == tx_buffer (local call)
|
// assert: tx_data == tx_buffer (local call), tx_len > 0
|
||||||
|
// DMA is disabled as one extra byte is read
|
||||||
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){
|
||||||
|
|
||||||
// min size for dma to be faster (L073@24 Mhz)
|
spi_enable(&RADIO_SPI_HANDLE);
|
||||||
const uint16_t dma_min_size = 8;
|
|
||||||
|
|
||||||
if (rx_len == 0){
|
// min size for dma to be faster
|
||||||
if (tx_len < dma_min_size) {
|
const uint16_t dma_min_size_tx = 100;
|
||||||
// Custom Polling
|
|
||||||
spi_tx_then_rx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len, NULL, 0);
|
if (tx_len < dma_min_size_tx) {
|
||||||
} else {
|
// Custom Polling
|
||||||
// Custom DMA
|
spi_tx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len);
|
||||||
spi_tx_only_dma( halTxBuffer, tx_len );
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
|
// Custom DMA
|
||||||
|
spi_tx_only_dma( halTxBuffer, tx_len );
|
||||||
|
}
|
||||||
|
|
||||||
if (rx_len < dma_min_size){
|
// 'Flush' Fifo by reading until marked empty
|
||||||
// Custom Polling
|
HAL_SPIEx_FlushRxFifo(&RADIO_SPI_HANDLE);
|
||||||
spi_tx_then_rx(&RADIO_SPI_HANDLE, halTxBuffer, tx_len, rx_buffer, rx_len);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// poll the first few bytes
|
if (rx_len == 0) return;
|
||||||
uint8_t *tx_data = halTxBuffer;
|
|
||||||
uint8_t tx_byte = *tx_data++;
|
|
||||||
while (tx_len > 0){
|
|
||||||
tx_len--;
|
|
||||||
// while (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE) == 0);
|
|
||||||
*(__IO uint8_t *)&RADIO_SPI_HANDLE.Instance->DR = tx_byte;
|
|
||||||
tx_byte = *tx_data++;
|
|
||||||
while (__HAL_SPI_GET_FLAG(&RADIO_SPI_HANDLE, SPI_FLAG_RXNE) == 0);
|
|
||||||
uint8_t rx_byte = *(__IO uint8_t *)&RADIO_SPI_HANDLE.Instance->DR;
|
|
||||||
(void) rx_byte;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom DMA
|
// min size for dma to be faster
|
||||||
spi_tx_rx_dma( halZeroBuffer, rx_buffer, rx_len);
|
const uint16_t dma_min_size_rx = 100;
|
||||||
}
|
|
||||||
|
if (rx_len < dma_min_size_rx){
|
||||||
|
// Custom Polling
|
||||||
|
spi_rx(&RADIO_SPI_HANDLE, rx_buffer, rx_len);
|
||||||
|
} else {
|
||||||
|
// Custom DMA
|
||||||
|
spi_tx_rx_dma( halZeroBuffer, rx_buffer, rx_len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
#include "sx1280.h"
|
#include "sx1280.h"
|
||||||
#include "sx1280-hal.h"
|
#include "sx1280-hal.h"
|
||||||
|
|
||||||
|
#define RADIO_SPI_HANDLE hspi2
|
||||||
|
#define RADIO_SPI_DMA_RX hdma_spi2_rx
|
||||||
|
#define RADIO_SPI_DMA_TX hdma_spi2_tx
|
||||||
|
|
||||||
#define USE_BK_SPI
|
#define USE_BK_SPI
|
||||||
|
|
||||||
/* Define the board */
|
/* Define the board */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user