基于 LPC5516 的 spi_dma_b2b_tranfer_master 例程,通过 寄存器配置来重复多次连续写数据,写一个 SPI1 SPI DMA 连续传输数据的 demo code,并逐行加上详细注释
时间: 2024-05-16 07:15:22 浏览: 188
以下是基于 LPC5516 的 SPI1 SPI DMA 连续传输数据的 Demo Code,注释已逐行添加:
```c
#include "board.h"
#include "peripherals.h"
#include "pin_mux.h"
#include "fsl_spi_dma.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_SPI_MASTER SPI1
#define EXAMPLE_SPI_MASTER_IRQ FLEXCOMM6_IRQn
#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(6U)
#define EXAMPLE_SPI_SSEL 0
#define EXAMPLE_DMA DMA0
#define EXAMPLE_SPI_MASTER_RX_CHANNEL 4U
#define EXAMPLE_SPI_MASTER_TX_CHANNEL 5U
#define TRANSFER_SIZE 64U /* Transfer dataSize */
#define TRANSFER_BAUDRATE 100000U
#define EXAMPLE_SPI_SPOL kSPI_SpolActiveAllLow
/*******************************************************************************
* Prototypes
******************************************************************************/
static void EXAMPLE_SPI_MASTER_UserCallback(SPI_Type *base, spi_dma_handle_t *handle,
status_t status, void *userData);
/*******************************************************************************
* Variables
******************************************************************************/
static uint8_t txData[TRANSFER_SIZE];
static uint8_t rxData[TRANSFER_SIZE];
spi_dma_handle_t g_m_handle;
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief Main function
*/
int main(void)
{
spi_transfer_t masterXfer;
spi_master_config_t masterConfig;
dma_handle_t masterTxHandle = {0};
dma_handle_t masterRxHandle = {0};
spi_dma_transfer_t masterDmaTxData;
spi_dma_transfer_t masterDmaRxData;
status_t status = kStatus_Fail;
/* Initialize board hardware */
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitBootPeripherals();
/* Set up SPI master */
SPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = TRANSFER_BAUDRATE;
masterConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, EXAMPLE_SPI_MASTER_CLK_FREQ);
/* Prepare Data */
for (uint32_t i = 0; i < TRANSFER_SIZE; i++)
{
txData[i] = i % 256;
rxData[i] = 0;
}
/* Initialize DMA */
DMA_Init(EXAMPLE_DMA);
DMA_CreateHandle(&masterTxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_CreateHandle(&masterRxHandle, EXAMPLE_DMA, EXAMPLE_SPI_MASTER_RX_CHANNEL);
/* Initiate SPI master transfer using DMA */
memset(&masterDmaTxData, 0, sizeof(masterDmaTxData));
memset(&masterDmaRxData, 0, sizeof(masterDmaRxData));
masterDmaTxData.txData = txData;
masterDmaRxData.rxData = rxData;
masterDmaTxData.dataSize = TRANSFER_SIZE;
masterDmaRxData.dataSize = TRANSFER_SIZE;
SPI_MasterTransferCreateHandleDMA(EXAMPLE_SPI_MASTER, &g_m_handle, EXAMPLE_SPI_MASTER_UserCallback, NULL,
&masterTxHandle, &masterRxHandle);
SPI_MasterTransferDMA(EXAMPLE_SPI_MASTER, &g_m_handle, &masterDmaTxData, &masterDmaRxData);
/* Wait for transfer to complete */
while (g_m_handle.state != kSPI_Idle)
{
}
/* Verify Data */
for (uint32_t i = 0; i < TRANSFER_SIZE; i++)
{
if (txData[i] != rxData[i])
{
status = kStatus_Fail;
break;
}
}
while (1)
{
}
}
/*!
* @brief SPI master transfer completed callback.
*/
static void EXAMPLE_SPI_MASTER_UserCallback(SPI_Type *base, spi_dma_handle_t *handle,
status_t status, void *userData)
{
/* Signal transfer complete */
handle->state = kSPI_Idle;
}
```
注释中已经详细说明了各个部分的作用,这里再进行一些简单的解释:
1. `EXAMPLE_SPI_MASTER`、`EXAMPLE_SPI_MASTER_IRQ`、`EXAMPLE_SPI_MASTER_CLK_FREQ`、`EXAMPLE_SPI_SSEL` 等是 SPI1 相关的基本配置参数,需要根据具体硬件情况进行设置。
2. `TRANSFER_SIZE`、`TRANSFER_BAUDRATE` 定义了传输数据的大小和波特率,需要根据具体需求进行设置。
3. `EXAMPLE_SPI_MASTER_UserCallback` 是 SPI Master 传输完成后的回调函数,用户可以在此函数中进行一些后续处理。
4. 在 `main` 函数中首先对 SPI Master 进行了初始化,然后准备了传输的数据,接着对 DMA 进行了初始化,并设置了传输数据的相关参数,最后启动了 SPI Master 传输。
5. 通过 `while` 循环等待传输完成,并在传输完成后对数据进行校验。
希望以上代码和注释可以帮助你实现 SPI1 SPI DMA 连续传输数据的功能。
阅读全文