打印
[ZLG-ARM]

rtl8019as网络调试不通求助!

[复制链接]
3147|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luogs|  楼主 | 2007-3-13 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己做的板子,以太网芯片的连线完全参考周立功的开发板easyarm2200的原理图,现在Zlg_IPexauCOS-IIshiyan的那个程序调试不通.

我的板子与以太网有关的配置如下:
cpu: lpc2294,
没有外部flash,boot0,boot1均上拉,
ncs0接IS61LV25616AL,跟周立功的一样,
ncs3接RTL8019AS,数据/地址线和对RTL8019AS的IO线都与周立功的一致,只是A22、nCS3线上也串接了470R电阻.

我在easyarm2200的开发板上换上了lpc2294后Zlg_IPexauCOS-IIshiyan在开发板上运行正常,但是Zlg_IPexauCOS-IIshiyan在我自己的板子上运行后从pc上ping不通,但是pc任务栏的"本地连接"显示可以看到在lpc2294运行起来后"本地连接"的断开图标显示连接上网络了,使用Zlg_IPexa上位机软件UDPtest的pc测试程序也不通(ip等设置没有错误).

总共做了3块板,每一块都不通,看来不是偶然问题.

我对以太网不熟,有调过的大侠帮帮忙看看是什么问题,板子上的其他7个接口模块都调试通了,郁闷啊!

周立功的技术支持帮忙看看, 谢谢了!

还需要知道什么现象,我测好后附在楼下.

谢谢了先!


相关帖子

沙发
luogs|  楼主 | 2007-3-13 16:54 | 只看该作者

RTL8019AS不通的现象

程序启动时LED2(LED_TX)闪几下,
LED1(LED_RX/LED_CRS)始终亮灯,
LED0(LED_LINK)始终灭灯.

使用特权

评论回复
板凳
pengdeyou| | 2007-3-14 08:43 | 只看该作者

up

是不是电源的问题?
rtl8019as用的是5v的电源

使用特权

评论回复
地板
luogs|  楼主 | 2007-3-14 10:57 | 只看该作者

up

电源+5v,测过正常.
是不是周立功的程序或者.scf需要修改?

使用特权

评论回复
5
pengdeyou| | 2007-3-14 11:03 | 只看该作者

看看是不是片选的问题

也就是重映射那一部分

使用特权

评论回复
6
pengdeyou| | 2007-3-14 11:07 | 只看该作者

周的板子上有外部存储器,不知道你的板子上有没有

使用特权

评论回复
7
luogs|  楼主 | 2007-3-14 11:35 | 只看该作者

up

周立功和我的都是接到nCS3上的,
周立功的板子是跳到bank0-ram,bank1-flash,
我的板子只在bank0接了同样的ram,bank1没有flash,是接的两片FPGA,我的程序大小可以在2294的内部flash放下,就不需要外部flash了.bank2接的是两片nand flash,应该也没有影响.
我怀疑是不是rtl8019as的驱动需要修改一下,但是我仔细检查过,我的对rtl8019as io/data/address/ncs3/nwe/noe 连线与周立功的一致.

楼上的大侠再帮忙想想.

使用特权

评论回复
8
pengdeyou| | 2007-3-14 13:51 | 只看该作者

你在哪个地方给MEMMAP付值?值是多少?

使用特权

评论回复
9
luogs|  楼主 | 2007-3-14 14:29 | 只看该作者

up

使用的周立功的启动代码,

void TargetResetInit(void)
{
#ifdef __DEBUG    
    MEMMAP = 0x3;                   //remap
#endif

#ifdef __OUT_CHIP    
    MEMMAP = 0x3;                   //remap
#endif

#ifdef __IN_CHIP    
    MEMMAP = 0x1;                   //remap
#endif

    PINSEL0 = (PINSEL0 & 0xFFFF0000) | 0x05 | 0x50;

/* 设置系统各部分时钟 */
    PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
    VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
    VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
    VPBDIV = 1;
#endif

#if (Fcco / Fcclk) == 2
    PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
    PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
    PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
    PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
    while((PLLSTAT & (1 << 10)) == 0);
    PLLCON = 3;
    PLLFEED = 0xaa;
    PLLFEED = 0x55;

/* 设置存储器加速模块 */
    MAMCR = 0;
#if Fcclk < 20000000
    MAMTIM = 1;
#else
#if Fcclk < 40000000
    MAMTIM = 2;
#else
    MAMTIM = 3;
#endif
#endif
    MAMCR = 2;

/* 设置串行口 */
    InitialiseUART0(115200);

/* 设置实时时钟 */
    CCR = 1;
    PREINT = Fpclk / 32768 - 1;
    PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
    YEAR = 2003;
    MONTH = 6;
    DOM = 2;
    

    VICIntEnClr = 0xffffffff;
    VICVectAddr = 0;
    VICIntSelect = 0;
    T0IR = 0xffffffff;
    T0TCR = 0X02;
}

在start.s中调用的:

