工具/软件:TI-RTOS
您好!
我将 AM37x 与 LAN9221搭配使用。
在接收数据包时、我们会遇到一个问题、
在某些情况下 、检测到的数据包会忽略前4个字节、
例如、不是获取良好的数据包:
0A 1b 3c 4D 5e 6F 50 7b 9d A6 4c 39 08 06 00 01
08 00 06 04 00 01 50 7b 9d A6 4c 39 c0 A8 01 6e
0A 1b 3c 4D 5e 6F c0 A8 01 64 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 23 51 d6 1c
我们得到的是以下错误数据包、其中省略了前4个字节:
5e 6F 50 7b 9d A6 4c 39 08 06 00 01 08 00 06 04
00 01 50 7b 9d A6 4c 39 c0 A8 01 6e 0A 1b 3c 4D
5e 6F c0 A8 01 64 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 23 51 d6 1c 00 00 00 00 00
如您所见、目标 MAC 地址中的前4个八位位组(来自6个八位位组 MAC 地址)、
都丢失了。
我们使用与 u-boot 相同的驱动程序、如下所示。
如果有什么想法会产生这种影响,您能告诉我们吗?
这是高度安全的产品、我们不确定如何处理此问题。
测试是 PC 和目标之间的 UDP 交替:PC 向目标发送 UDP 缓冲区、然后等待接收到的数据包、验证其与发送的数据包相同、然后继续发送下一个缓冲区、目标等待来自 PC 的缓冲区、 在接收缓冲区中,将准确的内容发送回 PC,即它是完全同步的测试,在该测试中,发送仅在接收完成后完成(在两侧)。
该目标基于 TI 的以太网控制器 LAN9221芯片。 接收缓冲区的例程(来自 u-boot 代码)为:
int ETH_Rx (空)
{
u32 *数据;//(u32 *)&g_NetRxPackets[0];
u32 pktlen、tmplen;
U32状态;
int ret =确定;
if ((ETH_REG_READ (RX_FIFO_INF)& RX_FIFO_INF_RXSUSED)>> 16){
STATUS = ETH_REG_READ (RX_STATUS_FIFO);
pktlen =(status & RX_STS_PKT_LEN)>> 16;
ETH_REG_WRITE (RX_CFG、0U);
tmplen =(pktlen + 2U+ 3U)/ 4U;
if (tmplen >= EMAC_packet_MAX_SIZE)
{
RET =错误;
}
其他
{
数据= g_NetRxPackings[g_NetRxPoolHdr];
while (tmplen--)
*DATA++= ETH_REG_READ (RX_DATA_FIFO);
IF (STATUS & RX_STS_ES)
{
APP_TRACE_ERR ("错误、丢弃数据包);
RET =错误;
}
其他
{
G_NetRxPacketsLength [g_NetRxPoolHdr]= pktlen;
RET =(int) g_NetRxPacketsLength [g_NetRxPoolHdr];
}
G_NetRxPoolHdr++;
if (g_NetRxPoolHdr >= MAX_packets){g_NetRxPoolHdr = 0;}
}
}
回程;
}
似乎、如果从 PC 发送的消息恰好在从 PC 发送下一条 UDP 消息之前发送、那么它会使目标像此处所述的那样产生这种混乱、
即、如果从 PC 发送另一个数据包(不是此 UDP 乒乓测试的一部分)、则会导致接收到此不良数据包。
我曾尝试思考为什么这种情况会导致此类行为(数据包中丢失4个字节)、但还没有任何线索。
此问题是否与 GPMC 配置有关?
此致、
已运行