搜索
bottom↓
回复: 61

DM9000+linux+TCP,为何只有1.6MBytes每秒,速度损失在哪里?

[复制链接]

出0入0汤圆

发表于 2013-6-3 16:13:29 | 显示全部楼层 |阅读模式
DM9000+linux+TCP,为何只有1.6MBytes每秒,速度损失在哪里?

硬件:S3C2416(400MHz) + DDR2(266MHz) + DM9000cep
测试方法:client收到第一个数据(非文件名)包的时刻开始计时(调用time函数),接收完毕时刻结束计时(再次调用time函数)。速度=文件大小/两次时间差

各位前辈,大家好。最近我在做一个TCP文件传输的实验。但测试下来数据传输速度大概只有1.5MBytes每秒。我想知道,原本百兆网卡的DM9000,为什么速度会损失这么多呢?
理论上,100Mbps/10=10MBps,再扣除程序处理过程开销及由总线方式带来的内存访问耗时(估计在20%-30%)。那么还剩余7-8MBps。即使损耗达到50%,也还有5MBps。和我的1.5MBps还是差距太大。
不知道哪位前辈能给指点一二。

出0入0汤圆

发表于 2013-6-3 16:18:43 | 显示全部楼层
系统调用、协议栈、存储介质、文件系统
这些都要时间啊,而且都不少

出0入0汤圆

 楼主| 发表于 2013-6-3 17:20:10 | 显示全部楼层
jjldc 发表于 2013-6-3 16:18
系统调用、协议栈、存储介质、文件系统
这些都要时间啊,而且都不少

谢谢楼上的回复。文件系统的耗时我考虑了。在去掉文件的读写存储(单纯接收数据而不存储该文件)之后,速度也没有提升多少,还是只有1.6MBytes每秒左右。
然后系统调用、协议栈这两者可以促成10MBps 与 1.5MBps的差距吗?
头像被屏蔽

出0入0汤圆

发表于 2013-6-3 17:56:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2013-6-3 17:57:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2013-6-4 00:31:17 | 显示全部楼层
chiooo1 发表于 2013-6-3 17:57
100M以太网,UDP时  最高都能达到快80Mb了

非常感谢你的回复。按照你提供的文档,我在我的2416开发板上做了同样的测试。
结果让我很意外。我的DM9000网卡的数据吞吐量只有21Mbps-22Mbps。
并且我依照这篇文档修改了自己写的实验程序,速度也提高到了2MBytes每秒,与21Mbps-22Mbps 的吞吐量相吻合。
我推测是网卡驱动的问题。
目前我大略地看了一下《i.MX28_Linux_BSP_RM.pdf》中的第16章。发现在i.MX28用的网卡是用的DMA方式。
或许这是一个导致速度差距明显非常关键的因素。

明天我再好好研究研究。
再次感谢前辈指点。

出0入0汤圆

 楼主| 发表于 2013-6-4 00:32:54 | 显示全部楼层
chiooo1 发表于 2013-6-3 17:57
100M以太网,UDP时  最高都能达到快80Mb了

再一个就是。我没有找到 i.MX28 用的网卡的型号。

不知前辈能否提供一下。谢谢。

出0入0汤圆

发表于 2013-6-4 10:09:24 | 显示全部楼层
你的是外部网卡芯片吧,imx28应该是内部MAC,现在都是内部MAC,100M网卡一般能到95兆以上

出0入0汤圆

发表于 2013-6-4 10:14:20 | 显示全部楼层
ATMEL 9G20

集成网卡测试:
NETIO - Network Throughput Benchmark, Version 1.26
(C) 1997-2005 Kai Uwe Rommel

TCP connection established.
Packet size  1k bytes:  10491 KByte/s Tx,  11485 KByte/s Rx.
Packet size  2k bytes:  11278 KByte/s Tx,  11495 KByte/s Rx.
Packet size  4k bytes:  11563 KByte/s Tx,  11492 KByte/s Rx.
Packet size  8k bytes:  11573 KByte/s Tx,  11482 KByte/s Rx.
Packet size 16k bytes:  11577 KByte/s Tx,  11500 KByte/s Rx.
Packet size 32k bytes:  11588 KByte/s Tx,  11496 KByte/s Rx.
Done.




外扩DM9000CEP测试:
F:\Embeded OS\RT-Thread\netio126\bin>win32-i386.exe -t 192.168.1.249

NETIO - Network Throughput Benchmark, Version 1.26
(C) 1997-2005 Kai Uwe Rommel

