📄 hardware.c
字号:
#define HARDWARE_GLOBALS
#include "config.h"
#include "../include/cfg_net.h"
#define NET_RST 0X40000000//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 写入地址
EDATA 写入数据
* 出口参数:无
*****************************************************************************/
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);
}
/****************************************************************************
**函数原型: page()
**入口参数: pagenumber要切换的页
**出口参数: 无
**返 回 值: 无
**说 明: 选择页,可选择0,1,2三页,第四页ne000兼容芯片保留
*****************************************************************************/
void page(uint8 pagenumber)
{
uint8 temp;
temp=ReadFromNet(0);//命令寄存器
temp=temp&0x3B ;//注意txp位不能要
pagenumber=pagenumber <<6;
temp=temp | pagenumber;
WriteToNet(0,temp);
}
/****************************************************************************
**函数原型: 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);
}
/****************************************************************************
**函数原型: 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++;
WriteToNet(0x10,send_buff.words);
}
ExPtr=ExPtr->STPTR;
}
//如果少于60
/***************************************/
//以下为终止DMA操作
WriteToNet(0x0b,0x00);
WriteToNet(0x0a,0x00);
WriteToNet(0x00,0x22); //结束或放弃DMA操作
WriteToNet(0x07,0xff);
if(Tx_Buff_Sel)
{
WriteToNet(0x04,0x40); //txd packet start;
}
else
{
WriteToNet(0x04,0x46); //txd packet start;
}
ii=length;
if(length<60)
{
//如果数据长度<60字节,设置长度为60字节
ii=60;
}
WriteToNet(0x06,ii>>8); //high byte counter
WriteToNet(0x05,ii&0x00ff);//low byte counter
WriteToNet(0x07,0xff);
WriteToNet(0x00,0x3e); //to sendpacket;
/***************************************/
//重发数据的处理
for(length=0;length<6;length++) //最多重发6次
{
for(ii=0;ii<1000;ii++)
{//检查CR寄存器的txp位是否为低,为1说明正在发送,为0说明发完或出错放弃
if((ReadFromNet(0X00)&0x04)==0)
{ break; }
}
if((ReadFromNet(0X04)&0x01)!=0)//表示发送成功,判断发送状态寄存器TSR,决定是否出错
{break;};
WriteToNet(0x00,0x3e); //to sendpacket;
}
/**************************************/
//OS_EXIT_CRITICAL();
}
/**********************************************************************
**函数原型: unsigned char * Rec_Packet()
**入口参数:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -