3713|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:一个关于cs8900中断的奇怪问题! [复制链接]

买了块2410的板子,上面用cs8900驱动网口。这几天把cs8900配置了一下,现在8900在产生中断时,可以通过自己的IRQ0脚触发2410的EINT9脚。但8900在收到包的时候只能产生一次中断,也就是说收到第一个包8900会在IRQ0脚产生中断电平,并在IRQ(120h)中断寄存器队列中设置RXEvent(124h)寄存器的值。但收到二个包时,8900只会在IRQ(120h)中设置RXEvent(124h)的值,不会产生中断电平。

2410采用高电平中断,我在中断管脚用万用表量的电平,确实是8900收到第二个包时没有产生高电平。收到第二个包时,可以收到包中的内容。

具体代码如下:

        IMPORT        HandleIRQ

        AREA    Init,CODE,READONLY

        ENTRY
       
        b        ResetHandler  
        b        .
        b        .
        b        .
        b        .
        b        .
        b        HandlerIRQ
        b        HandlerFIQ
       
        LTORG   

       
ResetHandler

        mrs        r0,cpsr     ; set the cpu to SVC32 mode
        bic        r0,r0,#0x1f
        orr        r0,r0,#0xd3
        msr        cpsr_c,r0

        ldr        sp,=SVCStack        ;Setup SVC mode's pc

        ldr        r0,=WTCON ;watch dog disable
        ldr        r1,=0x0         
        str        r1,[r0]
       
        ldr        r0,=INTMSK  ;all interrupt disable
        ldr        r1,=0xffffffff  
        str        r1,[r0]

        ldr        r0,=INTSUBMSK  ;all sub interrupt disable
        ldr        r1,=0x7ff
        str        r1,[r0]
       
        ldr        r0,=INTMOD ;Set Int Mode as IRQ
        ldr        r1,=0
        str        r1,[r0]


        ;setup system clock
        ldr        r0,=LOCKTIME
        ldr        r1,=0x00ffffff
        str        r1,[r0]
       
        ldr        r0,=MPLLCON
        ldr        r1,=((161<<12)+(3<<4)+1)
        str        r1,[r0]

        ldr        r0,=CLKDIVN
        ldr        r1,=0x3
        str        r1,[r0]


        ;Setup SDRAM
        ldr        r0,=SMRDATA
        ldr        r1,=BWSCON  ;BWSCON Address
        add        r2,r0,#52          ;End address of SMRDATA

