?? 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 "..\User\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 + -