;定义堆栈的大小
FIQ_STACK_LEGTH         EQU         0
IRQ_STACK_LEGTH         EQU         9*8  
ABT_STACK_LEGTH         EQU         0
UND_STACK_LEGTH         EQU         0

NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

PINSEL2     EQU 0xE002C014

BCFG0       EQU 0xFFE00000
BCFG1       EQU 0xFFE00004
BCFG2       EQU 0xFFE00008
BCFG3       EQU 0xFFE0000C


;引入的外部标号在这声明
    IMPORT  FIQ_Exception                   ;快速中断异常处理程序
    IMPORT  __main                          ;C语言主程序入口 
    IMPORT  TargetResetInit                 ;目标板基本初始化
    IMPORT  StackUsr
    IMPORT  bottom_of_heap
    IMPORT  SoftwareInterrupt

;给外部使用的标号在这声明
    EXPORT  Reset
    EXPORT  __rt_div0
    EXPORT  __user_initial_stackheap

    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY
;中断向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     0
IRQ_Addr            DCD     0
FIQ_Addr            DCD     FIQ_Handler

;未定义指令
Undefined
        B       Undefined

;取指令中止
PrefetchAbort
        B       PrefetchAbort

;取数据中止
DataAbort
        B       DataAbort

;快速中断
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

InitStack    
        MOV     R0, LR

;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;设置系统模式堆栈
        MSR     CPSR_c, #0xdf
        LDR     SP, =StackUsr

        MOV     PC, R0

ResetInit
;初始化外部总线控制器,根据目标板决定配置

        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, =0x0f814910
    ELSE
        LDR     R1, =0x0f814914
    ENDIF
        STR     R1, [R0]

        LDR     R0, =BCFG0
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

        LDR     R0, =BCFG1
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

;        LDR     R0, =BCFG2
;        LDR     R1, =0x2000ffef
;        STR     R1, [R0]

        LDR     R0, =BCFG3
        LDR     R1, =0x10001460;0x2000ffef
        STR     R1, [R0]
        
        BL      InitStack               ;初始化堆栈
        BL      TargetResetInit         ;目标板基本初始化
                                        ;跳转到c语言入口
        B       __main


__user_initial_stackheap    
    MOV   pc,lr

__rt_div0
        B       __rt_div0

StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

IF :DEF: EN_CRP
        IF  . >= 0x1fc
        INFO    1," The data at 0x000001fc must be 0x87654321. Please delete some source before this line."
        ENDIF
CrpData
    WHILE . < 0x1fc
    NOP
    WEND
CrpData1
    DCD     0x87654321          ;/* 当此数为0x87654321时,用户程序被保护 */
    ENDIF

