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

📄 hardware.c

📁 本程序代码是UDP协议在最新流明诺瑞ARM单片机+ucosii平台上实现的UDP源代码,可以在上面直接实现转CAN和串口程序
💻 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 + -