INT8U SD_ReadBlockData(INT32U len, INT8U *recbuf, INT32U timeout)
{
int i = 0;
int cnt;
INT32U tmp;
INT32U stat = 0;
// U8 *sb;
// Debug_Printf("\nSD_ReadBlockData start");
/* recycle to receive data */ /* 循环接收数据 */
while (i < len)
{
stat = rSDIDSTA; /* read data status register */
#ifdef CHECK_CARD_EN
if (!card_insert)
{
rSDIDSTA = stat;
return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */
}
#endif /* CHECK_CARD_EN */
/* 超时 timeout */
if (stat & SDIDSTA_TOUT)
{
rSDIDSTA = stat; /* clear */
return SD_ERR_TIMEOUT_READ;
}
stat = rSDIFSTA; /* 读FIFO状态寄存器 read FIFO status register */
if (stat & SDIFSTA_RX)
{
// Debug_Printf("a");
cnt = (stat & SDIFSTA_CNT); /* 读FIFO 计数器 read FIFO counter */
i += cnt;
cnt>>=2;
while (cnt--)
{
tmp = rSDIDAT; /* 从FIFO中读出数据 read data from FIFO */
*recbuf++=(INT8U)(tmp >> 24);
*recbuf++=(INT8U)(tmp >> 16);
*recbuf++=(INT8U)(tmp >> 8);
*recbuf++=(INT8U)(tmp >> 0);
}
}
}
// Debug_Printf("\nSD_ReadBlockData 1");
do
{
stat = rSDIDSTA;
#ifdef CHECK_CARD_EN
if (!card_insert)
{
rSDIDSTA = stat;
return SD_ERR_NO_CARD; /* 卡未插入,返回错误 card is not inserted, return error code */
}
#endif /* CHECK_CARD_EN */
} while (!(stat & SDIDSTA_TOUT) && !(stat & SDIDSTA_DFIN));
//不“超时”而且“数据未传输完成“时一直循环
// Debug_Printf("\nSD_ReadBlockData 2");
rSDIDSTA = stat; /* clear data status register */
return NO_ERR;
}