CubeIDE在STM32F746 Disco 开发板通过寄存器用 C 语言实现 QUADSPI。
MCU 运行在默认的 16MHz HSI 内部时钟,QUADSPI 以 1MHz 运行。
间接写入/间接读取工作正常,并返回预期的字节数。
我以前从未在内存映射模式下使用过它。这是我的代码:
uint32_t readout_firstword;
QSPI_readMemoryBytesQuad(0x00000000, 4, (uint8_t*) (&readout_firstword));
uint32_t readout_secondword;
QSPI_readMemoryBytesQuad(0x00000004, 4, (uint8_t*) (&readout_secondword));
/* Activate memory-mapped mode */
QSPI_enabledMemoryMappedMode();
uint32_t readout_firstwordMemoryMapped = *(uint32_t*) (0x90000000);
读取 readout_firstwordMemoryMapped 返回 0x000000fa,这仅仅是整个字(0xFACE8D00)中一个正确的字节。
奇怪的是,波形包含了第一个字、未读取的第二个字,随后还出现了几十个时钟周期,而且mcu选择信号始终没有释放。一直保持低电平。
这是在内存映射模式下寻址内存所产生的波形:
有一条指令,有一个地址(0x000000),还有虚拟字节是6个。接着是数据8个字节。然后时钟运行了一段时间,片选信号从未释放。而变量只有1个字节,其他7个字节被丢弃了。所以实际上我收到了8个字节,并且片选信号一直没有释放,而变量只有1个字节。而正确的应该是只读取4个字节并在那里释放片选信号。我将数据长度寄存器设置为3(即4个字节)。另外,我试了超时值0xFFFF和0x0000,但完全没有区别。 这些是在内存映射读取之后的QUADSPI寄存器: 以下是启用内存映射模式的方法: void QSPI_enabledMemoryMappedMode(void) { QUADSPI->CR &= ~(0x01 << 0); QUADSPI->DLR = 4U - 1U; QUADSPI->CR = (QUADSPI->CR & ~(0x1F << 8)) | (0x03 << 8); //Set FIFO threshold to 4 QUADSPI->CCR = (QSPI_FMODE_MEMORY_MAPPED << 26) | (QSPI_QUAD << 24) | (QSPI_QUAD << 8) | (QSPI_QUAD << 10) | (QSPI_ADSIZE_24 << 12) | (MT25QL128ABA1EW9_COMMAND_QUAD_IO_FAST_READ << 0); QUADSPI->LPTR = 0x0000; QUADSPI->CR |= (0x01 << 0); } 不知道哪里配置错了,为什么我的 QUADSPI 在请求 1 个 WORD 后 FIFO 中有 20 个字节,以及为什么有完整的 32 位字波形,但实际只收到了第一个字节的数据。
|