DM9000

来源:互联网 发布:javascript this 特性 编辑:程序博客网 时间:2024/05/16 11:04

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









    
        


原创粉丝点击