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.
我正在使用 AM2431尝试使 ospi 外设与 PSRAM 通信。 为了满足其中一个 PSRAM 时序要求、我需要能够控制 DAC 读取期间的数据量。 存取的接缝数据量是32字节的倍数、但我无法确定它如何决定该倍数的大小。
此外、
我在 TRM 中发现并在逻辑分析仪上看到、在使总线信号时序正确所需的 ospi 输入时钟频率与最小分频值之间存在关系。 对于输入时钟频率和分频值的有效组合、几乎没有什么指导、您能否提供有关有效配置的更多信息?
谢谢、
|Nick
您好、Nick、
[引用 userid="522882" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168224/am2431-ospi-direct-access-length "]访问的接缝数据量是32字节的倍数,但我无法确定它如何决定多个的长度。AM243x 具有32位总线、但传输的数据量不取决于设备上的 MMR 值、如果是您所要求的。 在 OSPI 通信中、传输的数据量通常由您的外部存储器支持的命令类型来控制。 我建议您查看 PSRAM 的数据表、具体了解它在运行期间支持的多读/写命令。 您很可能会找到允许您一次访问整个页面及其较小块的函数
至于第二个问题、TRM 目前是时钟配置选项的参考文档。 您可以通过不同的方式来实现、这完全取决于您的用例。
希望这对您有所帮助
最棒的
Daniel
Daniel:
在过去几周里、我已经非常熟悉 PSRAM (APS6404L-SQRH)和 ospi 接口。 使用 Stig 或间接访问时、可以使用要传输的数据量对 ospi 寄存器进行编程。 在直接访问期间、我可以想象、访问的数据量与高速缓存、缓冲区、总线宽度和一些其他因素有关。 问题是、PSRAM 具有4us 的最大 CE 活动时间、使用1GHz 作为输入时钟、28作为分频器(我必须通过实验找到的值)可提供142个时钟、该时钟少于带有命令、地址和等待状态的64字节传输。 我如何保证在使用直接访问时、我永远不会创建耗时太长的传输?
谢谢、
|Nick
您好、Nick、
[引用 userid="522882" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168224/am2431-ospi-direct-access-length/4398190 #4398190"]在直接访问期间,我可以想象,访问的数据量与高速缓存、缓冲区、总线宽度和一些其他因素有关[/quot]DAC 模式只是到 OSPI 区域的存储器映射访问、因此 CPU 或 DMA 确实访问了那个存储器地址、它直接输出到闪存。 在 DAC 模式下、OSPI 访问的数据量取决于 CPU 或 DMA 请求的数据量。 如果您将 R5配置为将 OSPI 作为普通不可高速缓冲存储器、则读取的数据量取决于代码(16位读取将读取2个字节、32位读取4个字节)。 DMA 受传输配置中的 ICNT0和 ICNT1的影响。
如何使用 OSPI 控制器访问 RAM? 您使用的是任何 R5内核还是 DMA?
Daniel
Daniel:
使用 R5内核和 ospi、目前我已将 ospi 设置为1GHz 输入时钟、32分频值以使 SPI 时钟、八进制模式、DTR、SPI 模式0、传统模式禁用、 4个地址字节(它是一个128MB PSRAM、尝试与之通信)、它使用双操作码、以便启用、上下命令寄存器都设置了相同的命令、启用 DAC 模式、启用 DDR 命令、设置器件大小、 读取和写入虚拟时钟被置位、DEV 延迟被置位、并且由于 WEL 不在 PSRAM 上使用、所以 WEL 被禁用。 我对存储器映射区域进行了缓存设置、因为我发现使用 SysConfig 的 MPU 设置中"区域属性:缓存"之外的任何其他设置会导致尝试执行 ospi 访问时崩溃。 由于勘误表的原因、我不使用 DMA、并尝试避开 PHY。 我发现、在 PSRAM 不在器件限制下运行的情况下、PHY 调优也不会收敛。 通过这种设置、我的 DAC 被映射到地址0x60000000、我使用复制如下的环路测试来访问它:
#define DATA_AMOUNT 32u #define TEST_LEN (262144u-1u) uint32_t fail = 0u; void testPsramForever(void) { //setup trigger pin setPinGpioDirection(TP128, GPIO_OUTPUT); setPinLogicHigh(TP128); dumpOspiRegs(); uint32_t pass = 0u; fail = 0u; while(received2 != 'c') { runTest() ? pass++ : fail++; //waitMicroseconds(1000000u); printString("\n\rPSRAM SINGLE TEST DONE"); printString("\n\rPSRAM PASS: %d", pass); printString("\n\rPSRAM FAIL: %d\n\r", fail); } } static Boolean runTest(void) { uint8_t read[DATA_AMOUNT] __attribute__((aligned(128U))); for(uint32_t o = 0u; o < TEST_LEN; ++o) { //write while((CSL_REG32_RD(0x0FC40000u) & 0x80000000) == 0u){} uint8_t* psram = (uint8_t*)(0x60000000u + (o * DATA_AMOUNT)); for(uint32_t i = 0u; i < DATA_AMOUNT; ++i) { //psram[i] = data[i]; psram[i] = TEST_DATA[i]; } for(uint32_t i = 0u; i < DATA_AMOUNT; ++i) { read[i] = 0u; } //read while((CSL_REG32_RD(0x0FC40000u) & 0x80000000) == 0u){} psram = (uint8_t*)(0x60000000u + (o * DATA_AMOUNT)); //CacheP_inv(read, DATA_AMOUNT, CacheP_TYPE_ALL); for(uint32_t i = 0u; i < DATA_AMOUNT; ++i) { read[i] = psram[i]; } for(uint32_t i = 0u; i < DATA_AMOUNT; ++i) { if(read[i] != TEST_DATA[i]) { setPinLogicLow(TP128); waitMicroseconds(1000000u); printString("\n\rPSRAM FAIL"); printString("\n\raddress: %x", psram + i); printString("\n\rbytes = %d\n\r", (o * DATA_AMOUNT) + (i)); printString("TEST_DATA: %d, i = %d", read[i], i); printString("\n\rread: %x,\n\rgot: %x", TEST_DATA[i], read[i]); setPinLogicHigh(TP128); o--; fail++; CacheP_inv(read, DATA_AMOUNT, CacheP_TYPE_ALL); break; //return false; } } //printString("\ro = %d ", o); } return true; }
在某些情况下、ospi 将尊重页面和块设置、但我发现、更改 for 循环大小是触发的 ospi 访问的最大决定因素。 如果我将 for 循环设置为16或32字节、页大小为32字节、我将获得32字节的倍数的 ospi 事务、但我需要保证这些访问一次不会大于64字节、不包括开销、 以确保我不违反 PSRAM 的4us 最大 CE 有效时序要求。
谢谢、
|Nick
您好、Nick、
[引用 userid="522882" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168224/am2431-ospi-direct-access-length/4402290 #4402290"]我对存储器映射区域进行了缓存设置,因为我发现在 SysConfig 的 MPU 设置中使用除“区域属性:缓存”之外的任何其他设置会导致在尝试搜索时崩溃[/quot]当 R5在 OSPI 设置为可缓存存储器区域的情况下执行读取操作时、它将从闪存读取32字节(缓存大小)。 为了满足您的 PSRAM 时序要求、您需要避免背靠背发生超过2次的高速缓存取。
每个缓存未命中都会导致对 OSPI 的高速缓存取、这是观察到的32字节访问。 多个缺失将导致多个缓存取。
[引用 userid="522882" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168224/am2431-ospi-direct-access-length/4402290 #4402290"]我需要保证这些访问一次不会超过64字节(不包括开销),以确保我不违反 PSRAM 的4us 最大 CE 活动时序要求。考虑到前面的考虑因素:您首先需要确定性能需求、主要是了解您可以使用的最慢吞吐量、然后根据您的需求在 for 循环中开始添加内存障碍、以实现您的目标。
另一种选择是在读取32个字节后、甚至在首次读取32字节边界后、设置一个较小的延迟。
OSPI DAC 的工作方式是与 SOC 无关的 ARM 概念。 要更详细地了解它的工作原理、您可以参阅《ARM 架构参考手册》。 下面我将提供链接:
ARM 架构参考手册: ARM 架构参考手册 ARMv7-A 和 ARMv7-R 版本
此外、下面是指向存储器屏障部分的链接、其中包含有关这些部分的说明: ARM 架构参考手册 ARMv7-A 和 ARMv7-R 版本
如果您仍有相同的问题或有其他问题、请仔细检查并再次联系
最棒的
Daniel
Daniel:
感谢您提供信息。 我之前以不同的方式使用过缓存、可以在上面摘录中的注释掉的缓存无效调用中看到部分残留。 我尝试在回路存储器映射访问之后设置数据障碍、但没有看到改进、可能我做错了、并将再次尝试。
我的同事对 OSPI_DEV_SIZE CONFIG_REG 寄存器很好奇。 他希望页面大小会限制读取访问、但考虑到它的闪存没有读取限制。 页面大小和块大小与写入和擦除访问相关。 为什么寄存器对读取长度没有影响?
您好、Nick、
[引用 userid="522882" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1168224/am2431-ospi-direct-access-length/4405904 #4405904"]页面大小和块大小与写入和擦除访问有关[/quot]是的、正确。 这将对读取访问大小没有影响。
如果您对存储器映射访问期间的数据限制有任何疑问、请随时联系我们。 我一定会与我们团队中的 R5FSS 专家交流。
最棒的
Daniel