我在定制板上使用
STM32H745,带有 Micron 闪存 (MT25QU512ABB)
电路板经过测试,我能够通过 QSPI 管理 NOR 内存。
我试图更改非易失性配置寄存器来设置两件事:
- 命令进入 4 字节地址模式期间的地址字节数
- 启用 Quad I/O 协议
这是我使用的代码:
- uint8_t QSPI_Set_Nonvolatile_Reg_Config(void) {
- QSPI_CommandTypeDef sCommand;
- uint8_t test_buffer[4] = { 0 };
- /*read configuration register*/
- sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
- sCommand.Instruction = 0xB5; //READ NONVOLATILE CONFIGURATION REGISTER
- sCommand.AddressMode = QSPI_ADDRESS_NONE;
- sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
- sCommand.DataMode = QSPI_DATA_1_LINE;
- sCommand.DummyCycles = 0;
- sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
- sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
- sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
- sCommand.NbData = 2;
- if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
- != HAL_OK) {
- return HAL_ERROR;
- }
- if (HAL_QSPI_Receive(&hqspi, test_buffer, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
- return HAL_ERROR;
- }
- sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
- sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
- sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
- sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
- sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
- sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
- sCommand.Instruction = 0xB1; //WRITE NONVOLATILE CONFIGURATION REGISTER
- sCommand.AddressMode = QSPI_ADDRESS_NONE;
- sCommand.DataMode = QSPI_DATA_1_LINE;
- sCommand.DummyCycles = 0;
- sCommand.NbData = 2;
- //modify buffer to enable quad mode
- //0b1111 1111 1111 0110
- //MODIFY_REG(test_buffer[1], 0x9, 0x0);
- test_buffer[0] = 0xFF;
- test_buffer[1] = 0xF6;
- // On the first try, i didnt use QSPI__WriteEnable(), that maybe my main error
- // if (QSPI_WriteEnable() != HAL_OK) {
- // return HAL_ERROR;
- // }
- if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE)
- != HAL_OK) {
- return HAL_ERROR;
- }
- if (HAL_QSPI_Transmit(&hqspi, test_buffer, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
- Error_Handler();
- return HAL_ERROR;
- }
- /*read configuration register*/
- sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE;
- sCommand.Instruction = 0xB5; //READ NONVOLATILE CONFIGURATION REGISTER
- sCommand.AddressMode = QSPI_ADDRESS_NONE;
- sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
- sCommand.DataMode = QSPI_DATA_1_LINE;
- sCommand.DummyCycles = 0;
- sCommand.DdrMode = QSPI_DDR_MODE_DISABLE;
- sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
- sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
- sCommand.NbData = 2;
- if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
- return HAL_ERROR;
- }
- if (HAL_QSPI_Receive(&hqspi, test_buffer, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
- return HAL_ERROR;
- }
- return HAL_OK;
- }
第一次使用它时,我没有使用 QSPI_WriteEnable 命令。
然而,在我运行 QSPI_Set_Nonvolatile_Reg_Config() 之后,一切都停止了。
在此代码中,AutoPolling 开始返回错误,因为超时(它没有获得 StatusMatch 标志),因此我的代码不再继续。
我在这个板上运行的不同代码,我让这个内存按预期工作,在更改这个寄存器后它也停止工作,并且读取内存给出了一些随机值(我在这个混乱中没有发现任何意义)。擦除和写入也不再有效。
问题是,当我使用 QSPI_Set_Nonvolatile_Reg_Config() 只是为了读取这个寄存器时,它是 0xFFFF,就像我没有改变任何东西一样(我需要将它设置为 0xFFF6)。
多次尝试更改此寄存器,后来添加了 WriteEnable 命令,但无济于事。它始终读取 0xFFFF,即使在假定的更改之后也是如此。
所以,看起来什么都没有改变,但没有任何作用了。
有什么方法可以将内存重置为其结构设置,或者我可能会永久损坏它?
0