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

📄 main.c

📁 一个CAN总线应用的sample ,采用LPC2119处理器.
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: MAIN.C
**创   建   人: 刘养海
**最后修改日期: 2004年2月26日
**描        述: 实现简单的RS232 TO CAN,CAN T0 RS232的数据转换。通过RS232将一帧固定格式固定长度的数据发给
**				ARM,下位机将数据发往指定的CAN通道,CAN通过自接收将接收到的数据发往RS232.
**				该系统中下位机的UART0\CAN全部工作在查询模式下.
**				RS232发送的数据格式必须为HEX格式,长度必须为17个字节
**RS232发送数据格式: 帧起始(SOF)+CAN通道号(1byte)+CAN帧信息(1byte)+CAN标识符(4byte)+ 数据(8 byte)+发送命令(CMD)+CRC=17byte
**			CAN通道号	<4	:	0=CAN1;	1=CAN2;	2=CAN3;
**								3=CAN4;	
**			CAN帧信息格式	: 位偏移	7	6	5	4	3210
**								功能	FF	RTR	x	x	DLC
**										FF =0标准帧; =1扩展帧;
**										RTR=0数据帧; =1远程帧;
**										DLC <=8 表示要发送的字节数
**	
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘养海
** 版  本: v1.0
** 日 期: 2004年2月26日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"

//测试数据格式
//12 00 88 11 22 33 44 00 01 02 03 04 05 06 07 02 00
//24 31 32 33 34 35 36 37 38 39 30 0D 0A 31 32
//24 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30 0D 0A 31 32

UINT8  	DeviceID=0;

const	UINT8	HelloArmCan[]={"Wellcome to using ZLG ARMLPC2XXX CAN test program!\rss\n",};
const	UINT8	Key1Pressed[]={"Key 1 pressed.",};
const	UINT8	Key2Pressed[]={"Key 2 pressed.",};
const	UINT8	CanErr[]={"CAN Chun Err!",};
		UINT8	sCommand[251];

UINT8  		SRBuf[160],STBuf[100];			//
stcTxBUF 	CTbuf;							//
stcRxBUF		CRBuf;							//

UINT32		CanSendFlag=0;					//
UINT32		UartStatus=0,RcvCounter=0,TransCounter=0;	

UINT32	NetAppSendFlag = 0;
	
UINT8  	ChanFlag = 3; // 1 CAN0畅通 2 CAN1畅通 3 两个都畅通或者都不通,按规则处理
UINT8	chan;     //缺省的CAN通道  
INT16 	Bal = 0;		// 平衡流量计数器 >=0 表示 CAN0流量多 <0 CAN1 流量多
UINT8	AckArrived = 0;
UINT16	CurrentSndPacketID = 0;	//用于判断发送包对应的应答包
UINT16	CurrentRcvPacketLen;  	//用于判断末帧是否到达Len = idx+8
UINT16	CurrentRcvPacketID = 0;	//用于判断接收包的合法性
UINT16	LockedFlag = 0;

UINT8  	sCommSnd[256];
UINT8	sCommRcv[256];

stcPacket * pstcPacket;


UINT8	WaitResponse=0;
UINT8	tmp;


/*
************************************************************************************************************************
**函数原型	:  void	UartComPol(void)
**参数说明	:  	
**返回	值	:  	
**说	明	: 该函数用于解析RS232数据到CAN数据的协议	
************************************************************************************************************************
*/
//#define	SOF		0x12
//#define	CRC		0x00
//#define	SOF_STATUS	00
//#define	DATA_STATUS 01


extern UINT8 SendPacket(UINT16 , UINT8 *,UINT16 ) ;
extern void DelayNS(UINT32  dly);
extern void BeepOn(void);
extern void BeepOff(void);
extern void HC595_SendDat(UINT32 );
extern UINT32 KeyGet(void);
extern void LED(UINT32);
extern void CanDataToNetApp(eCANNUM CanNum);
extern void SendAckPacket(eCANNUM CanNum);
extern void Beep(UINT32);
extern void SendBeginPacket(void);
extern void SendEndPacket(void);

extern void Time0Init(void);


/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/

void  DelayNS(UINT32  dly)
{  UINT32  i;

   for(; dly>0; )
   {
      dly--; 
      for(i=0; i<50000; ){
	     i++;
      }
   }
}

UINT32	DataToCan(eCANNUM CanNum,UINT8 CANID)
{
	UINT32	status=0,i;
	SRBuf[0]=0x00;
	SRBuf[1]=0x88;
	SRBuf[2]=0x22;
	SRBuf[3]=0x22;
	SRBuf[4]=0x00;
	SRBuf[5]=CANID;
	SRBuf[6]=0x00;
	SRBuf[7]=0x01;
	SRBuf[8]=0x02;
	SRBuf[9]=0x03;
	SRBuf[10]=0x04;
	SRBuf[11]=0x05;
	SRBuf[12]=0x06;
	SRBuf[13]=0x07;
	SRBuf[14]=0x01;
		

	{
		CTbuf.TxFrameInfo.Bits.PRIO_BIT = SRBuf[0]; 			//CAN通道号
		CTbuf.TxFrameInfo.Bits.FF_BIT	= (SRBuf[1]&0x80) >> 7;	//帧格式
		CTbuf.TxFrameInfo.Bits.RTR_BIT	= (SRBuf[1]&0x40) >> 6;	//帧类型
		CTbuf.TxFrameInfo.Bits.DLC_BIT	= SRBuf[1]&0x0f;			//数据长度
		for(i=0;i<4;i++)
		{
			*((UINT8 *)&CTbuf.TxCANID.Word + i)=SRBuf[5-i];
		}
		memcpy((UINT8 *)&CTbuf.CANTDA,&SRBuf[6],4);
		memcpy((UINT8 *)&CTbuf.CANTDB,&SRBuf[10],4);
		status = CANSendData(CanNum,SRBuf[14],&CTbuf);
	}
	return	status;
}

void KeyDeal()
{
	UINT32 i;
	i = KeyGet();
	
	switch(i)
	{
		case KEY_1:
			memcpy(STBuf,"$S",2);
			STBuf[2]=0x0D;
			STBuf[3]=0x0A;
			Uart0Send(4,STBuf);
			BeepOn();
			//DataToCan(0,1);//送CAN0
			HC595_SendDat(DISP_TAB[5]);
			DelayNS(10);
			BeepOff();
			break;
		case KEY_2:
			WaitResponse = 1;
			memcpy(STBuf,"$C",2);
			STBuf[2]=0x0D;
			STBuf[3]=0x0A;
			Uart0Send(4,STBuf);
			//DataToCan(1,2);//送CAN1
			HC595_SendDat(DISP_TAB[12]);
			break;
		case KEY_3:
			WaitResponse = 1;
			memcpy(STBuf,"$L",2);
			STBuf[2]=0x0D;
			STBuf[3]=0x0A;
			Uart0Send(4,STBuf);
			HC595_SendDat(DISP_TAB[1]);
			break;
		case KEY_4:
			memcpy(sCommand,"$GPGSV,1,1,01,21,00,000,00*4B",29);
			sCommand[29]=0x0D;
			sCommand[30]=0x0A;
				
			BeepOn();
			DelayNS(10);
			BeepOff();
			
			if(SendPacket(43,sCommand,31) == true)
			{
				BeepOn();
				DelayNS(10);
				BeepOff();
			}
			HC595_SendDat(DISP_TAB[4]);
			break;
		case KEY_5:
		case KEY_6:
		default:
			break;
		  
	}	
}

#if 1

#define A_LEN 8
#define B_LEN 0
#define C_LEN 33
#define D_LEN 0
#define E_LEN 50
#define F_LEN 0
#define G_LEN 79
#define H_LEN 0
#define I_LEN 35
#define J_LEN 9
void   __irq IRQ_UART0(void)
{
   if( (0x04==(U0IIR&0x0F)) && (CanSendFlag == 0)) 
	switch(UartStatus)
	{

		case	0:
			RcvCounter=0;
			if((UINT8)uU0RBR.Word == 0x24)
			{
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
				UartStatus++;
			}
			else 
				tmp = (UINT8)uU0RBR.Word; 

			HC595_SendDat(DISP_TAB[0]);
			break;
		case	1:
			HC595_SendDat(DISP_TAB[1]);
			SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			DeviceID = (UINT8)uU0RBR.Word; 
			UartStatus = DeviceID - 63;       //因为63='A'-2
			break;
		case	2://	A	炮塔角度传感器
			HC595_SendDat(DISP_TAB[2]);
			if(RcvCounter < A_LEN-1)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[RcvCounter++]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
				}
				UartStatus=0;
			}
			break;
		case	3://	B	炮塔电源
			break;
		case	4://	C	火控制接口装置
			if(RcvCounter < C_LEN)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A );
				{
					SRBuf[RcvCounter++]=0x0A;
					CanSendFlag =1;         //检验一下报尾,使能CAN发送
					HC595_SendDat(DISP_TAB[3]);
				}
				UartStatus=0;
			}
			break;
		case	5://	D	光电对抗设备
			break;
		case	6://	E	工矿采集设备
			if(RcvCounter < E_LEN-1)
				SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; 
			else
			{
				if((UINT8)uU0RBR.Word == 0x0A )
				{
					SRBuf[RcvCounter++]=0x0A;

⌨️ 快捷键说明

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