This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3359的千兆网能接收到数据包,但发送一直出不来

Other Parts Discussed in Thread: TMDSSK3358, AM3359

板子是官方的TMDSSK3358,跑的裸机,连接路由器能把路由器发出的任意数据包接收到,CPSW的统计寄存器组能正确统计到网络上的所有数据包,很多数据包能被CPSW转发到我定义的接收缓存中,从以上来看,是不是能很明确的说明:

1 我的EMAC模块时钟配置应该是没问题的吧?

2能接收到,说明接收描述符的配置是正确的吧?至少配置的大方向应该没错吧?目前我是测试,不区分数据,只要路由器或者路由器连接的PC有数据发出来,都会被CPSW统计到。

我的数据发送,目前在AM3359的千兆网寄存器CPSW_CPDMA的DMA状态寄存器DMASTATUS中没有任何报错,发送完数据中断状态寄存器的标志位都能被置位,所以我觉得应该还有哪个寄存器没有配置正确,但一时又看不出应该是哪里

不知道TI那边有没有对sitara系列千兆网这块的单独的文档资料参考下

  • 请参考PSDK的例程。可以测试一下回环,如果可以的话说明emac部分配置应该是没有问题的。
    software-dl.ti.com/.../index_device_drv.html
  • OK了,是寄存器配置的缘故,ALE地址寻找引擎寄存器组的PORTCTL0--5里面,我用的端口是0和1,就把PORTCTL0和1的PORT_STATE设置为3:允许转发,然后发送就可以了,能用转包程序wireshark看到我发出的包了,网口灯一直闪烁
  • TI有没有关于sitara系列千兆网口里面ALE这个模块功能的专门的文档之类的资料啊,目前虽然硬件上都打通了,但数据收发还是有些问题,感觉主要问题在ALE这个模块功能上面,相关功能好多地方理解不清,感觉ALE应该是个类似数据包过滤的功能吧。
    我现在遇到的问题主要是:
    1 在MDIO中断里面检测到网线插上后,在此中断里面发出一个DHCP的Discover包,然后路由器回应了该包,说明发送没有问题,MDIO 中断也没有问题,如果我关掉接收中断,只保留这个MDIO中断,不停的拔掉网线在插上的话,3359会不停的发这个数据包出来,抓包软件观察结果是数据包完全正确。
    2 网口接收中断接收到这个路由器回应的数据包后,如果系统处于调试模式的自由运行状态,则一进接收中断,系统就跑飞,我判断进了接收中断,是因为接收中断里面有个点亮LED的语句,进中断后LED亮了。如果在接收中断里面打断点,则系统不停的进这个接收中断然后在断点处停下来,有时候会连续进很多次后就不在进接收中断,不管有没有数据发过来,系统也没有跑飞
    3 针对问题2,我为了判断是中断本身配置的问题,还是网口那边的配置问题,就用了另外一个板子(和3359没任何关系的一个单片机开发板子),不经路由器,将此板和3359板子用网线直接连接,然后不停的给3359发数据,结果就是3359的接收中断能很好的运行,对应的LED不停闪烁,然后在接收中断里面打断点,发现发过来的数据都被正确接收到了
    目前主要就是问题2一直不能得到解决,不知道哪里的问题,只是暂时怀疑是ALE模块的配置
  • sitara系列的没有看到除了TRM之外的文档有关于ALE的讲解,我在另一个型号的手册上看到有关于ALE的模块的讲解,可以参考看一下。
    www.ti.com.cn/.../sprugv9d.pdf
    根据3中断配置部分应该没有问题,我看到您再以下帖子中已经贴出MDIO的中断,能否将接受中断也贴出来一下。
    e2echina.ti.com/.../202848
    连接路由器不打断点的时候是只进一次中断就会跑飞吗?
  • 连接路由器不打断点的时候是只进一次中断就会跑飞吗?
    是的,只进了一次中断,然后就跑飞了
    以下是接收中断,比较简单
    void EtherNet_RX_ISR(void)
    {
    Uint32 Rxn_CP;

    INTCRegs->CTRL.bit.NewIRQAgr = 1;//允许下一个新的IRQ中断产生
    CPDMA_Regs->EOI_VECTOR.bit.VECTOR = 1;//写入接收中断结束向量1
    Rxn_CP = STATERAM_Regs->RXn_CP[0];
    STATERAM_Regs->RXn_CP[0] = Rxn_CP; //写入接收完成指针
    Init_ReceiveDescriptor(); //初始化接收描述符
    LED4 = ~LED4; //闪烁LED,指示接收中断正常
    }
  • 请跟进以下帖子,谢谢!
    e2e.ti.com/.../3695630