ZHDA280 September 2026 MSPM33C321A
在本文档中,读取路径是流用例的性能关键方向。该示例使用快速读取命令所需的虚拟周期计数配置四路 I/O 读取,选择 16 位 FIFO 字长以将 DMA 事务数量减半,并将传输交给 QSPIFLASH_readDMA():
commandConfig.instruction = QUAD_IO_READ_CMD;
commandConfig.addressSize = QSPIFLASH_ADDRESS_SIZE_3BYTE;
commandConfig.address = ADDRESS;
commandConfig.dummyCycles = DUMMY_CYCLES_QUAD_IO_READ;
commandConfig.transferMode = QSPIFLASH_TRANSFER_MODE_QPI;
dmaConfig.startDMA = startDMARxTransfer;
dmaConfig.dmaCompleteFlag = &gDMARXDataTransferred;
DL_QSPI_setWordSize(QSPI, DL_QSPI_WORD_SIZE_16);
状态 = QSPIFLASH_readDMA(&handle、readback_data、sizeof(readback_data)、&commandConfig、&dmaConfig);
该驱动程序不拥有 DMA 通道;相反,该应用程序提供启动回调,因此相同的代码可用于任何通道分配。回调将通道指向 QSPI RX 数据寄存器,设置以 16 位字表示的传输大小,并启用通道:
void startDMARxTransfer(const void *destAddr, uint32_t sizeBytes)
{
*(dmaConfig.dmaCompleteFlag) = false;
DL_QSPI_enableInterrupt(QSPI_0_INST, DL_QSPI_INTERRUPT_DMA_DONE_RX);
DL_DMA_setSrcAddr(DMA0, DMA0_CH0_CHAN_ID, (uint32_t)(&(QSPI->RXDATA)));
DL_DMA_setDestAddr(DMA0, DMA0_CH0_CHAN_ID, (uint32_t) destAddr);
DL_DMA_setTransferSize(DMA0, DMA0_CH0_CHAN_ID, sizeBytes / sizeof(uint16_t));
DL_DMA_enableChannel(DMA0, DMA0_CH0_CHAN_ID);
}
完成时由 QSPI DMA_DONE_RX 中断发出信号(QSPI0、中断线 47)。处理程序会设置驱动程序轮询的完成标志并在下一次传输前禁用中断,这种模式将中断服务例程保持为几条指令。写入方向在针对 QSPI TX 数据寄存器的第二个 DMA 通道上镜像了该结构。
该示例中的三个实践说明适用于在此驱动程序上构建的任何应用程序:
该示例根据编程的模式逐字验证回读缓冲区,并在 LaunchPad LED 上报告通过/失败,从而在应用程序用真实资产数据替换测试模式之前提供一个自检起点。