|
发表于 2017-3-18 14:35:57
|
显示全部楼层
本帖最后由 hpdell 于 2017-3-18 14:38 编辑
你好,我以前使用的 N25Q256A 的这个芯片的程序已经没有问题了啊,
现在目前使用的是 N25Q512 这个芯片的,程序死活都没有搞定啊,曾经梦想着只是容量的不同,改个地址就可以了,
可现在一直都没有搞定啊,很纠结啊,如果有 N25Q512这个芯片的,可以发给我一下吧,
现在我的 这个 N25Q512 目前也设置为 4字节模式了,读取状态为也是显示是进入4字节模式了,quad 模式也进入,但是现在就是读写数据不行
进入 quad 模式:
/*
**************************************************************************************
函数名称:QSPI_Quad_Enter
函数功能:进入 QUAD 模式
返回值:QSPI_OK读取成功,其他值失败
**************************************************************************************
*/
QSPI_StaticTypeDef QSPI_Quad_Enter(void)
{
uint8_t _RegVal[2] = {0xFF, 0x55};
QSPI_WorkMode = 0;
if(QSPI_Read_SR(READ_ENHANCED_VOL_CFG_REG_CMD, &_RegVal[0], 1) != QSPI_OK ) // read reg 0x65
{
return QSPI_ERROR;
}
if(_RegVal[0] == 0xDF) // N25Q512A13640 芯片初始值 = 0xDF
{
// _RegVal[0] &= 0x57; // bit7=0,bit6=1 QUAD 模式, bit5 系统保留且必须设置为0,
_RegVal[0] = 0x07; // 0x17
// bit3=0(VPP accelerator) Enabled
if(QSPI_Write_SR(WRITE_ENHANCED_VOL_CFG_REG_CMD, &_RegVal[0], 1) == QSPI_OK) // 设置为 QUAD 模式 reg 0x61
{
QSPI_WorkMode = 1;
HAL_Delay(50); // delay 50ms
_RegVal[0] = 0xff;
QSPI_Read_SR(READ_ENHANCED_VOL_CFG_REG_CMD, &_RegVal[0], 1); // read reg 0x65 都回来的值为 0x07 ,说明 ok, 写入如读出的值一样
printf("READ_VOL_CFG_REG_CMD 0x85 reg = 0x%X \r\n", _RegVal[0] );
}
}
else
{
printf("QSPI N25Qxx Chip Error ... ... \r\n");
return QSPI_ERROR;
}
printf("QSPI N25Qxx QSPI_WorkMode = %d ... ... \r\n", QSPI_WorkMode);
return QSPI_OK;
}
// 进入4字节模式
static uint8_t QSPI_EnterFourBytesAddress(QSPI_HandleTypeDef *hqspi)
{
#if 1
uint8_t _RegVal;
QSPI_CommandTypeDef s_command;
/* Initialize the command */
/* Enable write operations */
if (QSPI_WriteEnable(hqspi) != QSPI_OK)
{
return QSPI_WRITE_ENABLE_ERROR;
}
if(QSPI_WorkMode) // QUAD Model
s_command.InstructionMode = QSPI_INSTRUCTION_4_LINES;
else
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction = ENTER_4_BYTE_ADDR_MODE_CMD;
s_command.AddressMode = QSPI_ADDRESS_NONE;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
s_command.DataMode = QSPI_DATA_NONE;
s_command.DummyCycles = 0;
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
/* Send the command */
if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
return QSPI_ERROR;
}
/* Configure automatic polling mode to wait the memory is ready */
if (QSPI_AutoPollingMemReady(hqspi, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK)
{
return QSPI_ERROR;
}
HAL_Delay(20); // delay 20ms
// 读取 0x70 状态,查看是否进入 4 Byte Address Mode
QSPI_Read_SR(READ_FLAG_STATUS_REG_CMD, &_RegVal, 1); // FLASH_4B_MODE_ENTER = 0xB7, /* enter 4-byte address mode */
if(_RegVal & 1)
printf("N25Q512A QSPI 已经进入 4 Byte Addr Mode = 0x%X \r\n", _RegVal );
else
printf("N25Q512A QSPI 没有进入 4 Byte Addr Mode = 0x%X \r\n", _RegVal );
return QSPI_OK;
}
|
|