|
MCU:STM32H743IIT6
开发环境:STM32CUBEMX + Keil
操作步骤:
1、读3个状态寄存器
2、写使能(1cmd-1addr-1data cmd:0x06)
3、3个状态寄存器
4、页擦除,擦除地址0x00000000(1cmd-1addr-1data cmd:0x20),delay 100ms
5、while(1)里面5ms读一次地址0x00000000的数据(length = 128)(1cmd-1addr-4data cmd:0x6B)
问题描述:
在步骤1读出来的寄存器(reg1:SRP = 1,其他为0 reg2:SUS = 1,其他为0),在步骤2写使能过后,步骤3再去读状态寄存器没有任何变化,在步骤4擦除后,读出来的数据并没有被擦除
疑问点:
1、步骤3的寄存器为什么没有变化?WEL寄存器不应该要为1吗
2、关于W25Q64接线的问题,WP(写保护)引脚是低电平有效,但是在开发板上并没有硬件上拉,而是直连MCU的IO口,作为QSPI的IO2使用,那岂不是一直处于硬件写保护吗,个人感觉这里出问题的可能性最大,如果真是这个问题,有没有什么解决办法吗?
关键代码:
void W25Q64_EnableWrite(void)/* 1cmd-1addr-1data */
{
QSPI_AutoPollingTypeDef st_config = {0u};
/* 基本配置 */
st_cmdQSPI.InstructionMode = QSPI_INSTRUCTION_1_LINE; /* 1 线方式发送指令 */
st_cmdQSPI.AddressSize = QSPI_ADDRESS_24_BITS; /* 24 位地址 */
st_cmdQSPI.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
st_cmdQSPI.DdrMode = QSPI_DDR_MODE_DISABLE; /* W25Q256JV 不支持 DDR */
st_cmdQSPI.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR 模式,数据输出延迟 */
st_cmdQSPI.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; /* 每次传输要发指令 */
/* 读取数据 */
st_cmdQSPI.Instruction = W25Q64_CMD_WRITE_ENABLE;
st_cmdQSPI.DummyCycles = 0u; /* 空周期 */
st_cmdQSPI.AddressMode = QSPI_ADDRESS_NONE; /* 没有地址 */
st_cmdQSPI.DataMode = QSPI_DATA_NONE; /* 没有数据 */
st_cmdQSPI.NbData = 0u; /* */
st_cmdQSPI.Address = 0u; /* 读取数据的起始地址 */
if (HAL_QSPI_Command(&hqspi, &st_cmdQSPI, 10000) != HAL_OK)
{
}
}
void W25Q64_EraseOneSector(uint32_t u32_addr)/* 1cmd-1addr-1data */
{
W25Q64_ReadStatusReg();
W25Q64_EnableWrite();
W25Q64_ReadStatusReg();
/* 基本配置 */
st_cmdQSPI.InstructionMode = QSPI_INSTRUCTION_1_LINE; /* 1 线方式发送指令 */
st_cmdQSPI.AddressSize = QSPI_ADDRESS_24_BITS; /* 24 位地址 */
st_cmdQSPI.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
st_cmdQSPI.DdrMode = QSPI_DDR_MODE_DISABLE; /* W25Q256JV 不支持 DDR */
st_cmdQSPI.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR 模式,数据输出延迟 */
st_cmdQSPI.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; /* 每次传输要发指令 */
/* 读取数据 */
st_cmdQSPI.Instruction = W25Q64_CMD_ERASE_SECTOR;
st_cmdQSPI.DummyCycles = 6u; /* 空周期 */
st_cmdQSPI.AddressMode = QSPI_ADDRESS_1_LINE; /* 1 线地址 */
st_cmdQSPI.DataMode = QSPI_DATA_NONE; /* 没有数据 */
st_cmdQSPI.NbData = 0u; /* 读取的数据大小 */
st_cmdQSPI.Address = u32_addr; /* 擦除数据的起始地址 */
if (HAL_QSPI_Command(&hqspi, &st_cmdQSPI, 10000) != HAL_OK)
{
bool_QSPI_SendFail = 1u;
}
}
void W25Q64_ReadBuffer(uint8_t *pBuff,uint32_t u32_readAddr,uint16_t u16_length)/* 1 1 4 */
{
/* 基本配置 */
st_cmdQSPI.InstructionMode = QSPI_INSTRUCTION_1_LINE; /* 1 线方式发送指令 */
st_cmdQSPI.AddressSize = QSPI_ADDRESS_24_BITS; /* 24 位地址 */
st_cmdQSPI.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
st_cmdQSPI.DdrMode = QSPI_DDR_MODE_DISABLE; /* W25Q256JV 不支持 DDR */
st_cmdQSPI.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR 模式,数据输出延迟 */
st_cmdQSPI.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; /* 每次传输要发指令 */
/* 读取数据 */
st_cmdQSPI.Instruction = W25Q64_CMD_READ_BY_ADDRESS;
st_cmdQSPI.DummyCycles = 6u; /* 空周期 */
st_cmdQSPI.AddressMode = QSPI_ADDRESS_1_LINE; /* 1 线地址 */
st_cmdQSPI.DataMode = QSPI_DATA_4_LINES; /* 4 线数据 */
st_cmdQSPI.NbData = u16_length; /* 读取的数据大小 */
st_cmdQSPI.Address = u32_readAddr; /* 读取数据的起始地址 */
if (HAL_QSPI_Command(&hqspi, &st_cmdQSPI, 10000) != HAL_OK)
{
bool_QSPI_SendFail = 1u;
}
/* 读取 */
if (HAL_QSPI_Receive(&hqspi, pBuff, 10000) != HAL_OK)
{
bool_QSPI_SendFail = 1u;
}
}
|
|