|
平台 2440
系统 wince 5.0
芯片 TL16C554a
利用微软的16550的代码架构驱动16C554,通过修改pdd层,配置相关的注册表项,目前系统已经可以加载4个串口了,利用调试软件可以打开,关闭。由于扩展的4个串口目前不对外使用,为内部提供给GPRS、GPS使用,因此进行发送测试是通过观察示波器结合打印调试信息完成的,观察到的情况是,发送1个字节 AA 示波器显示是正确的,但如果发送多个字节(长度超过FIFO 深度16)则每次只能发送FIFO 深度值,即最多16个。感觉像是中断线程没有执行。
后对线程部分的调试信息进行分析,似乎线程应该执行,只是不符合再次触发中断的条件,下面是我在发送数据是打印的调试信息
LEO: CPdd16550 XmitInterruptHandler dwDataAvaiable C8
LEO: CPdd16550 GetLineStatus bData FF
LEO: CPdd16550 SERIAL_LSR_OE failed 2
LEO: CPdd16550 SERIAL_LSR_PE failed 4
LEO: CPdd16550 SERIAL_LSR_FE failed 8
LEO: CPdd16550 GetWriteableSize dwWriteSize 10
LEO: CPdd16550 XmitInterruptHandler dwWriteSize 10
CPdd16550::XmitInterruptHandler! Write 16 byte to FIFO
LEO: CPdd16550 XmitInterruptHandler pBuffLen 10
CPdd16550::ThreadRun IIR=8
CPdd16550::ThreadRun IIR=16
LEO: CPdd16550 GetLineStatus bData 0
CPdd16550::NotifyPDDInterrupt interrupts=1
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=0
CPdd16550::NotifyPDDInterrupt interrupts=8
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=10
CPdd16550::NotifyPDDInterrupt interrupts=8
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=18
CPdd16550::NotifyPDDInterrupt interrupts=0
CPdd16550::ThreadRun IIR=d0
CPdd16550::NotifyPDDInterrupt interrupts=8
CPdd16550::InterruptDone m_dwSysIntr=15
LEO: CPdd16554SerialA init, m_pIOPregs->GPFCON 55AA
LEO: CPdd16554SerialA init, m_pIOPregs->GPGCON 580FFBA
LEO: CPdd16554SerialA init, m_pIOPregs->EXTINT0 22222222
LEO: CPdd16554SerialA init, m_pIOPregs->EXTINT1 22222242
LEO: CPdd16554SerialA init, m_pIOPregs->EXTINT2 22222222
LEO: CPdd16554SerialA init, m_pIOPregs->EINTMASK FFFDF0
我一直感觉是我读到的16C554寄存器的值不对,可能是地址不对,或者是别的什么原因。
在进行寄存器初始化的时候,执行了
CReg16550::CReg16550(PBYTE pRegAddr, DWORD dwStride)
: m_pReg (pRegAddr)
, m_dwStride(dwStride)
{
m_pData = pRegAddr + (dwStride * RECEIVE_BUFFER_REGISTER);
m_pIER = pRegAddr + (dwStride * INTERRUPT_ENABLE_REGISTER);
m_pIIR_FCR=pRegAddr + (dwStride * INTERRUPT_IDENT_REGISTER);
m_pLCR = pRegAddr + (dwStride * LINE_CONTROL_REGISTER);
m_pMCR = pRegAddr + (dwStride * MODEM_CONTROL_REGISTER);
m_pLSR = pRegAddr + (dwStride * LINE_STATUS_REGISTER);
m_pMSR = pRegAddr + (dwStride * MODEM_STATUS_REGISTER);
m_pSRC = pRegAddr + (dwStride * SCRATCH_REGISTER);
m_FCR = 0;
m_fIsBackedUp = FALSE;
这里的dwstride是默认的值1,是不是这个地方的问题?
我的片选是nGCS1,4个串口的对应地址是 0x08080000, 0x08090000, 0x080A0000, 0x080B0000
中断是 EINT3, EINT8,EINT17,EINT18
另外,我想知道怎么样能知道我当前配置的物理地址经过mmu是正确的。
我找不原因了,已经好几天了,快崩溃了
|
|