TCP connection established.
Packet size  1k bytes:  3853 KByte/s Tx,  4550 KByte/s Rx.
Packet size  2k bytes:  4582 KByte/s Tx,  4619 KByte/s Rx.
Packet size  4k bytes:  4941 KByte/s Tx,  5017 KByte/s Rx.
Packet size  8k bytes:  4821 KByte/s Tx,  5008 KByte/s Rx.
Packet size 16k bytes:  5099 KByte/s Tx,  4928 KByte/s Rx.
Packet size 32k bytes:  5050 KByte/s Tx,  4959 KByte/s Rx.
Done.

出0入0汤圆

 楼主| 发表于 2013-6-4 10:50:44 | 显示全部楼层
luck851 发表于 2013-6-4 10:09
你的是外部网卡芯片吧,imx28应该是内部MAC,现在都是内部MAC,100M网卡一般能到95兆以上 ...

谢谢你的回复。
确实,目前很多芯片都集成了内部MAC。IMX28确实也是内部集成了MAC。
后面我会继续追查,把DM9000这种用总线方式访问的芯片的速度损耗查个明白。
虽然内部集成MAC之后运用DMA方式速度会提高很多。但我还是不愿意相信这么大的差距。
后面我再测试测试驱动部分的耗时。到底看看时间损失在哪里了。

再次感谢。

出0入0汤圆

发表于 2013-6-4 10:55:37 | 显示全部楼层
可以查查DM9000的手册,它的总线速度很慢的。
为了达到高吞吐量,用高位宽的总线,比如16/32Bit,然后尽量少的共享总线,才好用。否则IO带宽都有问题。

另外,先测试UDP。

出0入0汤圆

 楼主| 发表于 2013-6-4 11:15:25 | 显示全部楼层
ljt80158015 发表于 2013-6-4 10:14
ATMEL 9G20

集成网卡测试:

谢谢你的回复。
你给出的测试结果真的很诱人。猜测应该是用了某种技术吧。
首先,虽然集成网卡的测试成绩相当好。但考虑到集成的原因。我倒并不感到惊讶。
主要是后面外挂的DM9000CEP。能做到如此好的测试成绩确实让我感到很新奇。
9G20与2416同样是400MHZ,同样的DM9000CEP(总线访问方式)。结果差距还真不是一点半点。这个成绩恐怕不是随便就做出来吧。
不知前辈能否指点一二。

再次感谢。

出0入0汤圆

发表于 2013-6-4 11:22:00 | 显示全部楼层
sddzycnq 发表于 2013-6-4 11:15
谢谢你的回复。
你给出的测试结果真的很诱人。猜测应该是用了某种技术吧。
首先,虽然集成网卡的测试成绩 ...

其实和CPU关系很大,三星的CPU擅长的是运算,ATMEL的CPU擅长的是外设性能。

ATMEL的总线性能优于三星。


三星CPU内存测试:
CPU:S3C2440 400M主频
# ./memxferjj -s 1m 10 0 1 2 3 4 5 6 7 8
avg:    1048576  [ 0]"memcpy"                     34.037 MB/s
avg:    1048576  [ 1]"char *"                     19.303 MB/s
avg:    1048576  [ 2]"short *"                    26.910 MB/s
avg:    1048576  [ 3]"int *"                      34.012 MB/s
avg:    1048576  [ 4]"long *"                     33.780 MB/s
avg:    1048576  [ 5]"long * (4x unrolled)"       34.007 MB/s
avg:    1048576  [ 6]"int64 *"                    34.008 MB/s
avg:    1048576  [ 7]"double *"                   33.730 MB/s
avg:    1048576  [ 8]"double * (4x unrolled)"     34.110 MB/s

ATMEL内存测试:
CPU:9G20
# ./memxferj -s 1m 10 0 1 2 3 4 5 6 7 8
avg:    1048576  [ 0]"memcpy"                    113.321 MB/s
avg:    1048576  [ 1]"char *"                     42.339 MB/s
avg:    1048576  [ 2]"short *"                    64.539 MB/s
avg:    1048576  [ 3]"int *"                      93.716 MB/s
avg:    1048576  [ 4]"long *"                     92.974 MB/s
avg:    1048576  [ 5]"long * (4x unrolled)"       93.941 MB/s
avg:    1048576  [ 6]"int64 *"                    93.559 MB/s
avg:    1048576  [ 7]"double *"                   93.810 MB/s
avg:    1048576  [ 8]"double * (4x unrolled)"     93.685 MB/s
-----------------------------------------------------------------------------------------------------------------------------------------

