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