This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM5726:DMA 触发 QSPI SFI 存储器映射读取的小帧长度

Guru**** 2551370 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1026242/am5726-small-frame-length-for-dma-triggered-qspi-sfi-memory-mapped-read

器件型号:AM5726

我们使用 QSPI 外设的 SFI/MEMORY 映射模式从裸机 AM572x 应用中的外部闪存进行读取。 我们已在 DSP 上设置 EDMA、以便从 QSPI 的存储器映射地址读取数据、并将该数据写入本地存储器的缓冲区。 此设置工作正常、但我们没有获得所需的帧长度。 例如,当我们将 EDMA 设置为传输4096个字时,逻辑分析仪上看到的帧长度仅为8。 根据 TRM、帧长度可高达4096个字。 为什么 SFI 转换器将帧长度设置为如此低、我们如何更改它?

我们尝试使用 memcpy 而不是 EDMA、帧大小会降至1。

我们还尝试更改 EDMA 设置的 A 和 B 尺寸、但帧大小保持为8。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [引用 userid="495228" URL"~/support/processors-group/processors/f/processors-forum/1026242/am5726-small-frame-length-for-dma-triggered-qspi-sfi-memory-mapped-read "]根据 TRM,帧长度可高达4096个字

    是的、根据 TRM、"在单个 SPI 读取或写入操作中最多可以传输4096个128位字"、但根据 SDK 文档注释 (上面的示例)、"当前 IP V1驱动器(适用于 AM3/4/5器件)支持8/16/32位字长"。  

    本主题中所述、"为了更好地理解.frameLength、  pdk/packages/ti/drv/spi/test/QSPI_flash/src/Flash_S25FL/S25FL.c 中的 SF25FL_bufferRead ()函 数是一个很好的查看示例。 对于.wordLength、SDK 文档中的"OpenSPI"部分提供了有用的说明。

    此外、您还可以看到以下供参考的线程:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、但这并不能解决我们的问题。 上面引用的大多数材料在使用配置模式时仅解决帧长度问题。 此外、上面的一些材料应用于 SDK、我们在裸机应用中未使用该 SDK (我们直接访问从基址0x4B30 0000开始的 QSPI 寄存器)。

    我们以前在系统中使用过“配置模式”,通过设置相应的 QSPI 命令寄存器,我们可以获得128位的字长和4096的帧长度。 但是,配置模式对于我们的应用来说太慢,因为 TRM 说:“在其通用 SPI 使用模式中,一个字最多可以定义128位,多个字可以在单次访问期间传输。 对于每个字,设备启动程序必须读取或写入新数据,然后告诉 QSPI 继续当前操作。” 这会导致大型读取操作太慢。 因此、我们现在尝试使用存储器映射/SFI 模式、希望能够更快地完成大型读取操作。 在该模式下、读取操作帧长度似乎由 SFI 转换器控制。

    在当前程序中、使用存储器映射模式、我们将设置一个 DMA 以从0x5C00 0000开始的存储器映射端口读取4096个128位字。 通过使用逻辑分析仪、我们可以看到 QSPI 外设每8个字向闪存发送一条四模式读取命令(换句话说、每个四模式读取命令总共读取1024位、然后芯片选择被禁用)。 我们如何使 SFI 转换器在最大4096字帧(即、一个四模读取命令总共128 x 4096 = 524288位)的情况下仅向闪存发送一个四模读取命令?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "读取操作帧长度似乎由 SFI 转换器控制。"

    读取操作的长度仍应由 QSPI_SPI_CMD_REG 控制。  WLEN = 0x7F 且 FLEN = 0xFFF 吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们已经在 执行 DMA 传输之前立即测试了将字(0x7F)和帧(0xFFF)长度写入 QSPI_SPI_CMD_REG、但似乎没有使用我们设置的值。 执行 DMA 传输后该寄存器的值为0x00FF0008。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些寄存器值对应于32位 x 9个字。  您之前观察到8个字的128位、对吧?  您是否仍然看到 QSPI_SPI_CMD_REG 设置为 0x00FF0008?  在您之前的测试中、QSPI_SPI_CMD_REG 的值是多少?  仍为0x00FF0008?  首先、我们应验证 QSPI 模块是否按您预期的方式工作、然后找出这些值发生变化的原因。  此外、关于 QSPI_SPI_CMD_REG:


    "该寄存器设置 SPI 命令。 只有当 QSPI 模块不忙时、才能写入该寄存器、这是由 QSPI_SPI_STATUS_REG[0]忙位标识的。"

    是否在尝试写入该寄存器之前轮询 BUSY 位?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    每次芯片选择变为低电平(有效)时、我们将看到8个128位的数据字(32个时钟、因为我们使用四路模式)和48个时钟/位的命令字。 因此、每次芯片选择激活时、我们总共看到9个字(8个数据和1个命令)。  我们要在 SPI/DMA 传输前将命令寄存器设置为0x00F80FFF、并在 DMA 传输后将其读取为0x00FF0008。

    之前、当我们不使用存储器映射模式、并且得到4096个字(128位)(32个时钟、因为我们使用四路模式)和48个时钟/位的命令时、命令寄存器被设置为0x00FF0FFF。

    只要我们在 CMD_REG 中设置一个值、就会等待 BUSY 位先变为低电平(空闲)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果在 DMA 传输之前将命令寄存器设置为0x00F80FFF、则可能会出现这种问题。  这会将位16:18保留为0b000、这是一个保留值。  尝试 像以前一样将其设置为0x00FF0FFF。  此外、您能否在 DMA 访问前后以及 CPU 访问前后转储所有 QSPI 寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我们在触发 QDMA 传输之前将命令寄存器设置为0x00FF0FFF 时、QSPI 模块向闪存发送一个读取命令(非存储器映射模式、帧长度4096)。这种行为是有道理的、因为、正如 TRM 所说的、 "向 QSPI_SPI_CMD_REG[18:16] CMD 位字段写入有效值会立即将 QSPI_SPI_STATUS_REG[0]忙位设置为0x1,激活相应的 qspi1_cs[n](n = 0至3)并启动 SPI 数据事务。" 然后 QDMA 还发送了一个读取命令(存储器映射模式、但帧长度为9个字)。 但是、这不是我们需要的行为、因为存储器映射模式命令仍在请求9个字的帧长度。

    我们将0x00F80FFF 写入命令寄存器、以防止外设触发非存储器映射读取。 但是、从下面的屏幕截图中可以看到、在使用 QDMA 之前设置该寄存器不会产生任何效果、因为 SFI 转换器似乎可以控制命令寄存器。

    QDMA 传输前:

    QDMA 传输后:

    在非存储器映射 CPU 读取之前:

    在非存储器映射 CPU 读取之后:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    比较 QDMA 与非存储器映射读取、配置寄存器是相同的、"QSPI_SPI_SETUP0_REG"除外。   

    1)在地址字节字段中、存储器映射的值为3 (4字节)、非存储器映射的值为2 (3字节)。  在存储器映射模式下、器件是否已重新配置为预期4个地址字节?  如果不是、则 QSPI 存储器和 SOC 可能同时驱动 D0。

    2) 2)我认为第二对映像来自非存储器映射(IE 非 SFI)模式。  为什么 SFI 开关设置为1?  请参见寄存器转储中的偏移量0x64、以及 TRM 中的寄存器 QSPI_SPI_SWITCH_REG[0]。

    看起来确实会导致帧长度发生变化。  QDMA 不应该这么做。  您的软件中是否有任何可能修改该寄存器的内容?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1) QSPI_SPI_SETUP0_REG 仅适用于存储器映射(SFI)模式、根据 TRM、默认地址字节数为3。 当我们不使用内存映射模式时,我们将手动将“4个地址字节”操作码传输到外部闪存,然后是(4个)地址字节和虚拟字节。 在所有情况下,我们都要将 QSPI 存储器器件置于“4地址字节”模式。

    2) 2)正确、第二组是非 SFI 模式。 我们的设置函数之一无意中设置了该位、但无论怎样、我们似乎都能够正常使用 QSPI (非 SFI)。

    我们的代码中没有任何可能导致帧长度变化的内容。 我们正在使用测试程序、在该程序中、我们将设置命令寄存器中的字长和帧长度、等待 QSPI 空闲、然后立即配置和触发 QDMA。 之间没有其他代码在运行、并且我们没有启用任何中断。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lauren、Zack、  

    你们是否曾尝试将 SFI 模式与直接 CPU 读取一同使用、而不是使用 EDMA? 目标是测试 FLEN 是否被比较覆盖。  

    我可以看到在非存储器映射模式下进行的测试、FLEN 没有改变。 但这不使用 SFI 模式。  

    此致

    Jian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jian:

    我们使用 memcpy 通过 SFI 模式从存储器映射地址读取。  在 memcpy 返回后、QSPI_SPI_CMD_REG 会发生更改。

    请注意、我们使用的是 DSP、而不是 ARM 内核。

    谢谢、
    劳伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lauren、  

    您能否确认您使用的是 ACNT、BCNT、CCNT?

    谢谢

    Jian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ACNT = 16384
    BCNT = 4
    CCNT = 1

    在我们看来、这可能是 QSPI 外设问题、而不是 DMA 问题、因为 DMA 和 memcpy 都会更改 QSPI_SPI_CMD_REG 中的设置。