三星CPU运算能力测试:
CPU:S3C2440  400M主频

-I- 33684 Dhrystone per second
-I- 165011 Dhrystone per second
-I- 165011 Dhrystone per second
-I- 165928 Dhrystone per second
-I- 165928 Dhrystone per second
-I- 165451 Dhrystone per second
-I- 165451 Dhrystone per second
-I- 166049 Dhrystone per second
-I- 166049 Dhrystone per second
-I- 164484 Dhrystone per second
-I- 164484 Dhrystone per second
-I- 166052 Dhrystone per second
-I- 166052 Dhrystone per second
-I- 165491 Dhrystone per second
-I- 165491 Dhrystone per second
-I- 165751 Dhrystone per second
-I- 165751 Dhrystone per second
-I- 165641 Dhrystone per second
-I- 165641 Dhrystone per second

ATMEL运算能力测试:
CPU:9G40
-I- 127804 Dhrystone per second
-I- 127804 Dhrystone per second
-I- 128044 Dhrystone per second
-I- 128044 Dhrystone per second
-I- 128027 Dhrystone per second
-I- 128027 Dhrystone per second
-I- 128062 Dhrystone per second
-I- 128062 Dhrystone per second
-I- 128012 Dhrystone per second
-I- 128012 Dhrystone per second
-I- 128036 Dhrystone per second
-I- 128036 Dhrystone per second
-I- 128049 Dhrystone per second
-I- 128049 Dhrystone per second
-I- 128069 Dhrystone per second
-I- 128069 Dhrystone per second
-I- 128037 Dhrystone per second
-I- 128037 Dhrystone per second
-I- 128066 Dhrystone per second

出0入0汤圆

发表于 2013-6-4 11:25:04 | 显示全部楼层
//三星CPU: S3C2440  400MHZ
//网卡:DM9000EP
C:\>win32-i386 -t 192.168.1.6
NETIO - Network Throughput Benchmark, Version 1.26
(C) 1997-2005 Kai Uwe Rommel

TCP connection established.
Packet size  1k bytes:  2174 KByte/s Tx,  1805 KByte/s Rx.
Packet size  2k bytes:  2168 KByte/s Tx,  1694 KByte/s Rx.
Packet size  4k bytes:  2461 KByte/s Tx,  2058 KByte/s Rx.
Packet size  8k bytes:  2743 KByte/s Tx,  2079 KByte/s Rx.
Packet size 16k bytes:  2709 KByte/s Tx,  2086 KByte/s Rx.
Packet size 32k bytes:  2925 KByte/s Tx,  2156 KByte/s Rx.
Done.

出0入0汤圆

发表于 2013-6-4 13:46:45 | 显示全部楼层
实际开发中发现三星和ATMEL同主频情况下性能还真不是一个档次的.9G45 100M网口 我实测能到90Mbps左右.

出0入0汤圆

 楼主| 发表于 2013-6-4 15:09:01 | 显示全部楼层
dr2001 发表于 2013-6-4 10:55
可以查查DM9000的手册,它的总线速度很慢的。
为了达到高吞吐量,用高位宽的总线,比如16/32Bit,然后尽量 ...

非常感谢前辈指点。
目前我手头这块板子上的DM9000确实是用的16位总线方式。
关于DM9000手册中总线速度,我有些疑问,还请前辈指点:(以下是我的分析)
每次对于DM9000的内部寄存器的读写,耗时均约为120ns左右。我看到LINUX的DM9000驱动中每次收一个package对就的操作是:(只列出操作DM9000寄存器的相应的步骤)
1.dummy read
2.是否有包裹到来
3.读取包裹长度
4.读取包裹

以上四步我认为只有1和3两个步骤是读取内部寄存器,所以耗时为240ns。2和4步骤是读取总线(总线速度为100MHZ,又因为总线位宽为16位。所以我认为这不会成为100Mbps网卡的运输瓶颈)。所以耗时的地方就在于每个包裹需要240ns的额外时间。假设收到一个1KBytes的包裹,总线读取需要64个时钟即64ns。到这里,我之前假设的不会是瓶颈,反倒真正成为了瓶颈。因为1KBytes / (240+64) = 27Mbps ,况且还要扣除程序处理的开销。至些也就解释了为什么之前我用三楼的方法测试出的数据吞量为21Mbps的原因了。

不知我以上的分析是不是正确的。还请前辈多多指点。

出0入0汤圆

 楼主| 发表于 2013-6-4 15:12:36 | 显示全部楼层
