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

📄 net.c

📁 基于周立功m2020-NU201+ASD1.2编写; 通过网络访问插入板中的U盘上指定文件
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               
**                                     广州致远电子有限公司 
**
**                                  http://www.embedcontrol.com
****--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: net_buff.c
** 创 建 人: 
** 最后日期: 2006年9月26日
** 描    述: TCP接收软件FIFO缓冲,读写CS8900的寄存器
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创 建 人: 
** 版    本: 
** 日   期: 
** 描   述: 
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修 改 人: 
** 版    本: 
** 日   期: 
** 描   述:  
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

#define   NET_BASE_ADDR   		0x8300000a
#define   NET_BASE_DATA_ADDR   	0x8300000c
#define	  BUS_DELAY				50

OS_EVENT  *NET_Sem;			
OS_EVENT  *TCP_Sem;

static uint32 TCP_In, TCP_Out, TCP_N;
static uint8 TCP_RcvBuf[TCP_RCV_QUEUE_LEN];
/*********************************************************************************************************
** 函数名称: Net_Init
** 功能描述: 接收TCP数据BUFF初始化
** 输   入: 无
** 输   出: 无
** 全局变量: TCP_RcvBuf
** 调用模块: 
** 作   者: 
** 日   期: 2006年8月31日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 2006年9月15日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Net_Init(void)
{
	uint32 i;
	NET_Sem = OSSemCreate(1);
	TCP_Sem = OSSemCreate(1);
 
    for (i=0; i<TCP_RCV_QUEUE_LEN; i++)
    {
		TCP_RcvBuf[i] = '\0';
    } 	                                                
	TCP_In  = 0;
	TCP_Out = 0;
	TCP_N   = 0;
}
/*********************************************************************************************************
** 函数名称: Net_BuffRead
** 功能描述: 从软FIFO读出一个字符
** 输   入: pDat 存放读数据地址
** 输   出: 
** 全局变量: TCP_RcvBuf
** 调用模块: 
** 作   者: 
** 日   期: 2006年8月31日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 Net_BuffRead(uint8 *pDat)
{  	
	uint8 TCP_err;
	uint8 err;
	 
	OSSemPend(TCP_Sem, 0, &err);  
    if (TCP_N > 0)                                // 判断是否还有数据可读
    {                                                               
        *pDat = TCP_RcvBuf[TCP_Out];              // 获取数据,并将出队指针向前推移
        TCP_Out++;
        if(TCP_Out >= TCP_RCV_QUEUE_LEN)          // 如果出队指针指向超出缓存,则复位
        {
            TCP_Out = 0;        
        }    
        TCP_N--;
        TCP_err = TCP_QUEUE_OK;
    }
    else
    {
        TCP_err = TCP_QUEUE_EMPTY;
    }
	OSSemPost(TCP_Sem);
	
	return TCP_err;
}

/*********************************************************************************************************
** 函数名称: Net_BuffWrite
** 功能描述: 从软FIFO写入一个字符
** 输   入: pDat  存放写数据地址
** 输   出: 
** 全局变量: TCP_RcvBuf
** 调用模块: 
** 作   者: 
** 日   期: 2006年8月31日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 Net_BuffWrite(uint8 *pDat)
{  	
	uint8 TCP_err;
	uint8 err;
    
	OSSemPend(TCP_Sem, 0, &err); 
    if (TCP_N < TCP_RCV_QUEUE_LEN)                // 判断是否还有数据可写
    {                                                                 
        TCP_RcvBuf[TCP_In] = *pDat;               // 数据入队,并将入队指针向前推移
        TCP_In++;
        if(TCP_In >= TCP_RCV_QUEUE_LEN)           // 如果入队指针指向超出缓存,则复位
        {
            TCP_In = 0;        
        }  
        TCP_N++;
        TCP_err = TCP_QUEUE_OK;
    }
    else
    {
        TCP_err = TCP_QUEUE_FULL;
    }
	OSSemPost(TCP_Sem);
	
	return TCP_err;
}

/*********************************************************************************************************
** 函数名称: Net_BuffFlush
** 功能描述: 清空接收软FIFO缓存
** 输   入: 无
** 输   出: 无 
** 全局变量: TCP_RcvBuf
** 调用模块: 
** 作   者: 
** 日   期: 2006年8月31日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Net_BuffFlush(void)
{   
	uint32 i;   
    uint8 err;
                                   
    OSSemPend(TCP_Sem, 0, &err); 
    for (i=0; i<TCP_RCV_QUEUE_LEN; i++)
    {
        TCP_RcvBuf[i] = '\0';
    } 	                                                
    TCP_In  = 0;
    TCP_Out = 0;
    TCP_N   = 0;
    OSSemPost(TCP_Sem);
}

/*********************************************************************************************************
** 函数名称: outb()
** 功能描述: 把数据写入到总线
** 输   入: ADDR_32	 写入地址
			 WRITEDATA   写入数据
** 输   出: 无
** 全局变量: 无
** 调用模块: 
** 作   者: 
** 日   期: 2006年9月5日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 2006年9月25日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  outb(uint16 WRITEDATA, uint32 ADDR_32)
{
	uint8 err;
	OSSemPend(NET_Sem, 0, &err);
	(*((volatile unsigned short *) ADDR_32))=WRITEDATA;
	OSSemPost(NET_Sem);	
}

/*********************************************************************************************************
** 函数名称: inb()
** 功能描述: 把数据从总线读出
** 输   入: ADDR_32	读数据的地址
** 输   出: READDATA   读出数据
** 全局变量: 无
** 调用模块: 
** 作   者: 
** 日   期: 2006年9月5日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 2006年9月25日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16  inb(uint32 ADDR_32)
{
	uint16 temp;
	uint8 err;
	OSSemPend(NET_Sem, 0, &err);	
	temp=(*((volatile unsigned short *) ADDR_32));
	OSSemPost(NET_Sem);	
	return (temp);
}

/*********************************************************************************************************
** 函数名称: ior()
** 功能描述: 读CS8900寄存器的值
** 输   入: CS8900寄存器地址的偏移量
** 输   出: 读出寄存器的值
** 全局变量: 无
** 调用模块: 
** 作   者: 
** 日   期: 2006年9月5日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 2006年9月25日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 ior(uint16 offset)
{   
    uint32 i;
    uint8 rt;

    outb(offset,NET_BASE_ADDR);
    for (i = 0; i < BUS_DELAY; i++)
    {
    }

    rt = inb(NET_BASE_DATA_ADDR);
    for (i = 0; i < BUS_DELAY; i++)
    {
    }
    
    return rt;
}

/*********************************************************************************************************
** 函数名称: iow()
** 功能描述: 写值到CS8900的寄存器
** 输   入: offset: CS8900寄存器地址的偏移量
			 value: 写入寄存器的值
** 输   出: 无
** 全局变量: 无
** 调用模块: 
** 作   者: 
** 日   期: 2006年9月5日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 2006年9月25日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void iow(uint16 offset, uint16 value)
{
    uint32 i;
    
    outb(offset, NET_BASE_ADDR);
    for(i = 0; i<BUS_DELAY; i++)
    {
    }
    
    outb(value, NET_BASE_DATA_ADDR);
    for(i = 0; i<BUS_DELAY; i++)
    {
    }
}


/*********************************************************************************************************
** 函数名称: PHY_Connect()
** 功能描述: 判断CS8900的物理网络连接是否连接上
** 输   入: 无
** 输   出: PHY_CONNECT_OK: 有连接
			 PHY_CONNECT_FAIL: 无连接
** 全局变量: 无
** 调用模块: 
** 作   者: 
** 日   期: 2006年11月1日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 PHY_Connect(void)
{
   	if (ior(0x0134)&0x80)
   		return PHY_CONNECT_OK;
   	else
   		return PHY_CONNECT_FAIL;
}

⌨️ 快捷键说明

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