S3C2440读写DM9000寄存器

本文介绍了S3C2440微处理器如何通过地址线和数据线与DM9000网卡通信,详细解析了DM9000的地址线、数据线配置,以及如何确定数据端口和命令端口。通过内存映射,使用特定的寄存器读写函数来操作DM9000的寄存器,强调了volatile关键字在处理外部寄存器时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看DM9000网卡驱动,一直不太明白,这几天问师兄,查资料总算明白了一点,在这里整理出来,也当加深理解。我刚刚学习ARM,很多东西不懂,理解错误或者不当之处还请指出,大家共同进步。

S3C244032位微处理器,有32根地址线,支持4GB存储空间。其中0-400000001G空间被分为8128M空间,分别由NGCS0-NGCS7片选。DM9000AEN地址使能引脚与S3C2440NGCS4相连(对应匹配),对应的初始地址为0x2000000,地址范围为0x20000000-0x28000000

 

1、  DM9000地址线

DM9000地址线SA4-SA9用于S3C2440选择DM9000网卡。因为DM9000AEN地址使能引脚已经和S342440NGCS4引脚相连,完成了选通,其余位可不连直接置位即可:SA9SA8置为高电平,SA7置为低电平,SA6-SA4TXD2-TXD0匹配(如果取DM9000 IO默认基地址,SA6-SA4可置为低电平)。

2、  DM9000数据线

DM9000数据线SD0-SD15S3C2440数据线DATA0-DATA15相连。

3、  DM9000数据端口和命令端口的确定

由开始讨论知,对于DM9000网卡寄存器的操作在0x20000000-0x28000000的区间内进行,由于网卡IO默认基地址为300H,所以操作网卡对应内存的起始地址为0x20000300,又有DM9000网卡CMD端口与S3C2440的地址总线ADDR2相连,并且DM9000CMD命令管脚有这样的特性:当为高电平时,从数据线传输的是数据,当为低电平时传输的是命令。

4、  具体程序

#define DM_ADD (*((volatile unsigned short*) 0x20000300))

#define DM_CMD (*((volatile unsigned short*) 0x20000304))

在定义端口,分别把0x200003000x20000304宏定义为DM_ADDDM_CMD

寄存器读写操作函数

static void dm9000_reg_write(INT16U reg, INT16U data)

{

    udelay(20);

    DM_ADD=reg;

    udelay(20);

    DM_CMD=data;

} 

static INT8U dm9000_reg_read(INT16U reg)

{

udelay(20);

DM_ADD=reg;

udelay(20);

return DM_CMD;

}

程序中volatile类型修饰符,在处理器对外部寄存器读写时几乎是必用的,作用是确保变量每次被调用的时候都会从内存中重新读取而不是读取内部缓存cache(处理器把常用的数据进行备份保存在此处,避免每次调用该数据时都要操作内存)里面的数据,尽管这样浪费的时间,可是提高了系统的准确性。

 

通过确定了地址线和数据线的连线,加上在内存里的地址映射,可以通过对内存的操作实现对寄存器的读取。具体过程是这样的:

当对以0x20000300DM_ADD)为起始地址的内存空间进行操作时,对应的ADDR2管脚为低电平,CMD命令管脚为低电平,数据线传输的是地址,同理,当对0X20000304(DM_CMD)为起始地址的内存空间进行操作时,对应管脚为高电平,数据线传输的是数据。传输到外部芯片的地址选取寄存器,传输到外部芯片的数据写相应寄存器,这个过程由CMD控制,当CMD为低电平时选取寄存器(此时可以直接读取寄存器的内容),CMD为高电平时,写入寄存器(之前必须先选取寄存器)。在内存里的情况,这样理解

 

 

以上为DM9000(A)常用寄存器功能的详细介绍,通过对这些寄存器的操作访问,我们便可以实现对DM9000的初始化、数据发送、接收等相关操作。而要实现ARP、IP、TCP等功能,则需要对相关协议的理解,由编写相关协议或移植协议栈来实现。 功能描述 1、总线 总线是ISA总线兼容模式,8个IO基址,分别是300H, 310H,320H, 330H, 340H, 350H, 360H, 370H。IO基址与设定引脚或内部EEPROM的共同选定 访问芯片有两个地址端口,分别是地址端口和数据端口。当引脚CMD接地时,为地址端口;当引脚CMD接高电平时,为数据端口。在访问任何寄存器前,地址端口输入的是数据端口的寄存器地址,寄存器的地址必须保存在地址端口。 2、存储器直接访问控制 DM9000提供DMA(直接存取技术)来简化对内部存储器(下称存储器)的访问。对存储器起始地址完成编程后,发出写命令就可以加载当期数据到内部数据缓冲区,可以通过读写数据读出或写入寄存器来定位数据存储区。根据当前总线模式的字长使存储地址自动加1,下一个地址数据将会自动加载到数据缓冲区。要注意的是在连续突发式的第一次访问是读写命令的内容。??? 内部存储器空间大少16K字节。低3K字节单元用作发送包的缓冲区,其他13K字节用作接收包的缓冲区。所以在写发送包存储区的时候,当存储器地址越界后,自动跳回0地址并置位IMR第七位。同样在读接收包存储器的时候,当存储器地址越界后,自动跳回起始地址0x0c00。 3、包的发送 命名指针1和指针2,同时存储在发送包缓冲区。发送控制寄存器(02H)控制冗余校验码和填充的插入,其状态分别记录在发送状态寄存器1(03H)和发送状态2(04H) 发送器的起始地址是0x00H,软件或硬件复位后默认是指针1,先通过DMA端口写数据到发送缓冲区,然后写字节计数长度到字节计数寄存器(0FCH,0FDH)。然后置位发送控制寄存器的bit1来发送指针1的包。在此包发送完成前,指针2的数据包能进入到发送缓冲区。当指针1的包发送完,写字节计数长度到字节计数寄存器并置位发送控制寄存器的bit1来发送指针2的包。类似的操作来进行更多的数据发送。 4、包的接收 接收缓冲区是一个环结构,起始地址0C00H在复位后。每个包有4个字节的头,后紧跟着包的数据及CRC校验码,这4个字节的头格式是01H,状态,包长度低8位,包长度高8位。它用来标志着每个包正确的起始地址。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值