ljt80158015 发表于 2013-6-4 11:22
其实和CPU关系很大,三星的CPU擅长的是运算,ATMEL的CPU擅长的是外设性能。

ATMEL的总线性能优于三星。

哇,前辈。你是做什么工作的啊。测试方法好全面啊。那些测试工具是自己写的吗?

出0入0汤圆

 楼主| 发表于 2013-6-4 15:15:38 | 显示全部楼层
ljt80158015 发表于 2013-6-4 11:25
//三星CPU: S3C2440  400MHZ
//网卡:DM9000EP
C:\>win32-i386 -t 192.168.1.6

嗯。你的这个结果与我在2416上测试的结果差不多。
看样子好像你讲的“三星的CPU擅长的是运算,ATMEL的CPU擅长的是外设性能”是有些吻合的。
唉,这样的话,难道选型选错了?要重新选吗?MY GOD.

谢谢前辈指点啊。

出0入0汤圆

 楼主| 发表于 2013-6-4 15:19:07 | 显示全部楼层
MadCat 发表于 2013-6-4 13:46
实际开发中发现三星和ATMEL同主频情况下性能还真不是一个档次的.9G45 100M网口 我实测能到90Mbps左右.
...

选型的时候也想过用9G45的片子的。不过经理让我选款开发板,必须要带总线接口的(因为他要扩展CPLD用)。我找了一大圈也没找到哪款板子带总线接口。于是就放弃了。
其实当时我也看上9G45了。不过自己对这款芯片不太熟悉,怕耽误项目。于是就从LPC3250和S3C2416中选了2416.

谢谢你的指点啊。

出0入0汤圆

发表于 2013-6-4 15:39:49 | 显示全部楼层
sddzycnq 发表于 2013-6-4 15:19
选型的时候也想过用9G45的片子的。不过经理让我选款开发板,必须要带总线接口的(因为他要扩展CPLD用)。 ...

你是自己做板子还是买核心板?

出0入0汤圆

 楼主| 发表于 2013-6-4 15:48:44 | 显示全部楼层
ljt80158015 发表于 2013-6-4 15:39
你是自己做板子还是买核心板?

呵呵。情况是这样的。经理的要求是先买一块带外扩总线接口的开发板(开发平台)。在上面做验证实验。然后自己做板(经理负责硬件设计)。

谢谢你的回复。

出0入0汤圆

 楼主| 发表于 2013-6-4 23:16:49 | 显示全部楼层
ljt80158015 发表于 2013-6-4 15:39
你是自己做板子还是买核心板?

请问你销售核心板吗?

出0入0汤圆

发表于 2013-6-5 09:31:55 | 显示全部楼层
sddzycnq 发表于 2013-6-4 15:09
非常感谢前辈指点。
目前我手头这块板子上的DM9000确实是用的16位总线方式。
关于DM9000手册中总线速度, ...

建议再看看DM9000的总线时序。我懒得查手册了。印象中,DM9000的总线操作速度非常慢,大约100ns才能读/写一次,无论是寄存器还是数据。
即,如果用8Bit总线,10MBytes/s的单向数据流就把总线周期全占满,没办法干别的事情了;16Bit总线也就是刚刚满足双向百兆ETH的满带宽,而且依然是占满总线。

也就是说,
如果DM9000独立占有一条16Bit的外部总线,那么才可以满足100M ETH双向跑满的要求,而且,DM9000的访问必须用DMA才行;
如果DM9000和SDRAM,FPGA,SRAM,Flash之类的挂在一个总线上,分时复用,网络速度必然上不去。

再想想就能明白了。共享总线跑高性能是个问题,要不然大家也不会芯片内部用Bus Matrix。

出0入0汤圆

 楼主| 发表于 2013-6-5 12:31:48 | 显示全部楼层
dr2001 发表于 2013-6-5 09:31
建议再看看DM9000的总线时序。我懒得查手册了。印象中,DM9000的总线操作速度非常慢,大约100ns才能读/写 ...

非常感谢您的指导。醍醐灌顶的解释。
看了一下s3c2416 的总线结构,如图所示:


这样是不是可以说明由于(可能存在的)其它BUS Master 与DM9000的DMA争夺总线资源,导致DM9000只得到部分总线资源(按您之前分析,总线16bit 时,双向百兆刚刚满带宽)。所以会有速度损失。是这样吧?
如果是这样的话,若系统中无其它BUS Master 的话,是不是DM9000的速度就会提上来呢?
谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-6-5 14:23:23 | 显示全部楼层
sddzycnq 发表于 2013-6-5 12:31
非常感谢您的指导。醍醐灌顶的解释。
看了一下s3c2416 的总线结构,如图所示:

