本帖最后由 regsofweb 于 2023-8-23 09:49 编辑
APS6404L-3SQR,64M bits(8M bytes, 2^23) and connected to OSPI2 byQSPI mode
CubeMX settings:
Ensure all gpios' speed are set as "very high"
Parameters follow datasheet. The OSPI clk source is 125M.
Enable interrupt
Set as "Device" in MPU
#define PS_OSPI hospi2 #define OCTOSPIx_BASE OCTOSPI2_BASE #define TOTAL_PS_SIZE (8*1024*1024) // PSRAM commands #define FAST_READ_QUAD 0xEB #define QUAD_WRITE 0x38 #define ENTER_QUAD_MODE 0x35 #define EXIT_QUAD_MODE 0xF5 // settings refer to datasheet #define FAST_READ_QUAD_DUMMY_CYCLES 6 #define WRITE_QUAD_DUMMY_CYCLES 0 #define ENTER_QUAD_DUMMY_CYCLES 0
void EnableMemMappedQuadMode(void) {
OSPI_RegularCmdTypeDef sCommand;
OSPI_MemoryMappedTypeDef sMemMappedCfg;
sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_4_LINES;
sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
sCommand.DataMode = HAL_OSPI_DATA_4_LINES;
sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
sCommand.Address = 0;
sCommand.NbData = 1;
/* Memory-mapped mode configuration for Quad Read mode 4-4-4*/
sCommand.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
sCommand.Instruction = FAST_READ_QUAD;
sCommand.DummyCycles = FAST_READ_QUAD_DUMMY_CYCLES;
if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
!= HAL_OK) {
Error_Handler();
}
/* Memory-mapped mode configuration for Quad Write mode 4-4-4*/
sCommand.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
sCommand.Instruction = QUAD_WRITE;
sCommand.DummyCycles = WRITE_QUAD_DUMMY_CYCLES;
sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
!= HAL_OK) {
Error_Handler();
}
/*Disable timeout counter for memory mapped mode*/
sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
/*Enable memory mapped mode*/
if (HAL_OSPI_MemoryMapped(&PS_OSPI, &sMemMappedCfg) != HAL_OK) {
Error_Handler();
}
}
void EnterQuadMode(void) {
OSPI_RegularCmdTypeDef sCommand;
sCommand.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
sCommand.Instruction = ENTER_QUAD_MODE;
sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
sCommand.AddressMode = HAL_OSPI_ADDRESS_NONE;
sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
sCommand.DataMode = HAL_OSPI_DATA_NONE;
sCommand.DummyCycles = ENTER_QUAD_DUMMY_CYCLES;
sCommand.DQSMode = HAL_OSPI_DQS_DISABLE;
sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
/*Enter QUAD mode*/
if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
!= HAL_OK) {
Error_Handler();
}
}
int PsRamTest() {
__IO uint32_t *mem_addr;
uint32_t wr = 0x55000000;
mem_addr = (__IO uint32_t*)OCTOSPIx_BASE;
for (int i = 0; i < TOTAL_PS_SIZE/4; i++) {
*mem_addr++ = wr++;
}
wr = 0x55000000;
int errcnt = 0;
mem_addr = (__IO uint32_t*)OCTOSPIx_BASE;
for (int i = 0; i < TOTAL_PS_SIZE/4; i++) {
if (*mem_addr++ != wr++) {
errcnt++;
}
} return errcnt;
}
|