📄 hardware.c
字号:
/*
+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 + -