Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1261817
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: 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个字节的头信息









	
		
阅读(826) | 评论(0) | 转发(0) |
0

上一篇:bootloader

下一篇:kernel

给主人留下些什么吧!~~