134 lines
4.2 KiB
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;
|
|
// }
|