LPC5516 怎样 spi 通过 dma linker 方式连续发送多组数据,请基于 spi_dma_b2b_transfer_master 例程, 使用 spi1 来实现上述功能的 DEMO code
时间: 2024-05-10 11:19:28 浏览: 135
以下是基于 spi_dma_b2b_transfer_master 例程,使用 spi1 实现连续发送多组数据的 DEMO code:
```
#include "board.h"
#include "fsl_spi_dma.h"
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_SPI_MASTER SPI1
#define EXAMPLE_SPI_DMA_MASTER_CHANNEL kDmaRequestMux0SPI1TX
#define EXAMPLE_SPI_DMA_BASEADDR DMA0
#define EXAMPLE_SPI_SSEL 0
#define EXAMPLE_SPI_SPOL kSPI_SpolActiveAllLow
#define TRANSFER_BAUDRATE 500000U /*! Transfer baudrate - 500k */
#define BUFFER_SIZE 64U /*! Transfer buffer size */
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
AT_NONCACHEABLE_SECTION_ALIGN(static uint8_t txBuffer[BUFFER_SIZE], 4);
static uint8_t dataToSend[] = {0x01, 0x02, 0x03, 0x04, 0x05};
static uint8_t dataIndex = 0;
static spi_dma_handle_t g_spiDmaHandle;
static dma_handle_t g_spiDmaTxHandle;
static uint8_t isBusy = 0;
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief SPI DMA callback function.
*/
void SPI_MasterUserCallback(SPI_Type *base, spi_dma_handle_t *handle, status_t status, void *userData)
{
isBusy = 0;
}
/*!
* @brief Main function
*/
int main(void)
{
spi_transfer_t xfer = {0};
spi_master_config_t userConfig;
dma_transfer_config_t dmaXferConfig;
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
PRINTF("\r\nSPI DMA example start.\r\n");
/* Init SPI master */
SPI_MasterGetDefaultConfig(&userConfig);
userConfig.baudRate_Bps = TRANSFER_BAUDRATE;
userConfig.sselNum = EXAMPLE_SPI_SSEL;
userConfig.sselPol = EXAMPLE_SPI_SPOL;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, CLOCK_GetFreq(kCLOCK_CoreSysClk));
/* Set up DMA */
DMA_Init(EXAMPLE_SPI_DMA_BASEADDR);
DMA_EnableChannel(EXAMPLE_SPI_DMA_BASEADDR, EXAMPLE_SPI_DMA_MASTER_CHANNEL);
/* Create handle for SPI DMA */
SPI_MasterTransferCreateHandleDMA(EXAMPLE_SPI_MASTER, &g_spiDmaHandle, SPI_MasterUserCallback, NULL, &g_spiDmaTxHandle, EXAMPLE_SPI_DMA_MASTER_CHANNEL);
/* Send data using DMA */
while (1)
{
if (!isBusy)
{
xfer.txData = dataToSend;
xfer.dataSize = sizeof(dataToSend);
isBusy = 1;
SPI_MasterTransferDMA(EXAMPLE_SPI_MASTER, &g_spiDmaHandle, &xfer);
dataIndex++;
if (dataIndex >= sizeof(txBuffer))
{
dataIndex = 0;
}
}
}
}
```
该代码将连续发送 dataToSend 数组中的五个字节数据,每次发送完毕后,会将 dataIndex 加 1,当 dataIndex 大于等于 BUFFER_SIZE(64)时,重新从头开始发送。实现了 spi 通过 dma linker 方式连续发送多组数据的功能。
阅读全文