如果要跑满速度,按照图中的结构,假定DM9000挂在Flash/ROM那个总线上,那么,Flash/ROM那个总线上有且只能有DM9000的访问请求。
由于TCP/IP协议的处理也需要时间,因此从DM9000读写报文数据的操作必须使用DMA,一个一个读是没希望的事情。

放在三星2416这样的系统上,就需要满足:
1、系统运行时,所有的代码都跑在SDRAM上;Flash那个总线除了DM9000,不能有别的请求。
2、要DCache,否则SDRAM那边访问速度太慢了。
3、DM9000数据的IO必须用DMA。如果用指令逐个读写,会导致处理器处理报文时,必须中断DM9000的IO。
能否用DMA和硬件设计以及芯片的DMA控制器有关系。
基本上这样,速度都能跑满。

内置MAC的芯片之所以快,就是因为内部FIFO接口速度快,且有DMA直接写到主存。MAC层在哪里不重要,重要的是带宽和操作手段是否正确。

出0入0汤圆

 楼主| 发表于 2013-6-5 23:27:35 | 显示全部楼层
dr2001 发表于 2013-6-5 14:23
如果要跑满速度,按照图中的结构,假定DM9000挂在Flash/ROM那个总线上,那么,Flash/ROM那个总线上有且只 ...

谢谢您耐心的指点。我看了LINUX中DM9000的驱动,确定了它真就是一个一个读的,没有用DMA。关于DMA我再从LINUX内核中找找相关的驱动研究一下。看来内部带MAC的芯片要更有优势一些。
在大家,尤其是您的指点下,我收获很多。非常感谢。
此帖可以结帖了。
再次感谢。

出0入0汤圆

发表于 2013-6-7 17:47:14 来自手机 | 显示全部楼层
以前测的DM9000A还不一定比RTL8019AS的快,8019一个周期完成一个操作,同样的读,DM的要两个周期

出0入0汤圆

 楼主| 发表于 2013-6-8 09:11:33 | 显示全部楼层
rom 发表于 2013-6-7 17:47
以前测的DM9000A还不一定比RTL8019AS的快,8019一个周期完成一个操作,同样的读,DM的要两个周期 ...

谢谢这位朋友,我以前没接触过网卡。这是第一块。8019一个周期完成一个操作是什么意思?

出0入0汤圆

发表于 2013-6-8 09:17:21 | 显示全部楼层
sddzycnq 发表于 2013-6-8 09:11
谢谢这位朋友,我以前没接触过网卡。这是第一块。8019一个周期完成一个操作是什么意思? ...

数据和地址一个周期就传输完成

出0入0汤圆

 楼主| 发表于 2013-6-8 15:37:56 | 显示全部楼层
rom 发表于 2013-6-8 09:17
数据和地址一个周期就传输完成

哦。原来这样啊。抽空我研究研究你说的这款网卡。谢谢指点。

出0入0汤圆

发表于 2013-7-21 17:46:24 | 显示全部楼层
MARK一下 最近整网卡

出0入0汤圆

发表于 2013-7-21 21:49:16 | 显示全部楼层
marked      

出0入0汤圆

发表于 2013-7-22 10:58:06 | 显示全部楼层
不知道STM32的芯片+DP83848的网卡速度好像和楼主开始时候的测速差不多,我也在想办法看看怎么可以把速度提上去呢。。。。。。

出0入0汤圆

发表于 2013-7-22 11:01:57 | 显示全部楼层
rom 发表于 2013-6-7 17:47
以前测的DM9000A还不一定比RTL8019AS的快,8019一个周期完成一个操作,同样的读,DM的要两个周期 ...

RTL8019AS毕竟是10M的速率

DM9000A可是100M的速率啊

出0入0汤圆

发表于 2013-7-23 18:11:23 | 显示全部楼层
MadCat 发表于 2013-6-4 13:46
实际开发中发现三星和ATMEL同主频情况下性能还真不是一个档次的.9G45 100M网口 我实测能到90Mbps左右.
...

请问您怎么测的能到90多兆?我的怎么才1.4M呢。。。。

出0入0汤圆

发表于 2013-7-23 19:33:35 | 显示全部楼层
仔细读了两次,虽然不全懂,收货还是有些的,不知道楼主现在进度怎么样了?

出0入0汤圆

发表于 2013-8-26 10:26:15 | 显示全部楼层
chiooo1 发表于 2013-6-3 17:57
100M以太网,UDP时  最高都能达到快80Mb了

