MR16/sx1281-driver-c/hw-spi.c

134 lines
4.2 KiB
C

#include "hw.h"
#include "bsp/spi.h"
/* Private variables ---------------------------------------------------------*/
/////////////////////////////////////////////////////////////
static bool dma_spi1=false;
static volatile bool spi_done = false; // 仍用一次标志,但由 BSP 回调清零
/* -------------- 局部回调 -------------- */
static void txrx_cplt_cb(void) { spi_done = false; }
static void tx_cplt_cb (void) { spi_done = false; }
void SpiInit( void )
{
BSP_SPI_RegisterCallback(BSP_SPI_SX1281, BSP_SPI_TX_RX_CPLT_CB, txrx_cplt_cb);
BSP_SPI_RegisterCallback(BSP_SPI_SX1281, BSP_SPI_TX_CPLT_CB, tx_cplt_cb);
}
/*!
* @brief Sends txBuffer and receives rxBuffer
*
* @param [IN] txBuffer Byte to be sent
* @param [OUT] rxBuffer Byte to be sent
* @param [IN] size Byte to be sent
*/
void SpiInOut( uint8_t *txBuffer, uint8_t *rxBuffer, uint16_t size )
{
// HAL_SPIEx_FlushRxFifo( &hspi1 );
// #ifdef USE_DMA
// blockingDmaFlag = true;
// HAL_SPI_TransmitReceive_DMA( &hspi1, txBuffer, rxBuffer, size );
// WAIT_FOR_BLOCKING_FLAG
// #else
// HAL_SPI_TransmitReceive( &hspi1, txBuffer, rxBuffer, size, HAL_MAX_DELAY );
// #endif
spi_done = true;
BSP_SPI_TransmitReceive(BSP_SPI_SX1281, txBuffer, rxBuffer, size, dma_spi1); // true = DMA
// wait_done();
}
void SpiIn( uint8_t *txBuffer, uint16_t size )
{
// #ifdef USE_DMA
// blockingDmaFlag = true;
// HAL_SPI_Transmit_DMA( &hspi1, txBuffer, size );
// WAIT_FOR_BLOCKING_FLAG
// #else
// HAL_SPI_Transmit( &hspi1, txBuffer, size, HAL_MAX_DELAY );
// #endif
spi_done = true;
BSP_SPI_Transmit(BSP_SPI_SX1281, txBuffer, size, dma_spi1);
// wait_done();
}
static void wait_done(void)
{
while (spi_done) { /* 空转,或者换成 OS 延时/信号量 */ }
}
////////////////////////////////////////////////////////////
// SPI_HandleTypeDef SpiHandle;
// volatile bool blockingDmaFlag;
// void SpiInit( void )
// {
// SpiHandle.Instance = SPI1;
// SpiHandle.Init.Mode = SPI_MODE_MASTER;
// SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
// SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
// SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
// SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
// SpiHandle.Init.NSS = SPI_NSS_SOFT;
// SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
// SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
// SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
// SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
// SpiHandle.Init.CRCPolynomial = 7;
// // SpiHandle.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
// // SpiHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
// if ( HAL_SPI_Init( &SpiHandle ) != HAL_OK )
// {
// Error_Handler( );
// }
// }
void SpiDeInit( void )
{
/* 注销回调或直接留空 */
}
// #define WAIT_FOR_BLOCKING_FLAG while( blockingDmaFlag ) { }
// /*!
// * @brief Sends txBuffer and receives rxBuffer
// *
// * @param [IN] txBuffer Byte to be sent
// * @param [OUT] rxBuffer Byte to be sent
// * @param [IN] size Byte to be sent
// */
// void SpiInOut( uint8_t *txBuffer, uint8_t *rxBuffer, uint16_t size )
// {
// // HAL_SPIEx_FlushRxFifo( &SpiHandle );
// #ifdef USE_DMA
// blockingDmaFlag = true;
// HAL_SPI_TransmitReceive_DMA( &SpiHandle, txBuffer, rxBuffer, size );
// WAIT_FOR_BLOCKING_FLAG
// #else
// HAL_SPI_TransmitReceive( &SpiHandle, txBuffer, rxBuffer, size, HAL_MAX_DELAY );
// #endif
// }
// void SpiIn( uint8_t *txBuffer, uint16_t size )
// {
// #ifdef USE_DMA
// blockingDmaFlag = true;
// HAL_SPI_Transmit_DMA( &SpiHandle, txBuffer, size );
// WAIT_FOR_BLOCKING_FLAG
// #else
// HAL_SPI_Transmit( &SpiHandle, txBuffer, size, HAL_MAX_DELAY );
// #endif
// }
// void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
// {
// blockingDmaFlag = false;
// }
// void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
// {
// blockingDmaFlag = false;
// }