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

📄 pronet.c

📁 一个CAN总线应用的sample ,采用LPC2119处理器.
💻 C
字号:
#include "config.h"
#include "global.h"


UINT8 ReceiveAck(UINT32 SendL)
{
	//UINT32 i = 100000;//0; //50000
	UINT32 i;
	i = (4+SendL/8)*10000;  //数据包长度增加8个字节,延迟时间增加1毫秒
	while(i>0){
		if(AckArrived)
			return true;
		i--;
	}
	return false;
}

//收到一个包的最后一帧信息时,返回应答。
void SendAckPacket(eCANNUM CanNum)
{
	UINT32 status = 0;
	
	//查询应答帧的填充方法
	CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; 	//优先级
	CTbuf.TxFrameInfo.Bits.FF_BIT	= 1;	//帧格式
	CTbuf.TxFrameInfo.Bits.RTR_BIT = 1;		//帧类型:远程帧
	CTbuf.TxFrameInfo.Bits.DLC_BIT = 0;		//数据长度
	CTbuf.TxCANID.Word = CRBuf.RxCANID.Word & 0x1FFEFFFF;  //把第16bit置0

	status = CANSendData(CanNum, 0x01,&CTbuf);
}


void SendBeginPacket()
{
	UINT32 status = 0;
	
	//查询应答帧的填充方法
	CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; 	//优先级
	CTbuf.TxFrameInfo.Bits.FF_BIT	= 1;	//帧格式
	CTbuf.TxFrameInfo.Bits.RTR_BIT = 1;		//帧类型:远程帧
	CTbuf.TxFrameInfo.Bits.DLC_BIT = 0;		//数据长度
	CTbuf.TxCANID.Word =  0x1FFEF000;  //把第16bit置0

	status = CANSendData(0, 0x01,&CTbuf);
}


void SendEndPacket()
{
	UINT32 status = 0;
	
	//查询应答帧的填充方法
	CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; 	//优先级
	CTbuf.TxFrameInfo.Bits.FF_BIT	= 1;		//帧格式
	CTbuf.TxFrameInfo.Bits.RTR_BIT = 1;		//帧类型:远程帧
	CTbuf.TxFrameInfo.Bits.DLC_BIT = 0;		//数据长度
	CTbuf.TxCANID.Word =  0x1FFEFFFF;  	//把第16bit置0

	status = CANSendData(0, 0x01,&CTbuf);
}


//把缓冲sCommSnd中的内容全部从chan中发送出去
//帧ID = packet_ID + idx
static void Packet2Chan(eCANNUM chan,UINT16 packet_ID)
{
	UINT16 idx = 0; //步长8递增,0,8,16,...
	UINT32 status = 0;
	
	do
	{
		CTbuf.TxFrameInfo.Bits.PRIO_BIT = 0; 	//优先级
		CTbuf.TxFrameInfo.Bits.FF_BIT	= 1;		//帧格式
		CTbuf.TxFrameInfo.Bits.RTR_BIT = 0;		//帧类型
		CTbuf.TxFrameInfo.Bits.DLC_BIT = 8;		//数据长度
		//frame ID
		*((UINT16 *)&CTbuf.TxCANID.Word ) = idx;
		*((UINT16 *)&CTbuf.TxCANID.Word + 1) = packet_ID;
		//数据区
		memcpy((UINT8 *)&CTbuf.CANTDA,&sCommSnd[idx],4);
		memcpy((UINT8 *)&CTbuf.CANTDB,&sCommSnd[idx+4],4);
		
		idx += 8;
		status = CANSendData(chan, 0x01,&CTbuf);
		//DelayNS(1);
		Delay(10000); //延长时间,与具体硬件有关系
		
	}while(pstcPacket->packetLen > idx) ;

	pstcPacket->packetLen = 0;
}

UINT8 SendPacket(UINT16 ID, UINT8 *sCommand,UINT16 packetLen) //packetLen 是sCommand的长度加上5
{
	UINT16 SendLen; //实际发送的长度,8的整数倍。
	
	pstcPacket = (stcPacket *)sCommSnd;
	pstcPacket->packetID = ID;
	pstcPacket->packetLen = packetLen+5;
	memcpy(sCommSnd+4,sCommand,packetLen);
	sCommSnd[ pstcPacket->packetLen-1] = 0xFF; //CRC, 需要计算

	//先把sCommSnd的长度补充成8  的整数倍。
	SendLen = packetLen+5;
	while(SendLen % 8!=0)
	{
		sCommSnd[SendLen++] = 0x00;
	}
   
	if(ChanFlag == 1) // 0 通
	{
		chan = 0;
		Bal += SendLen;
		if(Bal > 80) //3100
		{ 
			Bal = 0; 
			ChanFlag = 3; //双通
		}
	}
	else if(ChanFlag == 2) // 1 通
	{
		chan = 1;
		Bal -= SendLen;
		
		if(Bal < -80) //3100
		{
			Bal = -1;		  
			ChanFlag = 3; //双通
		}
	}
	else // 都不通 或者 都通
	{
		if(Bal < 0)
		{  
			chan = 0;
			Bal += SendLen;
		}
		else 
		{
			chan = 1;
			Bal -= SendLen;
		}
		ChanFlag = 3;
	}
	CurrentSndPacketID = ID;
	AckArrived = 0;
	Packet2Chan(chan,ID);

	if(ReceiveAck(SendLen))
  		return true;
	else
	{
		ChanFlag &= ~ (chan+1); //chan = 1,2 ChanFlag = 1,2,3		
		return false;
	}
}




void	CanDataToNetApp(eCANNUM CanNum)
{
	UINT8 i;

	if(*((UINT16 *)&CRBuf.RxCANID.Word ) == 0 ){ //是一包的首帧第三四字节是包的长度,记录下来
		CurrentRcvPacketLen = *((UINT8 *)&CRBuf.CANRDA+2)+ (*((UINT8 *)&CRBuf.CANRDA+3)<<8);
		CurrentRcvPacketID = *((UINT16 *)&CRBuf.RxCANID.Word + 1);
		LockedFlag = 1;
	}

	for(i=0;i<4;i++)
	{
		sCommRcv[TransCounter+i]=*((UINT8 *)&CRBuf.CANRDA+i);
	}
	for(i=0;i<4;i++)
	{
		sCommRcv[TransCounter+4+i]=*((UINT8 *)&CRBuf.CANRDB+i);
	}
	TransCounter += 8;


	pID =  *((UINT16 *)&CRBuf.RxCANID.Word );
	if((CurrentRcvPacketLen - pID)<=8) //packelen - idx ==8 说明是末帧
	 	NetAppSendFlag = 1;

	if(NetAppSendFlag)
	{
		SendAckPacket(CanNum);
		Uart0Send(CurrentRcvPacketLen-5, sCommRcv+4);
		
		NetAppSendFlag = 0;
		TransCounter = 0;
		LockedFlag = 0;
		CurrentRcvPacketID = 0;
	}
}

⌨️ 快捷键说明

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