📄 net.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 + -