catus 发表于 2012-11-16 09:16:03

请教!关于CF卡的问题

void ATA_FindIDEDevice(void)
{

uint32 temp32;
uint8 Device; /*为0选择主设备,为1选择从设备*/

if(SYS_HaveCard()) /*如果ATA接口上没有设备*/
{
SYS_IdeHardReset(); /*ATA设备硬件复位*/

for(temp32=0;temp32<TIMEOUTSET;temp32++) /*等待设备准备好*/
{
SetDeviceHead(0xfa); /*写设备磁头寄存器*/
if( 0xfa == (uint8)GetDeviceHead()) /*读出刚才写进设备磁头寄存器值*/ 到这里操作都是正确的,写进去,读出来都正确break; /*设备OK,完成复位*/
}

if(temp32<TIMEOUTSET) /*如果设备不超时,则ATA接口上有设备*/
{
for(Device=0;MAX_DEVICE>Device;Device++) /*初始化各设备,MAX_DEVICE最大值为1,即只能有主和从两个设备*/
{
ATA_SetFeature(Device); /*特性设备,(总线设置)*/
if(ATA_IssueIDEIdentify(Device)) /*ATA设备识别,获取CF卡内部信息*/
ATA.ATAIsOK = TRUE; /*ATA设备可用,置位其标志位*/
else
ATA.ATAIsOK = FALSE; /**ATA设备不可用,清ATA设备准备好标志*/
}
}
}
}


到上面蓝色程序部分都是对的,写进去读出来正确
再往下就会一直停留在下面这段程序中,读出来的状态始终是0x80,说明设备忙?!why?

uint8 ATA_WaitOnBusy(void)
{
uint8 ATAStatus;
uint32 timeout;

for(timeout=0;timeout<TIMEOUTSET;timeout++) /*超时返回,即多次读取,在读取一定的次数还没得到需要的状态就认为超时*/
{
ATA_GetStatus(&ATAStatus); /*读取状态寄存器*/
if(ATAStatus==CARD_IS_FALSE) /*卡有错误*/
return FALSE; /*返回设备发生了错误*/

if((ATAStatus & ATA_STAT_BSY_DRQ)==0) /*设备不忙,*/
return TRUE; /*正常返回*/
}

ATA.ERRCODE = CARD_TIMEOUT; /*标志超时出错*/
ATA.ERRSECTOR = -1; /*清错误扇区号*/
return FALSE;
}


设备找到后,设置特征寄存器时判断设备一直处于“忙”状态。这是为什么呢?以前又遇到类似的问题大侠帮忙解决一下。谢谢!!予人玫瑰,手有余香!!!

catus 发表于 2012-11-16 09:37:22

顶起,希望大侠帮忙看那一下,原因是什么。写进去,读出来都正确,说明底层读写驱动是没有问题的。不知道问题出在哪里啦?

catus 发表于 2012-11-16 15:48:25

没有人能帮忙解决一下吗?
页: [1]
查看完整版本: 请教!关于CF卡的问题