⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardware.c

📁 很好的网络编程协议源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –51,AVR,ARM firmware developer  
Contact:qq 292942278  e-mail:tony_yang123@sina.com.cn

Abstract:
$Id: hardware.c,v 1.3 2006/12/31 16:08:37 tony Exp $
-FHDR-------------------------------------------------------------------
*/ 
#define HARDWARE_GLOBALS
#include "config.h"
#include "tcp_ip_cfg.h"
#include "ethernet.h"
#include  "uart0\uart0.h"

#define   NET_RST   		0X00000040//0x20000000
#define   NET_BASE_ADDR   	0X83400000//0x20000000
//#include "rtl8019as.h"
EX_RAM uint16 iic=0;

union  REC_BUFF_UNION	REC_BUFF[MAX_REC_BUFF];
/****************************************************************************
* 名称:WriteToNet()
* 功能:把数据写入RTL8019AS
* 入口参数:	ADDR		写入地址
WRITEDATA   写入数据
* 出口参数:无
****************************************************************************/

void  WriteToNet(uint8 ADDR_16,uint16 WRITEDATA)
{
	
	(*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16))=WRITEDATA;//0x83400000	 
	
}


/****************************************************************************
* 名称:ReadFromNet()
* 功能:从RTL8019AS把数据读出
* 入口参数:	ADDR		读出地址

  * 出口参数:	READDATA   	读出数据
****************************************************************************/
uint16  ReadFromNet(uint8 ADDR_16)
{
	uint16 temp;
	temp=(*((volatile unsigned short *) NET_BASE_ADDR+ADDR_16));//0x83400000
	return (temp);
}
/**********************************************************************
**函数原型:    void  page(uchar pagenumber)
**入口参数:?uchar	pagenumber: 要切换的页
**出口参数:		无
**返 回 值:	无      
**说    明:	选择页,可选择0,1,2三页,第四页ne000兼容芯片保留 
************************************************************************/
void page(uint8 pagenumber)  
{
	uint8 temp;
	temp=ReadFromNet(0);//command register
	//temp=temp&0x3f;
	temp=temp&0x3B ;//注意txp位不能要
	pagenumber=pagenumber <<6;
	temp=temp | pagenumber;
	WriteToNet(0,temp);
}

