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.

[参考译文] 编译器/TMDSICE3359:PRU 以太网问题

Guru**** 2943350 points

Other Parts Discussed in Thread: TLK110, TMDSICE3359, AM3358

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/674232/compiler-tmdsice3359-pru-ethernet-issue

器件型号:TMDSICE3359
主题中讨论的其他器件:TLK110AM3358

工具/软件:TI C/C++编译器

您好!

我使用 TMDSICE3359电路板、TLK110芯片 、在原理图中具有参考符号 U2。 我将其与计算机(Windows 10)连接、并使用 Wireshark 侦听以太网数据包。  TMDSICE3359电路板可读取并写入数据包、不会出现错误。

但并非所有计算机都可以从 TMDSICE3359电路板读取数据包。 大约40%的计算机无法读取这些数据包。 我用自己的主板(使用 am3358处理器)发现它不是操作系统的问题、一些以太网控制器会过滤这些数据包。 因此、我认为我在 MII PRU 的写数据包功能或设置上出错了。

当我使用 RX L1 FIFO -> TX L1 FIFO -> TX MII 端口数据路径模式时、所有计算机都可以正常工作。

我的设置:

RXCFG1 = 0x9 (RX_MUX_SEL = 1;RX_ENABLE = 1)

PRU->TX L1 FIFO -> TX MII 端口数据路径:TXCFG1 = 0x60400301 (TX_MUX_SEL = 1;TX_CLK_DELAY = 6;TX_START_DELAY = 0x40;TX_AUTO_SEQUENCE = 1;TX_ENABLE = 1)

PRU_ICSS_CFG 寄存器:

GP_CFG1 = 0x3 (PRU_GPI_MODE = Mi_RT_MODE)。

我的 PRU 代码:

void main (void)
{
//清除 SYSCFG[STANDBY_INIT]以启用 OCP 主端口*/
CT_CFG.SYSCFG_BIT.STANDBY_INIT = 0;

/* MII_loopback */
_R31 =(1<<18);//rx_reset
_R31 =(1<<30);//TX 复位

_DELAY_CYCLES (400);

volatile int i = 1;
易失性 uint32_t rx_data;


int arpArray[100]={
0xFFFF、//MAC
0xFFFF、
0xFFFF、
0x3412、//MAC
0x7856、
bbc9a、//
0x0608、//type ARP
0x0100、
0x0080、
0x0406、
0x0100、
0x3412、//MAC
0x7856、
bbc9a、
0x060a、//IP
0x0201、
0x0000、
0x0000、
0x0000、
0x060a、//IP
0x0101、
0x0000
};

(i=22;i<80;i++)
arpArray[i]= 0x0;

arpArray[0]= 0xFFFF;//如果没有此行,我写入错误的 MAC,我不知道
为什么 arpArray[30]= 0xeac7;//CRC
arpArray[31]= 0xfae9;//crc

//如果我用命令__R31 =(1<<29)|(1<26)|(1)|(1 <27)进行写入,我不知道为什么 CRC 不等于0x27

while (1)//此周期仅用于写入
{
对于(i=0;i<34;i++)
{
_R30 = 0xFFFFFF0000|ARpArray[i];//pack 数据
_R31 =(1<<25);//push to the MII TX
}

_R31 =(1<<29);//EOF

__DELAY_CYCLES (4000000);//数据包间的延迟
}

而(1)//此周期仅用于读取
{
RX_DATA =_R31;
_R31 =(1<<17);//rx_pop16

_DELAY_CYCLES (2);

if ((rx_data & 1<<18)&&(1<<18))//get word
{
CT_SHAREMDMEM.mem[i]= rx_data;//写入字以共享内存

i++;//指针
如果(I >= 3000)
I = 1;

/*清除标志*/
if ((rx_data & 1<<22)&&(1<<22))
_R31 =(1<<20);

CT_SHAREMDMEM.mem[0]= I;//将指针写入到共享内存
} 


首先、我想错误是在 CRC 字节 缺失的情况下发生的。 我尝试使用和不使用 CRC 字节、但结果相同。 有些计算机可以读取数据包、另一台计算机不能读取数据包。 我在 PRU 文档中查看电池组结构:

我不会对帧间逻辑感到担心。

Preambule 和 SFD 由 PRU 插入。

数据正常(我可以在 Wireshark 上看到)。

我不会对 CRC 感到担心。 添加时、Wireshark 会显示并写入 CRC 正确。