;/* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT, ALIGN=2
IrqStackSpace           SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间
FiqStackSpace           SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间
AbtStackSpace           SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间
UndtStackSpace          SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈
    END

使用特权

评论回复
10
luogs|  楼主 | 2007-3-15 09:29 | 只看该作者

还没调通,大侠帮帮忙啊!

仍没调通,自己先顶一下,
插上网线后ping总是reques time out.
使用周立功的zlg_ip的例程,使用上位机软件UDPtest的pc端的udp测试程序,在axd中调试停不到
 void TaskB(void *pdata) 

{
void * UdpTemp;
uint8 eer;    

    while (1)
    {
    UdpTemp=OSQPend(RecUdpQFlag,0,&eer);
           if(eer==OS_NO_ERR)
    {
        Udp_Process((Rec_Ptr *)UdpTemp);
        eer=eer;
    }
        
    }    
}
函数的Udp_Process((Rec_Ptr *)UdpTemp);行,看来是没有接收到数据.

怎么确定是程序的问题还是硬件上的问题呢?

使用特权

评论回复
11
luogs|  楼主 | 2007-3-15 09:34 | 只看该作者

rtl8019as的原理图

同上

使用特权

评论回复
评论
yuhanzi 2018-4-30 16:13 回复TA
请问能不能把你AD库里的RTL8019as和HR901170A或者有H1102nl一起分享发给我?谢谢 
12
luogs|  楼主 | 2007-3-15 17:27 | 只看该作者

up

好像是我的pcb封装有误.

使用特权

评论回复
13
luogs|  楼主 | 2007-3-15 17:28 | 只看该作者

附上pcb封装HR901170A

up

使用特权

评论回复
14
chengxupin| | 2007-3-15 17:44 | 只看该作者

看看有没有器件焊错,特别是电容,有没有0.01焊成0.1

使用特权

评论回复
15
南方亿扬| | 2007-3-18 22:06 | 只看该作者

同意14楼的意见。要仔细检查,多换换

使用特权

评论回复
16
luogs|  楼主 | 2007-3-19 09:26 | 只看该作者

我已经把我的RJ45头线跳好了,问题还是依旧!

我的RJ45头管脚排列确实有误,使用了8根约10cm长的线正确的接法跳好了,插上交叉网线时pc上能显示联网状态,下面运行起来程序时仍然ping不通.

我问一下,一般芯片有nCS,RTL8019AS没有nCS线,cpu的nCS线接到的是地址线SA5上,如果cpu的外部总线上的ncs0,ncs1,ncs2上都有器件,那么怎么防止总线冲突的呢?

使用特权

评论回复
17
luogs|  楼主 | 2007-3-19 14:32 | 只看该作者

up

在arm里当pc发送数据时可以进到hardware.c的uint8 Rec_Packet()函数里,
不过每次都进入了
//=====================以上各步操作表示读入的数据包有效
        //0:接收状态;1:下一包的指针;2:本包高位;3:本包低位;
        if(((tmp[0]&0x0001)==0)||((tmp[0]&0xff00)>0x7f00)
            ||((tmp[0]&0xff00)<0x4c00)||(tmp[1]>0x0600))
        {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1536字节
            page(1);
            curr=ReadFromNet(0X07);     //page1读取CURR的值
            page(0);        //切换回page0
            bnry = curr -1;    //把bnry恢复为下16K中的空余部分
            if(bnry < 0x4c) 
            {
                bnry =0x7f;
            }
            WriteToNet(0x03,bnry);     //把BNRY恢复到指向下一帧write to bnry        
            WriteToNet(0x07,0xff);        //清除中断标志
            //goto rea1;
            OS_EXIT_CRITICAL();
            return(0);
        }//end of if(((tmp[0]&0x0001)
        //=============================================
        else//表示数据包是完好的.读取剩下的数据
{ ....}
的if里面,
难道是传输中的错误率太高?
我的RJ45上的跳线大约有10cm长,都是人工双绞了的.

使用特权

评论回复
18
luogs|  楼主 | 2007-3-19 17:01 | 只看该作者

up

去掉了RJ45跳线,全速运行跳过启动时的收发数据,然后单步跟踪,
使用pc "UDPtest" 发送数据,可以在"Hardware.c"的
uint8 Rec_Packet() 
{
...
//0:接收状态;1:下一包的指针;2:本包高位;3:本包低位;
        if(((tmp[0]&0x0001)==0)||((tmp[0]&0xff00)>0x7f00)
            ||((tmp[0]&0xff00)<0x4c00)||(tmp[1]>0x0600))
        {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1536字节
            page(1);
            curr=ReadFromNet(0X07);     //page1读取CURR的值
            page(0);        //切换回page0
            bnry = curr -1;    //把bnry恢复为下16K中的空余部分
            if(bnry < 0x4c) 
            {
                bnry =0x7f;
            }
            WriteToNet(0x03,bnry);     //把BNRY恢复到指向下一帧write to bnry        
            WriteToNet(0x07,0xff);        //清除中断标志
            //goto rea1;
            OS_EXIT_CRITICAL();
            return(0);
        }//end of if(((tmp[0]&0x0001)
        //=============================================
        else//表示数据包是完好的.读取剩下的数据
        {
            WriteToNet(0x09,bnry);       //RSAR1写入读页地址的高字节//read page address high
            WriteToNet(0x08,4);          //RSAR0写入读页地址的低字节//read page address low
            WriteToNet(0x0b,tmp[0]);      //RSCR1写入读取字节计数高字节//read count high
            WriteToNet(0x0a,tmp[1]);    //RSCR0写入读取字节计数低字节//read count low;
            
            WriteToNet(0x00,0x0a);     //启动Remote DMA读操作
            //read dma
            
            length=tmp[1];//计算出要读取的帧的长度
            
            for(ii=0;ii<((length+1)/2);ii++)
            {
                *REC_BUFF_PTR_WORDS=ReadFromNet(0x10);
                REC_BUFF_PTR_WORDS++;
            }
            //================终止DMA操作
            WriteToNet(0x0b,0x00);            //RSCR1写入读取字节计数高字节//read count high   
            WriteToNet(0x0a,0x00);            //RSCR0写入读取字节计数高字节//read count low;
            WriteToNet(0x00,0x22);            //结束或放弃DMA操作//结束或放弃DMA
            //============================
        }//end of else
...
}
的 else 后停下,看来可以接收到数据了,
(从REC_BUFF[REC_BUFF_NUM].words中看数据看不出来,不懂帧结构啊.)
但是不能触发 void Send_Packet(struct _pkst *TxdData).
(Zlg_IPexampleuCOS-IIshiyan程序的UDP是echo的功能)

只好再去读原程序了.



使用特权

评论回复
19
luogs|  楼主 | 2007-3-21 08:06 | 只看该作者

up

已经调通了,感谢各位热心帮助的朋友.

主要是:
1. RJ45的管脚做错了.
2. 重新焊了电阻和电容,估计是有的电容焊错了,原因正在查找.

谢谢!

使用特权

评论回复
20
xfarm| | 2007-3-21 11:25 | 只看该作者

以后发现问题,要先找自己的毛病!

使用特权

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

本版积分规则

11

主题

70

帖子

0

粉丝