/**********************************************************************
**函数原型:    void 	SetMacID()
**入口参数:		*mac_ptr
**出口参数:		无
**返 回 值:	无            
**说    明:	设置芯片物理地址,物理地址已经存储在程序空间内 
************************************************************************/
void SetMacID(uint8 * mac_ptr)   
{
	//把MAC地址写入MY——MAC——ID中
	page(1);
	WriteToNet(1 , *mac_ptr);
	mac_ptr++;
	WriteToNet(2 , *mac_ptr);
	mac_ptr++;
	WriteToNet(3 , *mac_ptr);
	mac_ptr++;
	WriteToNet(4 , *mac_ptr);
	mac_ptr++;
	WriteToNet(5 , *mac_ptr);
	mac_ptr++;
	WriteToNet(6 , *mac_ptr);
	page(0);
}
/**********************************************************************
**函数原型:     void 	InitNic()
**入口参数:?无
**出口参数:		无
**返 回 值:?无              
**说    明:?对芯片的工作寄存器进行设置,各个寄存器的用法可参考文档和
**				络芯片的数据手册
************************************************************************/
void InitNic(uint8 num)  
{  
	
	uint8  i;
	uint8  j;
	
	//PINSEL0 = 0x00000005;		// 设置所有管脚连接GPIO
	//PINSEL1 = 0x00000000;
	//IODIR=IODIR|(NET_DATA+NET_CS+NET_WR+NET_ALE+NET_RD+NET_RST);
	//IOSET=NET_DATA+NET_CS+NET_WR+NET_ALE+NET_RD+NET_RST;
	IODIR=IODIR|NET_RST;
	IOCLR=NET_RST;
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++);
	}
	IOSET=NET_RST;
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++);
	}
	IOCLR=NET_RST;
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++);
	}	
	WriteToNet(0x1f,0x00); 	
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++);
	}
	
	/**********************************************************************
	
	  1.Reg00命令寄存器: CR,命令寄存器,地址偏移量00H,为一个字节
	  位:  7   6   5   4   3   2   1   0 
	  名字: PS1 PS0 RD2 RD1 RD0 TXP STA STP 
	  //============================================
	  2.
	  RD2,RD1,RD0: 这3个位代表要执行的功能。
	  0   0   1 : 读网卡内存
	  0   1   0 : 写网卡内存
	  0   1   1 : 发送网卡数据包
	  1   *   * : 完成或结束DMA的读写操作
	  //============================================
	  3.TXP位置1时发送数据包,发完自动清零
	  //============================================
	  4.
	  STA,STP:	这两个位用来启动命令或停止命令
	  1   0 		启动命令
	  0   1 		停止命令
	  //============================================
	********************************************************/
	WriteToNet(0x00,0x21);   //使芯片处于停止模式,这时进行寄存器设置
	
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++);
	} //延时10毫秒,确保芯片进入停止模式
	page(0);
	
	WriteToNet(0x0a,0x00);   //清rbcr0
	WriteToNet(0x0b,0x00);   //清rbcr1
	WriteToNet(0x0c, 0xe0);  //RCR,监视模式,不接收数据包
	WriteToNet(0x0d, 0xe2);  //TCR,loop back模式
	page(0);
	WriteToNet(0x01,0x4c);	//PSTART=0X4C
	WriteToNet(0x02,0x80);	//PSTOP=0X80
	WriteToNet(0x03,0x4c);	//bnry=0x4c;
	page(0);
	WriteToNet(0x04,0x40);  //TPSR,发送起始页寄存器
	WriteToNet(0x07,0xff);  //清除所有中断标志位,中断状态寄存器
	WriteToNet(0x0f,0x11);  //中断屏蔽寄存器清0,禁止中断
	
	WriteToNet(0x0e,0xcb);  // 数据配置寄存器,8位dma方式
	page(1);
	WriteToNet(0x07,0x4d);  //curr=0x4d
	WriteToNet(0x08,0x00);
	WriteToNet(0x09,0x00);
	WriteToNet(0x0a,0x00);
	WriteToNet(0x0b,0x00);
	WriteToNet(0x0c,0x00);
	WriteToNet(0x0d,0x00);
	WriteToNet(0x0e,0x00);
	WriteToNet(0x0f,0x00); 
	WriteToNet(0x00,0x22);  //这时让芯片开始工作
	SetMacID(NetPort[num].My_Mac);  //将芯片物理地址写入到MAR寄存器
	
	page(0);
	WriteToNet(0x0c,0xcc);  //将芯片设置成正常模式,跟外部网络连接
	WriteToNet(0x0d,0xe0);
	WriteToNet(0x00,0x22);  //启动芯片开始工作
	WriteToNet(0x07,0xff);  //清除所有中断标志位
				
}
/**********************************************************************
**函数原型:    void 		Send_Packet(struct _pkst *TxdData)
**入口参数:		struct _pkst *TxdData	:指向要发送数据的结构指针
**              
**出口参数:		无
**返 回 值:	无              
**说    明:	发送数据包,以太网底层驱动程序,所有的数据发送都要通过该程序
************************************************************************/
void Send_Packet(struct _pkst *TxdData)//  
{
	static uint8 Tx_Buff_Sel=0;
	struct _pkst *ExPtr;//
	//uint16 i;
	uint8 *TEPTR;
	union send_temp{
		uint16 words;
		uint8	bytes[2];
				}send_buff;
	uint16 ii,length=0;
	
	//i=0;//记录发送是否小于60个字节
	page(0);//切换至第0页
	length=length+TxdData->length;
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)//计算出要发送的数据的总长度
	{	
		length=length+ExPtr->length;
		ExPtr=ExPtr->STPTR;
	}
	ii=length;
	Tx_Buff_Sel=Tx_Buff_Sel^1;//发送缓冲区的切换
	if(Tx_Buff_Sel)
	{
		WriteToNet(0x09,0x40);			//设置发送页地址
	}			
	else
	{
		WriteToNet(0x09,0x46);			//设置发送页地址
    	}
	
	WriteToNet(0x08,0x00); 			//写入RSAR0 DMA起始地址低位read page address low
	WriteToNet(0x0b,ii>>8);			//写入RSCR1 DMA 计数器高位read count high
	WriteToNet(0x0a,ii&0x00ff);		//写入RSCR0 DMA 计数器低位read count low;
	WriteToNet(0,0x12);				//启动DMA写write dma, page0
	TEPTR=TxdData->DAPTR;
	for(ii=0;ii<(((TxdData->length)+1)/2);ii++)
	{
		send_buff.bytes[0]=*TEPTR;
		TEPTR++;
		send_buff.bytes[1]=*TEPTR;
		TEPTR++;
		WriteToNet(0x10,send_buff.words);
	}
	ExPtr=TxdData->STPTR;
	while(ExPtr!=NULL)
	{
		TEPTR=ExPtr->DAPTR;
		for(ii=0;ii<((ExPtr->length+1)/2);ii++)
		{
			send_buff.bytes[0]=*TEPTR;
			TEPTR++;
			send_buff.bytes[1]=*TEPTR;
			TEPTR++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -