DM9000有线网卡驱动编写

DM9000有线网卡驱动编写

1.DM9000简介

  DM9000 是一款完全集成的、性价比高、引脚数少、带有通用处理器接口的单芯片快速以太网控制器。 自 带一个 10/100M PHY 和 4K 双字的 SRAM ,DM9000A 为适应各种处理器提供了 8 位、16 位数据接口访问 内部存储器,DM9000 拥有自动协商功能,DM9000 特性如下:
  1.集成自适应 10/100M 收发器。
  2.内置 16k 字节的 SRAM。
  3.支持硬件帧校验。
  4.兼容 3.3V 和 5.0V 输入输出电压。
  DM9000 有多种型号,有100引脚和48引脚的,开发板选择的是48引脚的DM9000,型号为DM9000CEP。

2.DM9000硬件接口

在这里插入图片描述
 PWRST: DM9000 复位信号。
 CS: DM9000 的片选信号。
 WR(IOW): 处理器写命令。
 RD(IOR): 处理器读命令。
 CMD: 命令/数据标志, 0,读写命令; 1,读写数据。
 SD0~SD15: 16 位双向数据线。

3.DM9000数据位宽设置

  DM9000 支持8位和16位两种数据位宽,可以通过 DM9000的21(EEDCS)引脚设置其数据位宽,当EEDCS上拉的时候DM9000选择8位数据位宽,否则的话选择16位数据位宽。开发板上的R65电阻为 EECS 的上拉电阻,但是此电阻并未焊接!DM9000芯片的数据位宽为 16 位。
在这里插入图片描述

4.开发平台

硬件平台:STM32F103ZET6开发板集成DM9000网卡
开发环境:Windows下Keil5
驱动时序:硬件FSMC

  若没有DM9000有线网卡设备,可自行购买DM9000网卡模块.
  DM9000网卡模块链接:DM9000有线网卡
在这里插入图片描述

5.DM9000硬件配置

在这里插入图片描述
  DM9000 网卡接在 FSMC 的第 2 块上,数据线地址: 0x64000000
  PA7 地址线作为命令与数据线切换引脚。
  外接16位宽度存储器: HADDR[25:1] FSMC_A[24:0]
  外部地址线0对应内部地址线1

0x64000000基地址:01100100000000000000000000000000 
0x64000000写数据:01100100000000000000000000000000 
0x64000100写命令:01100100000000000000000100000000

  DM9000硬件初始化:

/******************DM9000初始化**************
**硬件接口:
**					FSMC_D0~D1  -- PD14~PD15
**					FSMC_D2~D3  -- PD0~PD1
**					FSMC_D4~D12 -- PE7~PE15
**					FSMC_D13~D14-- PD8~PD9
**					FSMC_D15    -- PD10
**					CS(FSMC_NE2) -- PG9(片选)
**					WR(FSMC_NWE) -- PD5(写使能)
**					RD(FSMC_NOE) -- PD4(读使能)
**					DM9000_RST   -- PD7(复位脚)
**					CMD(FSMC_A7) -- PF13(数据命令选择脚)
**					DM9000_INT   --PG6(中断脚)
**
*********************************************/
void DM9000_GPIO_Init(void)
{
		/*开时钟*/
	RCC->APB2ENR|=1<<3;//PB
	RCC->APB2ENR|=1<<5;//PD
	RCC->APB2ENR|=1<<6;//PE
	RCC->APB2ENR|=1<<7;//PF
	RCC->APB2ENR|=1<<8;//PG
	
	GPIOD->CRL&=0x0F00FF00;//PD5写使能,PD4读使能,PD7复位脚
	GPIOD->CRL|=0x30BB00BB;
	GPIOD->CRH&=0x00FFF000;
	GPIOD->CRH|=0xBB000BBB;
	
	GPIOE->CRL&=0x0FFFFFFF;
	GPIOE->CRL|=0xB0000000;	
	GPIOE->CRH&=0x00000000;
	GPIOE->CRH|=0xBBBBBBBB;
	
	GPIOG->CRH&=0xFFFFFF0F;
	GPIOG->CRH|=0x000000B0;//片选NE2
	
	GPIOF->CRH&=0xFF0FFFFF;
	GPIOF->CRH|=0x00B00000;//数据命令选择脚
	
	GPIOG->CRL&=0xF0FFFFFF;
	GPIOG->CRL|=0x08000000;//DM9000中断脚
	GPIOG->ODR|=1<<6;//上拉
  EXTI->IMR|=1<<6;   //开放中断线6的中断请求
  EXTI->FTSR|=1<<6;  //允许中断线6下降沿触发请求
  RCC->APB2ENR|=1<<0;//AFIO时钟使能
	AFIO->EXTICR[1]&=~(0xF<<(2*4));//选择输入源为PG6
  AFIO->EXTICR[1]|=0x6<<(2*4);//选择输入源为PG6
	STM32_NVIC_SetPriority(EXTI9_5_IRQn,1,1);//设置优先级
	
	/*FSMC核心寄存器配置*/
	RCC->AHBENR|=1<<8;//FSMC
	FSMC_Bank1->BTCR[2]=0;//BCR2
	FSMC_Bank1->BTCR[3]=0;//BTR2
	FSMC_Bank1->BTCR[2]&=~(0x1<<19);//异步模式
	FSMC_Bank1->BTCR[2]&=~(0x1<<14);//读写使用相同时序
	FSMC_Bank1->BTCR[2]|=1<<12;//允许写操作
	FSMC_Bank1->BTCR[2]|=0x1<<4;//16位宽度
	FSMC_Bank1->BTCR[3]|=0x1<<8;//2个时钟周期
	FSMC_Bank1->BTCR[3]&=~(0xF<<4);//地址保持时间1个时钟周期
	FSMC_Bank1->BTCR[3]&=~(0xF<<0);//地址保持时间1个时钟周周期
	FSMC_Bank1->BTCR[2]|=1<<0;//启动存储器块
}

  底层读写数据:

/******************向指定寄存器写入数据***********/
void DM9000_WriteReg(u16 reg,u16 dat)
{
	DM9000_RW_REG=reg;
	DM9000_RW_DAT=dat;
}
/*******************读取指定寄存器的数据************/
u16 DM9000_ReadReg(u16 reg)
{
	u16 data;
	DM9000_RW_REG=reg;
	data=DM9000_RW_DAT;
	return data;
}

6.主函数

#include "dm9000.h"
u8 dm9000_tx_buff[64]={0x11,0x22,0x33,0x44,0x55};
u8 dm9000_rx_buff[1024];
int main()
{
	u8 stat;
	u16 i;
	int len;
	Beep_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	printf("初始化完成\r\n");
	/*DM9000初始化*/
	if(DM9000_Init()==0)printf("DM9000初始化成功\r\n");
	else printf("DM9000初始化失败\r\n");
	/*获取DM9000工作模式*/
	stat=DM9000_Get_SpeedAndDuplex();//获取连接状态和工作方式
	if(stat!=0xff)printf("网卡速度:%d Mbps 模式:%s\r\n",(stat&0x02)?10:100,(stat&0x01)?"全双工":"半双工");
	else printf("DM9000网卡状态信息获取失败!\r\n");
	while(1)
	{
		len=DM9000_ReadPacketLen();//读取数据包长度
		if(len>0)
		{
			printf("读取数据长度:%d\r\n",len);
			DM9000_ReadPacketData(dm9000_rx_buff,len);//读取数据
			for(i=0;i<len;i++)
			{
				printf("%#x ",dm9000_rx_buff[i]);
			}
			printf("\r\n");
		}
	}
}

6.运行效果:

  将开发板通过网线连接路由器即可看到相关答应信息
在这里插入图片描述
参考示例:https://download.csdn.net/download/weixin_44453694/82216348

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
dm9000是一款常用的以太网控制器芯片,其读写时序是指通过该芯片进行数据读写的操作顺序和时序要求。 首先,dm9000的读写时序可以分为三个时钟信号周期,包括时钟上升沿(CLK上升沿)、时钟下降沿(CLK下降沿)和中断触发沿(INTB触发沿)。 在读操作时,首先需要设置读控制信号RDN(Read Enable)为有效,使能读操作。然后在读使能有效期间,根据dm9000的存储器映射,设置偏移地址寄存器(Offset Address Register)的值,确定需要读取的数据的地址。接下来,在下一个时钟周期(时钟下降沿)上升沿到来时,数据总线上就会输出要读取的数据。 而在写操作时,首先需要设置写控制信号WRN(Write Enable)为有效,使能写操作。然后在写使能有效期间,同样设置偏移地址寄存器的值,确定需要写入数据的地址。接着,在下一个时钟周期(时钟下降沿)上升沿到来时,将要写入的数据放置在数据总线上。当时钟上升沿信号到来时,dm9000会将数据写入指定地址处。 需要注意的是,对于dm9000的读写操作,必须遵守特定的时序要求,确保数据的正确读取和写入。具体来说,在操作开始前,需要保证RDN和WRN信号至少持续2个时钟周期。此外,对于写操作时序,数据必须在使能信号WRN和时钟下降沿到来之间被放置在数据总线上。 综上所述,dm9000的读写时序是按照一定顺序和时序要求来进行数据读取和写入的操作流程。正确理解和遵守这些时序要求可以确保dm9000正常运行,并提高数据读写的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_阿水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值