dillonhua
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望401点
  • 贡献值0点
  • 好评度128点
  • 原创分0分
  • 专家分0分
阅读:1698回复:0

请gerryzhou小牛帮忙看下st16c2550的问题(怪异!)

楼主#
更多 发布于:2008-03-29 17:57
最近在做st16c2550的驱动移植,代码是用PB4.2的public下的,现在的问题是,我在SL_Init里面做了对pMCR的操作后(将MCR[3]置1,打开INTA/INTB中断),就会一直陷入到后面的ClearPendingInt循环里面,代码如下:
VOID
ClearPendingInts(
       PVOID   pHead // @parm PVOID returned by HWinit.
       )
{
    PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;


    EnterCriticalSection(&(pHWHead->RegCritSec));

    try {
        pHWHead->IIR = INB(pHWHead, pIIR_FCR);
        while ( ! (pHWHead->IIR & 0x01) ) {
            DEBUGMSG (ZONE_INIT, (TEXT("!!IIR %X\r\n"), pHWHead->IIR));            // Reading LSR clears RLS interrupts.
            ReadLSR( pHWHead );

            // Reset RX FIFO to clear any old data remaining in it.
            OUTB(pHWHead, pIIR_FCR, pHWHead->FCR | SERIAL_FCR_RCVR_RESET);

            // Reading MSR clears Modem Status interrupt
            ReadMSR( pHWHead );

            // Simply reading IIR is sufficient to clear THRE
            pHWHead->IIR = INB(pHWHead, pIIR_FCR);
        }    
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        DEBUGMSG (ZONE_ERROR,(TEXT("-SL_PostInit, 0x%X - ERROR\r\n"), pHWHead));
        // Just fall through & release CritSec
    }

    LeaveCriticalSection(&(pHWHead->RegCritSec));
}
上面黑体的地方一直打印出0xc0,说明CPU无法清除st16c2550的pending int,这样就没法退出循环,但是从里面读的LSR和MSR来看,根本就没有中断产生。

不知道为什么一开st16c2550的MSR[3]位后,就会出现这样的问题呢?
游客

返回顶部