新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2020-2-18
- 在线时间
- 8 小时
|
1金钱
1、H750和W25Q64通过QSPI_BANK1连接;
2、读取设备ID、读取数据正常,写入数据无效【已经清除地址对应扇区】;
3、通过清除整个W25Q64芯片后写入的数据正常,此时读取数据也符合写入的数据;
4、二次上电后,写入的数据仍然存在。
部分代码如下:
/*
* 扇区清除
*/
void W25QXX_Erase_Sector(u32 Dst_Addr)
{
//printf("fe:%x\r\n",Dst_Addr);
Dst_Addr*=4096;
W25QXX_Write_Enable();
W25QXX_Wait_Busy();
QSPI_Send_CMD(W25X_SectorErase,Dst_Addr,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_32_BITS,QSPI_DATA_NONE);
W25QXX_Wait_Busy();
}
void QSPI_Send_CMD(u32 instruction,u32 address,u32 dummyCycles,u32 instructionMode,u32 addressMode,u32 addressSize,u32 dataMode)
{
QSPI_CommandTypeDef Cmdhandler;
Cmdhandler.Instruction=instruction;
Cmdhandler.Address=address;
Cmdhandler.DummyCycles=dummyCycles;
Cmdhandler.InstructionMode=instructionMode;
Cmdhandler.AddressMode=addressMode;
Cmdhandler.AddressSize=addressSize;
Cmdhandler.DataMode=dataMode;
Cmdhandler.SIOOMode=QSPI_SIOO_INST_EVERY_CMD;
Cmdhandler.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE;
Cmdhandler.DdrMode=QSPI_DDR_MODE_DISABLE;
Cmdhandler.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY;
HAL_QSPI_Command(&hqspi,&Cmdhandler,5000);
}
u8 W25QXX_BUFFER[100];
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//éèÇøμØÖ·
secoff=WriteAddr%4096;//ÔúéèÇøÄúμÄÆ«òÆ
secremain=4096-secoff;//éèÇøê£óà¿Õ¼ä′óD¡
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;
secremain=NumByteToWrite;
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,100);
for(i=0;i<secremain;i++)
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;
}
if(EraseChipFlag){
W25QXX_Erase_Chip();
}
if(WritePageFlag)
W25QXX_Write_Page(W25QXX_BUF,WritePageAddress,NumByteToWrite);
if(EraseAddressFlag){
W25QXX_Erase_Address();
}
if(i<secremain)//Dèòa2á3y
{
W25QXX_Erase_Sector(secpos);
for(i=0;i<secremain;i++)
{
W25QXX_BUF[i+secoff]=pBuffer[i];
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);
}else{
W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);
}
if(NumByteToWrite==secremain)break;
else
{
secpos++;
secoff=0;
pBuffer+=secremain;
WriteAddr+=secremain;
NumByteToWrite-=secremain;
if(NumByteToWrite>4096)secremain=4096;
else secremain=NumByteToWrite;
}
}
}
求大佬帮助
|
|