0      
        ldr        r3,[r0],#4   
        str        r3,[r1],#4   
        cmp        r2,r0               
        bne        %B0


        ldr        r0,=GPFCON                ; Led_Display
        ldr        r1,=0x5500               
        str        r1,[r0]
        ldr        r0,=GPFDAT
        ldr        r1,=0x10
        str        r1,[r0]


        ;Setup UART0
        ldr        r0,=GPHCON        ; Config GPH as UART
        ldr        r1,=0xaa               
        str        r1,[r0]

        ldr        r0,=UFCON0
        ldr        r1,=0
        str        r1,[r0]

        ldr        r0,=UMCON0
        ldr        r1,=0
        str        r1,[r0]

        ldr        r0,=ULCON0
        ldr        r1,=0x3
        str        r1,[r0]
       
        ldr        r0,=UCON0
        ldr        r1,=0x45
        str        r1,[r0]

        ldr        r0,=UBRDIV0
        ldr        r1,=26
        str        r1,[r0]

        ;setup CS8900
        ldr r0,=0x1900030a ;set packet page pointer to 0x116
        ldr r1,=0x3116
        strh r1,[r0]

        ldr r0,=0x1900030c ;change bus mode to memory mode
        ldr r1,=0x8417
        strh r1,[r0]

        ldr r0,=0x18000022 ;use IRQ0
        ldr r1,=0x0000
        strh r1,[r0]

        ldr r0,=0x18000158 ;set MAC
        ldr r1,=0x1412
        strh r1,[r0]
       
        ldr r0,=0x1800015a
        ldr r1,=0x1816
        strh r1,[r0]

        ldr r0,=0x1800015c
        ldr r1,=0x1c1a
        strh r1,[r0]


        ldr r0,=0x18000112 ;set LineCtl to enable RX and TX
        ldr r1,=0x00d3
        strh r1,[r0]
       
        ldr r0,=0x18000102 ;set RXCfg to enable RX Done Interupt
        ldr r1,=0x3903
        strh r1,[r0]

        ldr r0,=0x18000104 ;set RXCtl to recieve Individual and Broadcast Addr
        ldr r1,=0x3d05
        strh r1,[r0]

        ;Setup EINT9
        ldr        r0,=GPGCON  ; Config GPG1 as EINT9
        ldr        r1,=0x08               
        str        r1,[r0]

        ldr        r0,=EXTINT1 ; config EINT9 as high level
        ldr        r1,=0x10               
        str        r1,[r0]

        ;clear all the interupts
        ldr        r0,=EINTPEND  ;clear External INT Reg
        ldr        r1,=0x200               
        str        r1,[r0]

        ldr        r0,=SRCPND ;Clear SRCPND
        ldr        r1,=0xffffffff
        str        r1,[r0]
       
        ldr        r0,=SUBSRCPND ;Clear SUBSRCPND
        ldr        r1,=0x7ff
        str        r1,[r0]

        ldr        r0,=INTPND ;Clear INTPND
        ldr        r1,=0xffffffff
        str        r1,[r0]

        ;Setup Stack Pointer
        mrs        r0,cpsr
        bic        r0,r0,#MODEMASK
        orr        r1,r0,#UNDEFMODE|NOINT
        msr        cpsr_cxsf,r1  ;UndefMode
        ldr        sp,=UndefStack
       
        orr        r1,r0,#ABORTMODE|NOINT
        msr        cpsr_cxsf,r1  ;AbortMode
        ldr        sp,=AbortStack

        orr        r1,r0,#IRQMODE|NOINT
        msr        cpsr_cxsf,r1  ;IRQMode
        ldr        sp,=IRQStack
   
        orr        r1,r0,#FIQMODE|NOINT
        msr        cpsr_cxsf,r1  ;FIQMode
        ldr        sp,=FIQStack

        orr        r1,r0,#USERMODE
        mov        r1,r0
        and        r1,r0,#0xffffff7f        ;Open IRQ INT
        msr        cpsr_cxsf,r1  ;USRMode
        ldr        sp,=UserStack


        ;open interupt
        ldr        r0,=EINTMASK  ; clear mask for EINT9
        ldr        r1,=0x00fffdf0               
        str        r1,[r0]

        ldr        r0,=INTMSK ;Open Uart0, timer4 and EINT
        ldr        r1,=0xEFFFBFCF
        str        r1,[r0]

        ldr        r0,=INTSUBMSK ;Open Uart0 Sub Int
        ldr        r1,=0x7f8
        str        r1,[r0]

        IMPORT __main
        b __main

HandlerIRQ
        stmfd        sp!,{r0-r12,lr}
       
        ldr        r0,=INTMSK  ;all interrupt disable
        ldr        r1,=0xffffffff  
        str        r1,[r0]

        ldr        r0,=INTSUBMSK  ;all sub interrupt disable
        ldr        r1,=0x7ff
        str        r1,[r0]

        bl        HandleIRQ

        ldr        r0,=EINTPEND  ;clear External INT Reg
        ldr        r1,=0x200               
        str        r1,[r0]

        ldr        r0,=SRCPND ;Clear SRCPND
        ldr        r1,=0xffffffff
        str        r1,[r0]
       
        ldr        r0,=SUBSRCPND ;Clear SUBSRCPND
        ldr        r1,=0x7ff
        str        r1,[r0]

        ldr        r0,=INTPND ;Clear INTPND
        ldr        r1,=0xffffffff
        str        r1,[r0]
       
        ldr        r0,=INTMSK ;Open Uart0, timer4 and EINT
        ldr        r1,=0xEFFFBFCF
        str        r1,[r0]

        ldr        r0,=INTSUBMSK ;Open Uart0 Sub Int
        ldr        r1,=0x7f8
        str        r1,[r0]

        ldmfd        sp!,{r0-r12,lr}

        subs        pc,lr,#4



void PrintChar(unsigned char tmp)
{
        URXH0 = tmp;
}