怎么才能达到80M?求解答

出0入0汤圆

发表于 2013-10-8 14:24:32 | 显示全部楼层
sddzycnq 发表于 2013-6-4 15:09
非常感谢前辈指点。
目前我手头这块板子上的DM9000确实是用的16位总线方式。
关于DM9000手册中总线速度, ...

您好  请问您  如果我将DM9000初始化成32为数据总线  那么地址总线也变成32位了吗?还是地址总线不变?

出0入0汤圆

发表于 2013-10-8 22:04:07 | 显示全部楼层
我记得论坛里有人把stm32优化出非常恐怖的速度。。。

出0入0汤圆

 楼主| 发表于 2013-10-10 13:42:28 | 显示全部楼层
image056 发表于 2013-10-8 14:24
您好  请问您  如果我将DM9000初始化成32为数据总线  那么地址总线也变成32位了吗?还是地址总线不变? ...

数据总线不是想设为多少就设为多少的。看芯片手册以及电路。DM9000AEP只支持8位和16位。电路上连接是16位。所以你可以设置DM9000AEP为16位或8位。

出0入0汤圆

 楼主| 发表于 2013-10-10 13:43:02 | 显示全部楼层
windrarara 发表于 2013-10-8 22:04
我记得论坛里有人把stm32优化出非常恐怖的速度。。。

哦?你指的哪款芯片?帖子能找到吗?

出0入0汤圆

发表于 2013-10-10 22:21:12 | 显示全部楼层
最近要学驱动了,标记一下,也许会用到。

出0入0汤圆

发表于 2013-10-10 22:45:42 | 显示全部楼层

出0入0汤圆

发表于 2013-10-12 14:16:55 | 显示全部楼层
dm9000表现确实差强人意.它不支持DMA对其操作,只能通过指令读取,所以速度上不去.

出0入0汤圆

 楼主| 发表于 2013-10-13 08:56:21 | 显示全部楼层
lubing521 发表于 2013-10-12 14:16
dm9000表现确实差强人意.它不支持DMA对其操作,只能通过指令读取,所以速度上不去. ...

嗯。确实是这样的。你用过的什么样的网卡芯片?有推荐吗?

出0入0汤圆

发表于 2013-10-13 10:02:11 | 显示全部楼层
sddzycnq 发表于 2013-10-10 13:42
数据总线不是想设为多少就设为多少的。看芯片手册以及电路。DM9000AEP只支持8位和16位。电路上连接是16位 ...

首先谢谢您的回复    dm9000aep 确实只有8、16位  那我换个说法  如果我使用8位  那么 CMD=1 肯定是输入8位数据  当 CMD=0时  我是输入8位地址还是16位地址呢?

出0入0汤圆

 楼主| 发表于 2013-10-13 13:36:31 | 显示全部楼层
本帖最后由 sddzycnq 于 2013-10-13 13:40 编辑
image056 发表于 2013-10-13 10:02
首先谢谢您的回复    dm9000aep 确实只有8、16位  那我换个说法  如果我使用8位  那么 CMD=1 肯定是输入8 ...


个人理解:
DM9000并不是memory like器件。不是*addr = val; val = *addr;的模式。如你所说CMD的高低决定数据还是“地址”。注意,这里的地址加了引号。原因如下:



手册中讲到到概念是INDEX,也就是索引。这段的大体意思是:DM9000提供了两个可以访问他的接口:一个是索引,一个是数据。(注意:这里的接口不要与数据总线和地址总线混淆)当CMD为0时是索引接口,当CMD为1时是数据接口。

其实INDEX这个名字取的比较好,意思就是当CMD为0时,先索引你要操作的寄存器。这时出现在DATA BUS上的数据为(下面你要操作的)寄存器地址。当CMD为1时,出现在DATA BUS上的数据为(前面你要操作的)寄存器要设置的值。重要的一点是要先索引寄存器再写寄存器的值,你会在Linux及U-boot中的代码中可以看到对于寄存器的操作都是成对存在的(对内部SRAM的操作比较特别,但宏观上也符合这里的说明)。

至于16位还是8位,指的并不是地址,而是数据总线的宽度。这里的16位还是8位仅影响出现有数据总线上的数据的有效位数(以及一些小细节,如:LED指示等)。
上面是理论,下面来点实践:

