嵌入式软件工程师&&太极拳
全部博文(548)
分类: LINUX
2011-02-20 20:24:46
2010_6_26:(张国威) BANK6和BANK7与BANK1到5的区别就是,6和7多了一个刷新功能,每隔一段时间会去充电 DM9000A: 两种工作模式:8位和16位,就是每次传输的数据为8位或16位 EEPROM 存储器,存放芯片初始值,默认值,DM9000A一启动就从EEPROM读出初始值配置好寄存器 连线: DM9000A->Transformer->RJ45 可以直接把RJ45的4个线接到DM9000A,但是这样会出现问题:打雷或者直接把其中两根线接到220V,就会把芯片烧了,所以出现了Transformer,专业叫网络隔离器 有些网卡芯片可出把Rx+/- Tx+/-对调,这样就可以实现直通线交叉线都可出用 DM9000A没有地址线,只有数据线,所以地址和数据都是通过数据线来发送,叫I/O操作 IOR# 连接LnOE,告诉DM9000A是读操作 接到CPU IOW# 连接LnWE,告诉DM9000A是写操作 CS# 连接nGCS4,即BANK4,片选 CMD 连接到地址总线的第2位,告诉DM9000A是写地址还是写数据 INT 中断 SD0-7 连接到数据总线0-7,I/O操作,如果是8位工作模式,就只会用到此8个位 SD8-15 连接到数据总线8-15,I/O操作,如果是16位工作模式,就会用到此8个位,如果是8位工作模式,此8位就会是其它功能 CPU访问内存过程: 当我们使用str和ldr会对总线控制器产生作用 r0 = 100; 会发送到数据总线 r1 = 0x20000000; 会发送到地址总线 str r0, [r1]; 发送读使能,IOR# ldr 发送写使能,IOW# 32位访问地址总线,分成前2位,后3位,最后27位 前2位 如果此2位为0,则访问的地址1G以下,非0则访问的地址在1G以上,则发送到固定的寄存器里 后3位 对应0-7BANK,什么值对应访问哪个BANK 最后27位 为内存的地址,会发送到地址总线上 0x20000000 32位bit前2位为0,所以访问的地址空间在1G以下,后3位为100,所以访问的是BANK4,后27位则访问的是连接BANK4的地址 控制DM9000寄存器: DM9000连接的是BANK4,所以它的地址为0x20000000,DM9000的cmd连接的是地址总线的第2位(从零算起),所以如果是写地址则需要把地址的第二位保证是为0,写数据则保证为1 读寄存器: *(volatile unsigned char *)0x20000000 = DM9000寄存器地址; 因为要访问DM9000寄存器,先要写地址,0x20000000是访问的BANK4,第二位又为0,所以为写地址,把地址强转成指针再给指针指向的地址赋值,则写地址。 return *(volatile unsigned char *)0x20000004; 因为第二位为1,所以为写数据,再把地址强转成指针取值。 写寄存器: *(volatile unsigned char *)0x20000000 = DM9000寄存器地址; *(volatile unsigned char *)0x20000004 = 数据; 写寄存器也需要先写地址,再写数据; 寄存器默认值: X 没有默认值 P 上电默认值 S 软重启默认值 E 默认值来自EEPROM RO 只读 RW 读定 R/C 可读,可清除 RW/C1 可读可写,写1才能清除 WO 只写,不能读 F8 MWCMD 首先写地址,把0xF8写进去,再把数据写进去,但是这数据是写到TX buffer里,不是写到MWCMD这个寄存器里 FC~FD TXPLH/TXPLL 两个寄存器加起来为16位,但是不能直接写16位数据进去,因为每个寄存器为8位,所以必需分开两次写 FE Interrupt Status Register 中断状态寄存器,如果不开中断这里的状态也有效 以太网包数据最大为1500个字节,最小为46个字节 超过8位就要用htons/htonl等转换 IP包头: ihl IP头长度,为4位,最大表示为15,所以要右移2 version IP包版本 tos tot_len IP头长度 protocol 接下来要交给哪个协议去处理,17代表UDP check 校验码 接收: 在Rx Buffer里每个包dm9000A会自动为包添加4个字节的头信息,第一个字节为01为正常包,00为空包,其它为错误,第二个字节为包的状态,错误的信息也可在这里看到,第三个和第四个为数据包的长度,这个长度不包括dm9000A加的4个字节的头信息