void delay(int tmp)
{
        unsigned int i;
        int loop =1000;
        for (;tmp>0; --tmp)
        {
                for (i = 0; i < loop; ++i);
        }
}

void PrintStr(char * Str)
{
        unsigned int i;
        i = 0;
        for (i = 0; 1; ++i)
        {
                if ('\0' == Str) return;
                while(!(rUTRSTAT0 & 0x2));
                delay(10);
                PrintChar(Str);
        }
}

void CheckEtherEngine()
{
}

void SendPacket(void *Data, size_t Length)
{
        unsigned short BusState = 0;
        unsigned short *Addr = (unsigned short *)Data;
        unsigned short Tmp;
        (*(volatile unsigned short*)0x18000144) = 0x00c9; /*TXCMD*/
        (*(volatile unsigned short*)0x18000146) = (unsigned short)Length; /*TXLEN*/
        do
        {
                BusState = (*(volatile unsigned short*)0x18000138);
                delay(100);
        }while (0 == (BusState & 0x0100));

        for (; Length > 0; Length -= 2)
                (*(volatile unsigned short*)0x18000a00) = *Addr++;

}

__value_in_regs struct __initial_stackheap __user_initial_stackheap(
        unsigned R0, unsigned SP, unsigned R2, unsigned SL)
{
    struct __initial_stackheap config;
   
    config.heap_base = 0x33000000;/*(int)&Image$$ZI$$Limit;*/

    config.stack_base = SP;

    return config;
}

int main()
{
        unsigned short Tmp = 0;
        unsigned short i = 0;
        unsigned Length;
        unsigned char ARPPacket[] = {
        0xff,0xff,0xff,0xff,0xff,0xff,
        0x12,0x14,0x16,0x18,0x1a,0x1c,
        0x08,0x06,
        0x00,0x01,0x08,0x00,0x06,0x04,0x00,0x01,
        0x12,0x14,0x16,0x18,0x1a,0x1c,
        0xc0,0xa8,0x00,0x06,
        0x00,0x00,0x00,0x00,0x00,0x00,
        0xc0,0xa8,0x00,0x01
        };

        CheckEtherEngine();
        while (1)
        {

                SendPacket(ARPPacket, 44);
                delay(2000);
/*
                do
                {
                        Tmp = (*(volatile unsigned short*)0x18000120);
                        delay(10);
                }while (0 == Tmp);

                Length = (*(volatile unsigned short*)0x18000402);
                for (i = 0; i < Length / 2; i++)
                {
                        Tmp = (*(volatile unsigned short*)(0x18000404 + i));
                        if (Tmp == 0) PrintStr("Packet Rcved!\n");
                }
*/
        }
       
        while(1);
        return 0;
}


void HandleIRQ()
{
        unsigned char IntSrc = *(volatile unsigned char *)0x4a000014;/*Interupt Offset Register*/
        unsigned short Tmp;
        unsigned short Length,i,Status,IntValue;
        switch (IntSrc)
        {
        case 28:

                break;
        case 14:
                break;
        case 5:
                IntValue = (*(volatile unsigned short*)0x18000120);
                if (0x0004 == (IntValue & 0x000f))
                {
                        Status = (*(volatile unsigned short*)0x18000400);
                        Length = (*(volatile unsigned short*)0x18000402);
                        for (i = 0; i < Length; i+=2)
                        {
                                Tmp = (*(volatile unsigned short*)(0x18000404));

                        }
                        Tmp = (*(volatile unsigned short*)0x18000124);
                }
                break;
        default:
                break;
        }
}

最新回复

不会,帮顶  详情 回复 发表于 2008-5-1 02:59
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
还有一个奇怪问题,8900说可以在0x404读取收到的包中的所有数据,但我只能通过Random Access,来读取数据。有朋友碰到过这个问题吗?
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这位仁兄。我也遇到了这个问题,不知你现在解决没有,如果解决了请告诉我一下,多谢了!
我的邮箱是personal_sun@163.com
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
读取了包数据后,再读一遍0x18000400即可。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
上面写错了,应该是0x18000120
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼主您好,能否将您的源码(ADS下CS8900)共享下,小弟研究半个月没有结果。谢谢。paulylogin@163.com.      我是在2440下面,
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
不会,帮顶
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表