写寄存器,步骤:
1. 令CMD=0 同时数据总线上出现的是寄存器索引(如:FEH FFH 等等)。这句话的示意性的程序语言为:*(volatile *)addr = reg_index;(只要保证选中了网卡,并且addr的CMD对应位为0即可,而不用关心地址到底是多少)
2. 令CMD=1 同时数据总线上出现的是要设置的寄存器值。这句话的示意性的程序语言也是:*(volatile *)addr = reg_val;(同时也要保证选中了网卡,并且addr的CMD对应位为1,也不用关心地址到底是多少)
这样就把寄存器reg_index配置了reg_val值。

读寄存器,步骤:
1. 同写寄存器。
2. 令CMD=1 读数据总线即可得到相应的寄存器的值。这句话的示意性的程序语言也是:reg_val = *(volatile *)addr; (保证选中了网卡,并且addr的CMD对应位为1,不用关心地址到底是多少)
这样就读出了寄存器reg_index的值reg_val。

读数据包,步骤:
与读寄存器相类似,只是执行完第一个步骤之后,第二个步骤可以一直循环执行,直到读完一个包(怎么知道读完?这要先读出包长。具体还有一些细节,要看代码及芯片手册,这里就不赘述了)。

写数据包,步骤:
结合写寄存器与读数据包。即可理解。

前面讲到“16位还是8位,指的并不是地址,而是数据总线的宽度。”那么其中数据总线的位宽的配置是如何配置的呢?
答:通过Strap pin引脚(21脚EECS)来配置的,这是硬件配置)


讲到这里,(我认为^-^)你可能会发现对DM9000的理解有误(因为你说“我是输入8位地址还是16位地址呢?”)。

不知说的这些能否解释你的疑惑。如有不对,也请高手指正。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-10-13 15:20:45 | 显示全部楼层
sddzycnq 发表于 2013-10-13 13:36
个人理解:
DM9000并不是memory like器件。不是*addr = val; val = *addr;的模式。如你所说CMD的高低决定 ...

明白了   是我的理解有误  您的讲解非常仔细  谢谢您  论坛上有您这样热心的大神 是我辈之幸。

出0入0汤圆

 楼主| 发表于 2013-10-13 20:20:19 | 显示全部楼层
image056 发表于 2013-10-13 15:20
明白了   是我的理解有误  您的讲解非常仔细  谢谢您  论坛上有您这样热心的大神 是我辈之幸。 ...

客气。前辈不敢当。我也是菜鸟。以上仅是个人理解而已。论坛里本来就是大家互相帮助。共同进步。

出0入22汤圆

发表于 2013-10-13 20:39:50 | 显示全部楼层
看样子,w5300的引脚结构貌似要科学一些。虽然缓冲区是fifo

出0入0汤圆

 楼主| 发表于 2013-10-14 08:47:23 | 显示全部楼层
zxq6 发表于 2013-10-13 20:39
看样子,w5300的引脚结构貌似要科学一些。虽然缓冲区是fifo

嗯。粗略看了一下。这个片子确实比DM9000好。不知你对它的速度测试能达到多少。另:这个片子价格是DM9000的两倍多。

出0入0汤圆

发表于 2013-10-14 09:04:51 | 显示全部楼层
w5300是自带硬件IP协议栈的,可以大大减少CPU的占用率。所以价格要高很多了。
但是你的CPU频率已经很高了,对比STM32之类的72M速度,所以W5300用上去估计性价比不明显。

出0入22汤圆

发表于 2013-10-14 09:14:25 | 显示全部楼层
本帖最后由 zxq6 于 2013-10-14 09:17 编辑
sddzycnq 发表于 2013-10-14 08:47
嗯。粗略看了一下。这个片子确实比DM9000好。不知你对它的速度测试能达到多少。另:这个片子价格是DM9000 ...


我用fpga控制的,最高速度91M,计算机端没验证数据是否正确。常规通信使用了20-40M,更高带宽是很可能的,只是没有用上,所以没法评估。通信协议使用的UDP

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-10-15 10:51:31 | 显示全部楼层
本帖最后由 image056 于 2013-10-15 12:45 编辑

我看了datasheet,有些问题不清楚,想请教您   
1.dm9000中 DSCR寄存器中第二位 MFPSC  其中置1 表示MII帧引导抑制开启,这是个什么意思,有什么作用?我在Google上没有搜所到有用的信息,所以想请前辈解答。
2.根据手册,MRCMDX 是判断是否收到数据  01表示收到数据  00没有收到数据     那MRCMD中在DATA数据之前 有接收数据包的状态和长度,我不明白的是一共几个字节?  这个是手册上的图 我的理解是前面第一位的01是MRCMDX中的数据,后面三位是MRCMD中的数据。但是我看别人的程序都是先判断MRCMDX中是否是01  然后读取MRCMD中的前4个字节?
3.根据上面那个图,我设置MRCMD指针一次偏移2个字节,那么一直读MRCMD,当读到一帧帧尾会不会出现读到的数据为此帧的帧尾8位连着下一帧帧头的8位?  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-10-16 09:44:13 | 显示全部楼层
image056 发表于 2013-10-15 10:51
我看了datasheet,有些问题不清楚,想请教您   
1.dm9000中 DSCR寄存器中第二位 MFPSC  其中置1 表示MII帧引 ...


