打印
[ZLG-ARM]

IDE电子盘状态寄存器读扇区时始终为0x50

[复制链接]
1367|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aut_maple|  楼主 | 2007-6-5 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