新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2016-6-30
- 在线时间
- 5 小时
|
FATFS文件系统读写W25Q80,超过4kb能够写,但是用buff[4096]读取会卡死在底层的读取函数中。求大神指点,多谢。
//扇区写函数
void W25QXX_Write( uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite )
{
uint32_t secpos;
uint16_t secoff;
uint16_t secremain;
uint16_t i;
uint8_t * W25QXX_BUF;
W25QXX_BUF = W25QXX_BUFFER;
secpos = WriteAddr / 4096;
secoff = WriteAddr % 4096;
secremain = 4096 - secoff;
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);
if( NumByteToWrite <= secremain )
{
secremain = NumByteToWrite;
}
while( 1 )
{
W25QXX_Read( W25QXX_BUF, secpos * 4096, 4096 );
for( i = 0; i < secremain; i++ )
{
if( W25QXX_BUF[secoff + i] != 0XFF )
{
break;
}
}
if( i < secremain )
{
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;
}
}
}
}
//扇区读函数
void W25QXX_Read_Sector( uint8_t* pBuffer, uint32_t ReadAddr )
{
aTxBuffer[0] = W25X_FastReadData;
aTxBuffer[1] = ( ReadAddr & 0xFF0000 ) >> 16;
aTxBuffer[2] = ( ReadAddr & 0xFF00 ) >> 8;
aTxBuffer[3] = ReadAddr;
aTxBuffer[4] = 0x00;
for( int i = 5; i < 5 + 4096; i++ )
{
aTxBuffer[i] = 0xff;
}
//SPIx_CS_EN( );
NORFLASH_CS_EN( );
if( HAL_SPI_TransmitReceive_DMA( &SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, 5 + 4096 ) != HAL_OK )
{
Error_Handler( (uint8_t*)__FILE__, __LINE__ );
}
while( !txrxOK )
{
;
}
txrxOK = 0;
memcpy( pBuffer, &aRxBuffer[5], 4096 );
}
|
|