金牌会员
 
- 积分
- 1608
- 金钱
- 1608
- 注册时间
- 2012-12-30
- 在线时间
- 241 小时
|
可能很多人的SD卡都是移植原子哥,这几天调试发现如果卡是带MBR的话是读不出来的,SDIO驱动会返回读取超时,文件系统则返回FR_NO_FILESYSTEM的问题。一步一步调试发现,是扇区地址问题。直接上代码吧!u8 SD_ReadDisk(u8*buf,uint32_t sector,u8 cnt)
{
u8 sta=SD_OK;
long long lsector=sector;
u8 n;
if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;
// if((uint32_t)buf%4!=0)
// {
// for(n=0;n<cnt;n++)
// {
// sta=SD_ReadBlock(SDIO_DATA_BUFFER,lsector+512*n,512);//μ¥¸ösectorμĶá2ù×÷
// memcpy(buf,SDIO_DATA_BUFFER,512);
// buf+=512;
// }
// }else
// {
if(cnt==1)sta=SD_ReadBlock(buf,lsector,512); //μ¥¸ösectorμĶá2ù×÷
else sta=SD_ReadMultiBlocks(buf,lsector,512,cnt);//¶à¸ösector
// }
return sta;
}
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
)
{
uint8_t res=0;
if (!count)return RES_PARERR;//count2»Äüμèóú0£¬·ñÔò·μ»Ø2Îêy′íÎó
switch(pdrv)
{
case SD_CARD://SD¿¨
res=SD_ReadDisk(buff,sector*FLASH_SECTOR_SIZE,count);
if(res){
}
break;
case EX_FLASH://ía2¿flash
for(;count>0;count--)
{
SPI_Flash_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
sector++;
buff+=FLASH_SECTOR_SIZE;
}
res=0;
break;
default:
res=1;
}
//′|àí·μ»ØÖ죬½«SPI_SD_driver.cμÄ·μ»ØÖμ×a3éff.cμÄ·μ»ØÖμ
if(res==0x00)return RES_OK;
else return RES_ERROR;
}
|
|