[ZLG-ARM] IDE电子盘状态寄存器读扇区时始终为0x50

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

本版积分规则

4

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部