ZHDA280 September   2026 MSPM33C321A

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2详细说明
    1. 2.1 QSPI 控制器概述
    2. 2.2 与外部 NOR 闪存的硬件连接
    3. 2.3 软件配置
      1. 2.3.1 驱动程序初始化和闪存识别
      2. 2.3.2 启用四路模式并对闪存进行编程
      3. 2.3.3 基于 DMA 的四路读取
    4. 2.4 测出的性能:具有 SPI 流的闪存读取
    5. 2.5 应用用例
      1. 2.5.1 光学模块
      2. 2.5.2 显示应用
      3. 2.5.3 音频存储及播放
  6. 3总结
  7. 4参考资料

基于 DMA 的四路读取

在本文档中,读取路径是流用例的性能关键方向。该示例使用快速读取命令所需的虚拟周期计数配置四路 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 通道上镜像了该结构。

该示例中的三个实践说明适用于在此驱动程序上构建的任何应用程序:

  • 当传输长度为偶数且 DMA 移动 16 位字时,选择 DL_QSPI_WORD_SIZE_16;回退到 8 位字大小以进行奇数字节计数
  • 在开始回调中设置 DMA_DONE 中断并在处理程序中禁用该中断,因此不能在传输之间触发过时中断
  • 流式传输完成后,QSPIFLASH_disableQuadMode() 和 QSPIFLASH_deinit() 会将闪存返回到 SPI 模式,从而使器件可通过标准工具和引导加载程序恢复

该示例根据编程的模式逐字验证回读缓冲区,并在 LaunchPad LED 上报告通过/失败,从而在应用程序用真实资产数据替换测试模式之前提供一个自检起点。