|
用的是STM32H7B0,外挂QSPI flash W25Q128JV, 测试了很多次,发现无法读取ID,检查了代码和硬件,均未发现问题,感觉十分诡异,最后换了个新的flash也是一样的问题,现在实在没有办法了。
麻烦大家帮助看看。
代码是移植的论坛里STM32H723+W25Q64的,如下,
unsigned int W25Q128_OSPI_Read_FlashID(void)
{
OSPI_RegularCmdTypeDef sCommand; // OSPI传输配置
unsigned char OSPI_ReceiveBuff[3]; // 存储OSPI读到的数据
unsigned int W25Q128_ID; // 器件的ID
sCommand.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG; // 通用配置
sCommand.FlashId = HAL_OSPI_FLASH_ID_1; // flash ID
sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE; // 1线指令模式
sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS; // 指令长度8位
sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE; // 禁止指令DTR模式
sCommand.AddressMode = HAL_OSPI_ADDRESS_NONE; // 无地址模式
sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS; // 地址长度24位
sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE; // 无交替字节
sCommand.DataMode = HAL_OSPI_DATA_1_LINE; // 1线数据模式
sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE; // 禁止数据DTR模式
sCommand.NbData = 3; // 传输数据的长度
sCommand.DummyCycles = 0; // 空周期个数
sCommand.DQSMode = HAL_OSPI_DQS_DISABLE; // 不使用DQS
sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD; // 每次传输数据都发送指令
sCommand.Instruction = W25Q128_CMD_READ_JEDECID; //执行读器件ID命令
if(HAL_OK != HAL_OSPI_Command(&_hospi1, &sCommand, 10000)) //发送指令----------1
{
return 3;
}
if(HAL_OK != HAL_OSPI_Receive (&_hospi1, OSPI_ReceiveBuff, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)) //接收数据---------------2
{
return 4;
}
W25Q128_ID = (OSPI_ReceiveBuff[0] << 16) | (OSPI_ReceiveBuff[1] << 8 ) | OSPI_ReceiveBuff[2]; //将得到的数据组合成ID----------3
return W25Q128_ID; // 返回ID
}
通过仿真,发现程序是卡在上面第1步,发现HAL_OSPI_Command(&_hospi1, &sCommand, 10000)这个函数返回值是1,导致卡在这里无法继续,但是不明白为什么会返回1, 1好像是操作错误。
该检查的地方都检查了,实在想不出还有哪里会有问题?硬件上是刚开始是串了33欧姆电阻,后来把电阻去掉直连,也还是一样的问题,flash也换过其他的,问题依旧。
其他地方就是OCTOSPI的配置,是用STM32CubeMX配置的,感觉也没问题,就是读不了ID,老是卡在第1步,,真的很无语,排查了好几天,也没搞定。。。。
|
|