基于 LPC5516 之 DMA SPI 的基础应用

NXP LPC5516 是一款高性能 32 位 ARM Cortex-M33 内核微控制器,可以在工业和消费等多应用中使用。它拥有高达 256 KB 的片上闪存,高达 96 KB 的片上 SRAM 容量。此外还具有多个 SPI 接口,有助于实现高效的通信传输。
接下来我们将探讨一下 LPC5516 DMA SPI 的实例应用。我们将通过一个 SPI 用作 Master 的实例来说明如何在 LPC5516 上使用 DMA 来高效的传输数据。

一. SPI 时钟及引脚分配 

1. 选用 SPI7_FLEXCOMM7


对 P0_19、P0_20、P0_21 进行相应的初始化配置

    /* Enables the clock for the I/O controller.: Enable Clock. */
CLOCK_EnableClock(kCLOCK_Iocon);

const uint32_t port0_pin19_config = (/* Pin is configured as FC7_TXD_SCL_MISO_WS */
IOCON_PIO_FUNC7 |
/* Selects pull-up function */
IOCON_PIO_MODE_PULLUP |
/* Standard mode, output slew rate control is enabled */
IOCON_PIO_SLEW_STANDARD |
/* Input function is not inverted */
IOCON_PIO_INV_DI |
/* Enables digital function */
IOCON_PIO_DIGITAL_EN |
/* Open drain is disabled */
IOCON_PIO_OPENDRAIN_DI);
/* PORT0 PIN19 (coords: 90) is configured as FC7_TXD_SCL_MISO_WS */
IOCON_PinMuxSet(IOCON, 0U, 19U, port0_pin19_config);

const uint32_t port0_pin20_config = (/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */
IOCON_PIO_FUNC7 |
/* Selects pull-up function */
IOCON_PIO_MODE_PULLUP |
/* Standard mode, output slew rate control is enabled */
IOCON_PIO_SLEW_STANDARD |
/* Input function is not inverted */
IOCON_PIO_INV_DI |
/* Enables digital function */
IOCON_PIO_DIGITAL_EN |
/* Open drain is disabled */
IOCON_PIO_OPENDRAIN_DI);
/* PORT0 PIN20 (coords: 74) is configured as FC7_RXD_SDA_MOSI_DATA */
IOCON_PinMuxSet(IOCON, 0U, 20U, port0_pin20_config);

const uint32_t port0_pin21_config = (/* Pin is configured as FC7_SCK */
IOCON_PIO_FUNC7 |
/* Selects pull-up function */
IOCON_PIO_MODE_PULLUP |
/* Standard mode, output slew rate control is enabled */
IOCON_PIO_SLEW_STANDARD |
/* Input function is not inverted */
IOCON_PIO_INV_DI |
/* Enables digital function */
IOCON_PIO_DIGITAL_EN |
/* Open drain is disabled */
IOCON_PIO_OPENDRAIN_DI);
/* PORT0 PIN21 (coords: 76) is configured as FC7_SCK */
IOCON_PinMuxSet(IOCON, 0U, 21U, port0_pin21_config);​
2. SPI 时钟分配

将 FLEXCOMM7 挂载在主频上
CLOCK_AttachClk(kMAIN_CLK_to_FLEXCOMM7);​

二. SPI 初始化

这里可以根据待发送数据的类型来对 SPI 的波特率、传输的数据位宽、高位\低位优先等等参数进行配置

static void EXAMPLE_MasterInit(void)
{
/* SPI init */
uint32_t srcClock_Hz = 0U;
spi_master_config_t masterConfig;
srcClock_Hz = EXAMPLE_SPI_MASTER_CLK_FREQ;

SPI_MasterGetDefaultConfig(&masterConfig);

masterConfig.baudRate_Bps = 500000; //500kHZ
masterConfig.dataWidth = kSPI_Data8Bits; //8bit

masterConfig.sselNum = (spi_ssel_t)EXAMPLE_SPI_SSEL;
masterConfig.sselPol = (spi_spol_t)EXAMPLE_MASTER_SPI_SPOL;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, srcClock_Hz);
}​

三. DMA 初始化

LPC5516 有两个 DMA 控制器 DMA0 和 DMA1,本例使用 DMA0,初始化完成后同时需要打开 DMA 通道、创建通道句柄

static void EXAMPLE_MasterDMASetup(void)
{
/* DMA init */
DMA_Init(DMA0);
/* Configure the DMA channel,priority and handle. */
DMA_EnableChannel(DMA0, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_EnableChannel(DMA0, EXAMPLE_SPI_MASTER_RX_CHANNEL);
DMA_SetChannelPriority(DMA0, EXAMPLE_SPI_MASTER_TX_CHANNEL, kDMA_ChannelPriority3);
DMA_SetChannelPriority(DMA0, EXAMPLE_SPI_MASTER_RX_CHANNEL, kDMA_ChannelPriority2);
DMA_CreateHandle(&masterTxHandle, DMA0, EXAMPLE_SPI_MASTER_TX_CHANNEL);
DMA_CreateHandle(&masterRxHandle, DMA0, EXAMPLE_SPI_MASTER_RX_CHANNEL);
}​

四. DMA 数据传输

将待发送数据存放到 masterTxData[] 中缓存,然后创建 DMA 回调句柄,将缓存数据给到 masterXfer.txData,数据会通过SPI_MasterTransferDMA() 函数完成传输。完成数据发送后,记得通过调用 DMA_Deinit(DMA0) 将 DMA 通道关闭,以及SPI_Deinit(SPI7) 将对应的 SPI 通道关闭。

static void EXAMPLE_MasterStartDMATransfer(void)
{
spi_transfer_t masterXfer;
uint32_t i = 0U;

/* Set up the transfer data */
for (i = 0U; i < 64; i++)
{
/* SPI is configured for 8 bits transfer - set only lower 8 bits of buffers */
masterTxData[i] = i % 256U;
masterRxData[i] = 0U;
}

/* Set up handle for spi master */
SPI_MasterTransferCreateHandleDMA(EXAMPLE_SPI_MASTER, &masterHandle, SPI_MasterUserCallback, NULL, &masterTxHandle,
&masterRxHandle);

/* Start master transfer */
masterXfer.txData = (uint8_t *)&masterTxData;
masterXfer.rxData = (uint8_t *)&masterRxData;
masterXfer.dataSize = TRANSFER_SIZE * sizeof(masterTxData[0]);
masterXfer.configFlags = kSPI_FrameAssert;

if (kStatus_Success != SPI_MasterTransferDMA(EXAMPLE_SPI_MASTER, &masterHandle, &masterXfer))
{

}
}

五. 检验数据

通过逻辑分析仪抓取 SCLK 和 MOSI 线,符合我们设定的 SPI 波特率以及预发送的数据包

通过使用 LPC5516 DMA SPI,我们可以实现快速而高效的数据传输,同时减少 CPU 时间的开销。以上就是对于 LPC5516DMA SPI 的实例应用介绍,欢迎大家对相关内容来进行更多的讨论,谢谢!

参考资料:
[1] LPC551X_UserManual.pdf
[2] LPC55S1x_LPC551x_DataSheet.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论