STM32
直播中

李永每

7年用户 1442经验值
私信 关注
[问答]

STM32H743II QSPI仅读取外设数据,程序运行异常的原因?怎么解决?

QSPI仅接收数据异常

芯片信号:STM32H743II

测试Demo如下:

void QSpiDemo(void){

uint8_t aucBuf[2];

MX_QUADSPI_Init();    /* QSPI初始化 */

aucBuf[0] = 4 << 1;

aucBuf[1] = 0;

QSPI_WriteRegEx(aucBuf, 2);  /* 发送2字节数据 */


QSPI_ReadRegEx(aucBuf, 2);  /* 接收2字节数据 */

}

uint8_t QSPI_WriteRegEx(uint8_t *_pBuf, uint16_t _usWriteSize)
{
QSPI_CommandTypeDef sCommand = {0};
/* 基本配置 */
sCommand.DummyCycles = 0;                                   /* 不需要空周期 */
sCommand.InstructionMode   = QSPI_INSTRUCTION_NONE;         /* No instruction */
sCommand.AddressMode = QSPI_ADDRESS_NONE;                   /* No address ;QSPI_ADDRESS_1_LINE */
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;     /* 无交替字节 */
sCommand.DataMode    = QSPI_DATA_1_LINE;                    /* 1线数据方式 */
sCommand.NbData      = _usWriteSize;                        /* 写数据大小 */

sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;         /* 不支持DDR */
sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;     /* DDR模式,数据输出延迟 */
sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;      /* 仅发送一次命令 */

if(HAL_QSPI_Command( hqspi,  sCommand, 5000) != HAL_OK)
{
return 0;
}
if(HAL_QSPI_Transmit( hqspi, _pBuf, 5000) != HAL_OK)
{
return 0;
}
return 1;
}

uint8_t QSPI_ReadRegEx(uint8_t *_pBuf, uint16_t _usReadSize)
{
QSPI_CommandTypeDef sCommand = {0};

sCommand.DummyCycles = 0;                                /* 不需要空周期 */
sCommand.InstructionMode   = QSPI_INSTRUCTION_NONE;      /* No instruction */
sCommand.AddressMode =  QSPI_ADDRESS_NONE;               /* No address ;QSPI_ADDRESS_1_LINE */
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;  /* 无交替字节 */
sCommand.DataMode    = QSPI_DATA_1_LINE;                 /* 1线数据方式 */
sCommand.NbData      = _usReadSize;                      /* 写数据大小 */

sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;      /* 不支持DDR */
sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;  /* DDR模式,数据输出延迟 */
sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;   /* 仅发送一次命令 */

if(HAL_QSPI_Command( hqspi,  sCommand, 5000) != HAL_OK)
{
return 0;
}
if(HAL_QSPI_Receive( hqspi, _pBuf, 5000) != HAL_OK)
{
return 0;
}
return 1;
}

读取数据时,每次执行到HAL_QSPI_Receive函数MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ)时,相关寄存器就会异常


如果将接收DummyCycles配置成2时,则可以正常接收数据,但是时序会异常导致接收数据不正确。



回帖(1)

郑成枝

2024-3-18 16:46:00
可能的原因有以下几点:

1. QSPI外设初始化配置错误:检查是否正确配置了QSPI的时钟频率、时钟极性、数据线位序等参数。

2. QSPI外设控制器配置错误:检查是否正确配置了QSPI控制器的时钟分频、时钟相位、数据位宽等参数。

3. QSPI读取命令设置错误:检查是否正确设置了QSPI的读取命令,包括操作代码、地址位数、数据位数等参数。

4. QSPI片选信号控制错误:确保CS引脚(片选信号)正确控制,并在读取数据之前将其拉低。

解决方法:

1. 检查QSPI的初始化配置是否正确,确保时钟频率、时钟极性和数据线位序等参数设置正确。

2. 检查QSPI控制器的配置是否正确,包括时钟分频、时钟相位和数据位宽等参数设置正确。

3. 检查读取命令的设置是否正确,确保正确设置了操作代码、地址位数和数据位数等参数。

4. 检查片选信号的控制是否正确,确保在读取数据之前,将CS引脚拉低。

5. 确认外部器件与QSPI接口的连接是否正确,包括引脚连接和电源连接等。

6. 在读取数据之前,确保外部器件已经正常发送数据,并检查通信时序是否正确。

7. 可以使用示波器或逻辑分析仪等工具检查QSPI接口的信号波形,确保时钟、数据、片选等信号的波形正确。

如果问题仍然存在,可以尝试使用其他方法进行QSPI的读取操作,或者查阅相关文档和参考资料以获取更多关于QSPI的配置和使用方法的信息。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分