hpdell 发表于 2016-11-5 14:44:34

QSPI N25Q256 读取 ID ??

本帖最后由 hpdell 于 2016-11-5 15:34 编辑

QSPI N25Q256 读取 ID 貌似跟资料介绍的不一致??

资料介绍




实际读取到的 ID



对 这个芯片的 数据读写,4k擦除 完全正常,但是还有芯片擦除 还是不行


/* Identification Operations */
#define QSPI_READ_ID_CMD                        0x9E


#define QSPI_READ_ID_CMD2                         0x9F
#define QSPI_MULTIPLE_IO_READ_ID_CMD            0xAF
#define QSPI_READ_SERIAL_FLASH_DISCO_PARAM_CMD    0x5A

读取函数如下:

QSPI_StaticTypeDef QSPI_Read_ID(uint8_t ReadID, uint8_t * _pIdBuf, uint8_t ReadIdNum)
{

      QSPI_CommandTypeDef sCommand;
      __IO uint32_t cc;

//Initialize the read command
sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;   //指令模式
sCommand.AddressSize       = QSPI_ADDRESS_24_BITS;      //地址长度
sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;   //无交替字节
sCommand.DdrMode         = QSPI_DDR_MODE_DISABLE;       //关闭DDR模式
sCommand.DdrHoldHalfCycle= QSPI_DDR_HHC_ANALOG_DELAY;
sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;

sCommand.Instruction      = ReadID;                            //指令

sCommand.DummyCycles      = 1;                                  //设置空指令周期数
//    sCommand.Address            = address;                        //地址
sCommand.NbData             = ReadIdNum;          // 需要读取的字节数

if(ReadID == QSPI_MULTIPLE_IO_READ_ID_CMD)
{
    sCommand.AddressMode      = QSPI_ADDRESS_4_LINES;                //地址模式
    sCommand.DataMode         = QSPI_DATA_4_LINES;                  //数据模式   
}
else
{
    sCommand.AddressMode      = QSPI_ADDRESS_1_LINE;                //地址模式
    sCommand.DataMode         = QSPI_DATA_1_LINE;                  //数据模式
}

if (HAL_QSPI_Command(&hqspi, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
    return QSPI_ERROR;
}

RxCplt = 0;   // 接收标志清0
if (HAL_QSPI_Receive_IT(&hqspi, _pIdBuf) != HAL_OK)
{
    return QSPI_ERROR;
}

cc = 0;
do{

    cc ++;

} while( (RxCplt == 0) && (cc < QSPI_WAIT_MAX_TIME));

if(cc >= (QSPI_WAIT_MAX_TIME - 1 ))
    return QSPI_ERROR;

      return QSPI_OK;
}



main{

.........................

QSPI_Read_ID( QSPI_READ_ID_CMD2, (uint8_t*) &uart_rx_buff, 20);
uart_rx_buff = 0xff;    // 特意赋值为 0xff
for(cc=0;cc<20;cc++)
    printf("ID = %#x, %d\r\n", uart_rx_buff, cc);

}









衔胆栖冰 发表于 2016-11-5 17:18:21

首先,你的这样贴代码,谁看谁累。
然后,“对 这个芯片的 数据读写,4k擦除 完全正常,但是还有芯片擦除 还是不行”,你的ID都读不对,你怎么确定4K擦除和读写完全正常?
还有,你的命令码,手册上的没有贴上来,自己确认一下没错。

衔胆栖冰 发表于 2016-11-5 17:19:09

还有初始化的代码,都没贴,净贴些没用的。

hpdell 发表于 2016-11-5 17:29:33

衔胆栖冰 发表于 2016-11-5 17:18
首先,你的这样贴代码,谁看谁累。
然后,“对 这个芯片的 数据读写,4k擦除 完全正常,但是还有芯片擦除...

我使用 4k 扇区擦除,写入,再读出,最后数据对比都完全正确,

现在 就是ID 读取不正确,还有 擦除整个芯片不正常,

wdshuang09 发表于 2016-11-5 18:25:23

衔胆栖冰 发表于 2016-11-5 17:18
首先,你的这样贴代码,谁看谁累。
然后,“对 这个芯片的 数据读写,4k擦除 完全正常,但是还有芯片擦除...

同意二楼的说法

衔胆栖冰 发表于 2016-11-5 22:37:20

hpdell 发表于 2016-11-5 17:29
我使用 4k 扇区擦除,写入,再读出,最后数据对比都完全正确,

现在 就是ID 读取不正确,还有 擦除整个 ...

你的flash是不是有4K的缓冲区?你的数据并没有写进flash里,只是写到了缓存区,然后再从缓冲区读出来,然后对比都一样;P

peter001 发表于 2016-11-6 00:21:15

断电重新上电,校验一下数据写入对不

asssdz-382474 发表于 2016-11-6 04:23:34

:):):):):):):):):):):)

hpdell 发表于 2016-11-6 13:03:48

本帖最后由 hpdell 于 2016-11-6 13:05 编辑

衔胆栖冰 发表于 2016-11-5 22:37
你的flash是不是有4K的缓冲区?你的数据并没有写进flash里,只是写到了缓存区,然后再从缓冲区读出来,然 ...
哟一次写入的是 8192 字节啊,读出也是8192 进行对比的,
还有我整片擦除,写入,后再整片读出,数据对比也是对的

liu553824989 发表于 2016-11-7 12:42:40


还有初始化的代码,都没贴,净贴些没用的。
页: [1] 2
查看完整版本: QSPI N25Q256 读取 ID ??