IDE电子盘状态寄存器读扇区时始终为0x50,这个应该是在IDE控制器复位时的值,但是当我想读扇区时却也是0x50,于是就在下面的函数循环,得不到正确的数据.
是不是在之前需要对其它寄存器配置,我是用ZLG的ATA_INI()函数初始化.
电子盘应该没什么问题,在计算机上用PIO方式可以使用.就是DRQ位始终不置1,状态寄存器为0x50.
/********************************************************************************************************* ** 函数名称: ATA_WaitOnBusyNDrq 所在文件:IDE.C ** 功能描述: 设备忙等待直到设备不忙并有数据传输请求时. ** 输 入: 无 ** 输 出: 设备出错返回0 ** 全局变量: ATA[THIS_DEVICE].ERRCODE,出错代码 ** ATA[THIS_DEVICE].ERRSECTOR,出错扇区号 ** 调用模块: ATA_GetStatus(),读取状态函数 ********************************************************************************************************/ uint8 ATA_WaitOnBusyNDrq(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_REG_ERR) /*如果设备出错*/ return FALSE;
//if((ATA_STAT_REG_DRQ==(ATAStatus&ATA_STAT_BSY_DRQ))||(ATAStatus==0x50)) /*有数据传输请求*/ if(ATA_STAT_REG_DRQ==(ATAStatus&ATA_STAT_BSY_DRQ)) return TRUE; } ATA[THIS_DEVICE].ERRCODE = CARD_TIMEOUT; /*标志超时出错*/ ATA[THIS_DEVICE].ERRSECTOR = -1; /*清错误扇区号*/ return FALSE; } |