你好,你一共提出了3个问题,我尝试一一解答一下:(纯属个人理解)

1.        MFPSC意思是 multi frame preamble suppression ,讲的好像是多播抑制,关于这个知识点,我了解不多,感觉TCP/IP协议详解可能会有讲。
2.        你贴的这张图是正确的。每个包裹到来时会有4字节自动加在包裹头部,这四个字节分别是:01, status, length low, length high 。那么我们要做的就是判断第一字节是否是01,如果是01,则读取数据长度(注意这里的一个小细节:判断第一个字节是否是01的时候要读MRCMDX,以防止读指针的变化;确定了是01之后再读MRCMD)。其实还有一个小细节:做所有这些工作之前,DM9000需要dummy读一次。这次读的作用是:将数据载入到内部数据缓冲。而这个小细节被包含在了第一个小细节之内。
3.        对于这个问题,不必担心。因为DM9000在初始化的时候,此时的内部RX memory是带宽对齐的。(8bit 或 16bit)

以上的第2点和第3点在手册中有说明,可能会有些看不明白,但结合代码就可以看懂了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-10-16 20:15:26 | 显示全部楼层
sddzycnq 发表于 2013-10-16 09:44
你好,你一共提出了3个问题,我尝试一一解答一下:(纯属个人理解)

1.        MFPSC意思是 multi frame preamb ...

三个问题都明白了 谢谢您

出0入0汤圆

发表于 2013-10-21 09:59:46 | 显示全部楼层
本帖最后由 image056 于 2013-10-21 11:22 编辑

那MRCMD里的数据包不包括以太网帧最后的4个字节的CRC校验?

出0入0汤圆

发表于 2013-11-13 07:14:45 | 显示全部楼层
研究学习用台系芯片可以,但真正做产品,推荐用micrel ksz8851snl  ,SPI 接口,线路简单,接口稳定性好。或者选用SMSC LAN9221之类的。
在稳定性及可用性方面比台系芯片强很多。并且相应的软件资源更丰富.

做出来的产品  4KV 静电干扰测试,台系芯片抗静电性能与美系芯片性能比较?
不插网线,系统加电启动完成后,再插网线,看是否能正常连接,反复插拔网线,看看哪一家芯片每次都可以正常连接 ?

工控产品选美系的绝对是节约成本,减少系统维护成本。

出0入0汤圆

发表于 2013-11-14 10:58:22 | 显示全部楼层
严重建议:
MICREL KSZ8851SNL 性能、价格比台系芯片强很多,特别插拔不能link的bug不存在。另外SPI接口,硬件线路及软件驱动都容易。

WIZNET W5500 ,硬件集成TCP/IP协议栈。不要哪么费心费力去调试uIP lwIP之类的东东,硬件SPI接口,线路简单。

还有SMSC的相关芯片,性能超强。

哪些用台系芯片的,要好好考虑一下芯片BUG,及原厂及代理商是否能出质量承诺书,及硬件软件的复杂程度。有更好的,为什么选它 ?

出0入0汤圆

发表于 2013-11-15 11:48:21 | 显示全部楼层
严重建议:
MICREL KSZ8851SNL 性能、价格比台系芯片强很多,特别插拔不能link的bug不存在。另外SPI接口,硬件线路及软件驱动都容易。

WIZNET W5500 ,硬件集成TCP/IP协议栈。不要哪么费心费力去调试uIP lwIP之类的东东,硬件SPI接口,线路简单。

还有SMSC的相关芯片,性能超强。某些台系芯片在系统上电启动之后再插网线无法LINK这种低级bug要小心。

哪些用台系芯片的,要好好考虑一下芯片BUG,及原厂及代理商是否能出质量承诺书,及硬件软件的复杂程度。
有更好的,为什么选它 ?

出0入37汤圆

发表于 2014-5-13 08:13:43 | 显示全部楼层
mark              

出0入0汤圆

发表于 2014-5-21 22:50:23 来自手机 | 显示全部楼层
马克一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 12:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表