打印
[ZLG-ARM]

高速采样与USB传输之间存在瓶颈?

[复制链接]
1594|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tsstchip|  楼主 | 2007-5-6 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:
实现一块AD苾片的全速采样——100kHz。


方法:
使用的单片机是LPC2142。用了定时器中断和USB中断。定时器10us定时,中断启动AD采样,为最高优先级。USB中断用来向

上位机传数据,中断优先级较低。USB驱动用的是公司提供的EasyUSB214x固件程序包。


问题:
设为100kHz采样,在USB向上位机发送数据时,定时器采样的中断被打断,具体表现就是波形变密。而设为20kHz以下时,就

不会出现这个问题。


尝试:
设置中断嵌套。后来才知道ARM体系跟51体系的中断区别较大,中断优先级没有中断嵌套,需要写一些代码实现。于是以照

着《深入浅出ARM7》自己写了一下,全速运行程序时就会显示“USB设备工作不正常”。怀疑是USB中断的嵌套没设对。


请教:
1。我想实现的目的能用LPC2142和EasyUSB214x固件程序包实现吗?有没有瓶颈?
2。如果可以实现,具体应该如何操作?
3。以下给出USB中断嵌套的设置,我是参考书上例程写的,不确定对不对:

谢谢大家!

/***********************************************************************************************************

****
** 函数名称 : Usb_Exception()                            Name     : Usb_Exception()
** 功能描述 : USB 中断服务程序                              Function : USB Interrupt Service 

Program
** 输     入 : 无                                         Input     : 

NULL
** 输     出 : 无                                        Output     : 

NULL
************************************************************************************************************

****/
void __irq Usb_Exception(void) 
//void Usb_Exception(void)                                //试一下中断嵌套的写


{
    INT32U usb_ints,dev_ints,devstatus;
    
    uint32 bak;                                            //中

断嵌套需要的临时变量
    bak=VICIntEnable;
    VICIntEnClr=1<<22;                                    //禁止当前中


    VICVectAddr=0x00;
    IRQEnable();                                        //使能IRQ中

断,以响应更高优先级的中断
    
    bEPPflags.bits.in_isr = 1;                            /* 标识程序进入中断  

  flag the program enter interrupt */


        
    /****** USB status interrupt ******/                    
    dev_ints = USBDevIntSt;
    if (dev_ints & DEVINT_STATUS_DEVSTAT)            
    {                                                    

/* USB 总线复位,或挂起,或连接中断 */
        devstatus = USB_GetDevStatus();
        if ((devstatus & 0x10) != 0)
        {
            USB_BusReset();
            bEPPflags.bits.bus_reset = 1;                /* 标识总线复位        flag 

USB bus reset */
        }
        
        if ((devstatus & 0x08) != 0)
            bEPPflags.bits.suspend = 1;                    /* 标识总线挂起改变  

  flag the bus suspend change */
            
        if ((devstatus & 0x02) != 0)
            bEPPflags.bits.con_change = 1;                /* 标识总线连接改变    flag 

the bus connect change */
        
        USBDevIntClr = DevStatusInterrupt;
        goto USB_ISR_EXIT;
    }    
    
    /****** data transmission interrupt ******/
    usb_ints = USBIntSt & 0x7;    
    if (usb_ints != 0)
    {
        if (usb_ints & USBINT_STATUS_HP)
            Usb_HPService();                               /* 高优先级

中断处理    process High priority Interrupt */
        
        if (usb_ints & USBINT_STATUS_LP)
            Usb_LPService();                            /* 低优先级

中断处理    process Slow priority Interrupt */

#if DMA_ENGINE_EN        
        if (usb_ints & USBINT_STATUS_DMA)
            USB_DMAService();                            /* DMA中断处

理         process DMA Interrupt */
#endif
    }

USB_ISR_EXIT:
       bEPPflags.bits.in_isr = 0;                            /* 标识程序退出中断  

  flag the program exit interrupt */

   
    VICIntEnable=bak;

}

相关帖子

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

本版积分规则

5

主题

17

帖子

0

粉丝