|
发表于 2019-4-20 09:34:46
|
显示全部楼层
你好,你是如何搞定的啊 ??
我目前使用 qpi 模式,貌似 使用 QSPI_AutoPollingMemReady 这个函数无效,如果使用 1线模式通讯就可以,
请问下是我 的 芯片不行还是怎么回事啊 ??
如果使用 4线 qpi 模式的话,只要使用 QSPI_AutoPollingMemReady 这个函数的地方,全部替换为 HAL_Delay 来代替就完全可以,读写也都完全正常
// 1线模式
static QSPI_StaticTypeDef QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi)
{
uint32_t TimeOut;
QSPI_CommandTypeDef sCommand = {0};
QSPI_AutoPollingTypeDef sConfig = {0};
/* 基本配置 */
sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE; /* 1线方式发送指令 */
sCommand.AddressSize = QSPI_ADDRESS_32_BITS; /* 32位地址 */
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE; /* W25Q256JV不支持DDR */
sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR模式,数据输出延迟 */
sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; /* 每次传输都发指令 */
/* 读取状态*/
sCommand.Instruction = READ_STATUS_REG_CMD; /* 读取状态命令 */
sCommand.AddressMode = QSPI_ADDRESS_NONE; /* 无需地址 */
sCommand.DataMode = QSPI_DATA_1_LINE; /* 1线数据 */
sCommand.DummyCycles = 0; /* 无需空周期 */
/* 屏蔽位设置的bit0,匹配位等待bit0为0,即不断查询状态寄存器bit0,等待其为0 */
sConfig.Mask = 0x01;
sConfig.Match = 0x00;
sConfig.MatchMode = QSPI_MATCH_MODE_AND;
sConfig.StatusBytesSize = 1;
sConfig.Interval = 0x10;
sConfig.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
StatusMatch = 0;
TimeOut = 0;
if (HAL_QSPI_AutoPolling_IT(&QSPI_Handle, &sCommand, &sConfig) != HAL_OK)
{
return QSPI_ERROR;
}
while(StatusMatch == 0) // 等待完成匹配 StatusMatch 标志 置1
{
TimeOut ++;
if(TimeOut > (uint32_t)(0xFFFFFFFE))
{
return QSPI_OUT_TIME;
}
}
return QSPI_OK;
}
// *********************************************************************
// 4线模式
static QSPI_StaticTypeDef QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi)
{
uint32_t TimeOut;
QSPI_CommandTypeDef sCommand = {0};
QSPI_AutoPollingTypeDef sConfig = {0};
/* 基本配置 */
sCommand.InstructionMode = QSPI_INSTRUCTION_4_LINES; /* 1线方式发送指令 */
sCommand.AddressSize = QSPI_ADDRESS_32_BITS; /* 32位地址 */
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; /* 无交替字节 */
sCommand.DdrMode = QSPI_DDR_MODE_DISABLE; /* W25Q256JV不支持DDR */
sCommand.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; /* DDR模式,数据输出延迟 */
sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; /* 每次传输都发指令 */
/* 读取状态*/
sCommand.Instruction = READ_STATUS_REG_CMD; /* 读取状态命令 */
sCommand.AddressMode = QSPI_ADDRESS_NONE; /* 无需地址 */
sCommand.DataMode = QSPI_DATA_4_LINES; /* 1线数据 */
sCommand.DummyCycles = 0; /* 无需空周期 */
/* 屏蔽位设置的bit0,匹配位等待bit0为0,即不断查询状态寄存器bit0,等待其为0 */
sConfig.Mask = 0x01;
sConfig.Match = 0x00;
sConfig.MatchMode = QSPI_MATCH_MODE_AND;
sConfig.StatusBytesSize = 1;
sConfig.Interval = 0x10;
sConfig.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
StatusMatch = 0;
TimeOut = 0;
if (HAL_QSPI_AutoPolling_IT(&QSPI_Handle, &sCommand, &sConfig) != HAL_OK)
{
return QSPI_ERROR;
}
while(StatusMatch == 0) // 等待完成匹配 StatusMatch 标志 置1
{
TimeOut ++;
if(TimeOut > (uint32_t)(0xFFFFFFFE))
{
return QSPI_OUT_TIME;
}
}
return QSPI_OK;
}
|
|