📄 hardware.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: Hardware.c
** Last modified Date: 2007-09-22
** Last Version: 1.0
** Description: 以太网LM3S6965底层硬件驱动
**
**------------------------------------------------------------------------------------------------------
** Created By: Cai Chubin
** Created date: 2007-09-20
** Version: 1.0
** Descriptions: The original version 初始版本
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#define HARDWARE_GLOBALS
#include <includes.h>
union REC_BUFF_UNION REC_BUFF[MAX_REC_BUFF];
uint8 send_buff[2046]; /*发送数据缓冲区*/
/**********************************************************************
**函数原型: void SetMacID()
**入口参数: *mac_ptr
**出口参数: 无
**返 回 值: 无
**说 明: 设置芯片物理地址,物理地址已经存储在程序空间内
************************************************************************/
void SetMacID(uint8 * mac_ptr)
{
EthernetMACAddrSet(ETH_BASE, mac_ptr); /*设置MAC地址,地址存储在cfg_net.h的My_Mac_1ID中*/
}
/**********************************************************************
**函数原型: EthernetIntHandler()
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 以太网中断,处理接收数据
************************************************************************/
void EthernetIntHandler(void)
{
unsigned long ulTemp;
ulTemp = EthernetIntStatus(ETH_BASE, false);
EthernetIntClear(ETH_BASE, ulTemp); /*清除中断标志*/
if(ulTemp & ETH_INT_RX) /*判断是否为接收中断*/
{
Rec_Packet(); /*在中断里处理接收函数*/
}
}
/**********************************************************************
**函数原型:Send_Packet(struct _pkst *TxdData)
**入口参数: struct _pkst *TxdData :指向要发送数据的结构指针
**出口参数: 无
**返 回 值:无
**说 明:发送数据包,以太网底层驱动程序,所有的数据发送都要通过该程序
************************************************************************/
void Send_Packet(struct _pkst *TxdData)//
{
struct _pkst *ExPtr;
uint16 ii,length=0;
static uint16 lengthdata=0;
uint16 jj;
ExPtr=TxdData;
while(ExPtr->STPTR!=NULL) /*计算出要发送的数据的总长度*/
{
length=length+ExPtr->length;
ExPtr=ExPtr->STPTR;
}
length=length+ExPtr->length; /*最后一帧数据的长度*/
ii=length; /*保存数据的总长度*/
ExPtr=TxdData;
while(ExPtr->STPTR!=NULL) /*把数据写进缓冲区里面*/
{
for(jj=0;jj<ExPtr->length;jj++)
{
send_buff[lengthdata] =*(((uint8 *)ExPtr->DAPTR)+jj);
lengthdata++;
}
//TEPTR=ExPtr->DAPTR;
ExPtr=ExPtr->STPTR;
}
/////////////////////
for(jj=0;jj<ExPtr->length;jj++) /*写最后一帧数据到缓冲区*/
{
send_buff[lengthdata] =*(((uint8 *)ExPtr->DAPTR)+jj);
lengthdata++;
}
//////////////////////////////////
// ii=lengthdata;
EthernetPacketPut(ETH_BASE,send_buff,ii); /*发送数据*/
lengthdata=0;
//while( EthernetSpaceAvail(ETH_BASE) )
}
/**********************************************************************
**函数原型:unsigned char * Rec_Packet()
**入口参数: 无
**出口参数: 无
**说 明:处理接收到的数据,被接收中断调用
************************************************************************/
void Rec_Packet(void)
{
static uint8 REC_BUFF_NUM=0;
uint8 * REC_BUFF_PTR_BYTES;
uint16 length;
OSSchedLock();
do{
length = EthernetPacketNonBlockingGet(ETH_BASE,REC_BUFF[REC_BUFF_NUM].bytes,1514);
if( (length > 0) && (length < 0x600) )
{
//EthernetIntEnable(ETH_BASE, ETH_INT_RX);
REC_BUFF_PTR_BYTES=REC_BUFF[REC_BUFF_NUM].bytes;
#ifdef Little_End
if((((ipethernet*)REC_BUFF_PTR_BYTES)->NextProtocal==0x0008)//可以减少对数据缓冲取的利用
||(((ipethernet*)REC_BUFF_PTR_BYTES)->NextProtocal==0x0608))//不过如果缓冲区足够大就最好不要
#endif
#ifdef Big_End
if((((ipethernet*)REC_BUFF_PTR_BYTES)->NextProtocal==0x0800)//可以减少对数据缓冲取的利用
||(((ipethernet*)REC_BUFF_PTR_BYTES)->NextProtocal==0x0806))//不过如果缓冲区足够大就最好不要
#endif
{
OSSchedUnlock();
// REC_BUFF_TTL[REC_BUFF_NUM]=200;//ADD FOR BUF TTL
Rec_Ethernet_Packed(REC_BUFF_PTR_BYTES,0);
REC_BUFF_NUM++;
if(REC_BUFF_NUM>=5) {REC_BUFF_NUM=0;}
OSSchedLock();
}
}
else
break;
}while(1);
OSSchedUnlock();
}
/**********************************************************************
**函数原型: void InitNic()
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 对芯片的工作寄存器进行设置,各个寄存器的用法可参考LM3S6965的数据手册
************************************************************************/
void InitNic(uint8 num)
{
uint32 i;
uint32 ulTemp;
SysCtlPeripheralReset(SYSCTL_PERIPH_ETH); /*复位以太网*/
/*****以下就是对以太网的设置******************/
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); /*使能以太网外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); /*使能LED外设*/
GPIODirModeSet(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3),
GPIO_DIR_MODE_HW);
GPIOPadConfigSet(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3),
GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); /*配置LED由硬件控制,输出电流为2ma*/
EthernetIntDisable(ETH_BASE, (ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER |
ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX));
ulTemp = EthernetIntStatus(ETH_BASE, false);
EthernetIntClear(ETH_BASE, ulTemp);
EthernetInit(ETH_BASE); /*对于第一次使用以太网的初始化*/
for(i=0;i<255;i++) ;
EthernetConfigSet(ETH_BASE, (ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN |
ETH_CFG_TX_PADEN)); /*使能全双工模式,自动进行CRC校验,自动填充发送数据达到最小值*/
EthernetEnable(ETH_BASE); /*使能以太网*/
IntEnable(INT_ETH); /*使能以太网外设中断*/
IntPrioritySet(INT_ETH, 0xFF); /*设置以太网中断优先级*/
EthernetIntEnable(ETH_BASE, ETH_INT_RX); /*使能以太网接收中断*/
for(i=0;i<255;i++) ;
SetMacID(NetPort[num].My_Mac); /*写MAC地址*/
for(i=0;i<3000000;i++) ; /*延时*/
}
uint16 swap_int16(uint16 temp)
{uint16 temp1;
temp1=(temp&0xff00)>>8;
temp=(temp&0x00ff)<<8;
return(temp+temp1);
}
uint32 swap_int32(uint32 temp)
{
union w temp232,temp132;
temp232.dwords=temp;
temp132.bytes.byte0=temp232.bytes.byte3;
temp132.bytes.byte1=temp232.bytes.byte2;
temp132.bytes.byte2=temp232.bytes.byte1;
temp132.bytes.byte3=temp232.bytes.byte0;
return(temp132.dwords);
}
uint16 Char2ToInt16(uint8 * temp)
{
uint16 temp16;
temp16=((uint16)(*temp))<<8;
temp++;
temp16=temp16+(uint16)(*temp);
return(temp16);
}
uint32 Char4ToInt32(uint8 * temp)
{
uint32 temp32;
temp32=((uint32)(*temp))<<24;
temp++;
temp32=temp32+(((uint32)(*temp))<<16);
temp++;
temp32=temp32+(((uint32)(*temp))<<8);
temp++;
temp32=temp32+(uint32)(*temp);
return(temp32);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -