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

📄 canuser.c

📁 Keil平台
💻 C
📖 第 1 页 / 共 2 页
字号:
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 CanSendFixedValue(uint8 CanIndex)
{
	uint8 err;
	uint32 status=0;
	OSSemPend(CanSendSem[CanIndex],0,&err);                             //申请发送数据信号量
	CTBuf.TxFrameInfo.Bits.PRIO_BIT = 0;	                            //缓冲区数据发送优先级的值
	CTBuf.TxFrameInfo.Bits.FF_BIT	= 0;                                //帧格式 =0标准帧; =1扩展帧;
	CTBuf.TxFrameInfo.Bits.RTR_BIT	= 0;	                            //帧类型 =0数据帧; =1远程帧;
	CTBuf.TxFrameInfo.Bits.DLC_BIT	= 8;	                            //数据长度
    CTBuf.TxCANID.Word = (CAN_R_FIXED_VALUE<<7) + BoardAddress + 0x400; //CAN ID的最高位置 1 
    CTBuf.CANTDA.DataType.Bits8.Data1_BIT  = 1;                         //数据包号
    CTBuf.CANTDA.DataType.Bits8.Data2_BIT  = 2;                         //总包数
    CTBuf.CANTDA.DataType.Bits16.Data2_BIT = CellUHigh;                 //过压点
    CTBuf.CANTDB.DataType.Bits16.Data1_BIT = CellULow;                  //欠压点
    CTBuf.CANTDB.DataType.Bits16.Data2_BIT = TempHigh;                  //过温点
	status = CANSendData(CanIndex,0,&CTBuf);                            //CAN通道号:通道0 ;发送命令字:正常发送 要发送的数据:CTBuf

	OSSemPend(CanSendSem[CanIndex],0,&err);                             //申请发送数据信号量
	CTBuf.TxFrameInfo.Bits.PRIO_BIT = 0;	                            //缓冲区数据发送优先级的值
	CTBuf.TxFrameInfo.Bits.FF_BIT	= 0;                                //帧格式 =0标准帧; =1扩展帧;
	CTBuf.TxFrameInfo.Bits.RTR_BIT	= 0;	                            //帧类型 =0数据帧; =1远程帧;
	CTBuf.TxFrameInfo.Bits.DLC_BIT	= 8;	                            //数据长度
    CTBuf.TxCANID.Word = (CAN_R_FIXED_VALUE<<7) + BoardAddress + 0x400; //CAN ID的最高位置 1 
    CTBuf.CANTDA.DataType.Bits8.Data1_BIT  = 2;                         //数据包号
    CTBuf.CANTDA.DataType.Bits8.Data2_BIT  = 2;                         //总包数
    CTBuf.CANTDA.DataType.Bits16.Data2_BIT = CellUK;                    //校准单只电池电压K值
    CTBuf.CANTDB.DataType.Bits16.Data1_BIT = SumUK;                     //校准总电压K值
    CTBuf.CANTDB.DataType.Bits16.Data2_BIT = 0;                         //无数据
	status = CANSendData(CanIndex,0,&CTBuf);                            //CAN通道号:通道0 ;发送命令字:正常发送 要发送的数据:CTBuf
	return	status;
}
/*********************************************************************************************************
** 函数名称: uint32 ReadBtuAnalog(void)
** 功能描述: 保存发来的定值数据(包1 W)电池过压点、电池欠压点、过温点(包2 W)校准K值
** 输   入: 无
** 输   出: 无
** 作 者: 刘宝贵
** 日 期: 2007年8月11日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CanReceiveFixedValue()
{
//	uint8 err;
//    if(CRBuf.CANRDA.DataType.Bits8.Data1_BIT == 1)//如果是第一包数据
//	{
//		CellUHigh = CRBuf.CANRDA.DataType.Bits16.Data2_BIT;
//		CellULow  = CRBuf.CANRDB.DataType.Bits16.Data1_BIT;
//		TempHigh  = CRBuf.CANRDB.DataType.Bits16.Data2_BIT;
//        OSSemPend(I2CSem,0,&err);  
//		EepromWriteWord(EEROM_ADD_CELLUHIGH , CellUHigh);
//		EepromWriteWord(EEROM_ADD_CELLULOW  , CellULow );
//		EepromWriteWord(EEROM_ADD_TEMPHIGH  , TempHigh );
//        OSSemPost(I2CSem);                        
//	}
//	else if(CRBuf.CANRDA.DataType.Bits8.Data1_BIT == 2)//如果是第二包数据
//	{
//		CellUK   = CRBuf.CANRDA.DataType.Bits16.Data2_BIT;
//		SumUK    = CRBuf.CANRDB.DataType.Bits16.Data1_BIT;
//        OSSemPend(I2CSem,0,&err);  
//		EepromWriteWord(EEROM_ADD_CELLUK , CellUK);
//		EepromWriteWord(EEROM_ADD_SUMUK  , SumUK);
//        OSSemPost(I2CSem);                        
//	}
}
/*********************************************************************************************************
** 函数名称: TaskCan
** 功能描述: Can口数据处理任务
** 输 入: 无
** 输 出: 无
** 作 者: 刘宝贵
** 日 期: 2007年8月6日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint32 Can0RecCon;
uint32 Can1RecCon;
void TaskCan(void *pdata)
{
    uint8 CanIndex,FunctionDescription;
	uint8 err;
	pdata = pdata;
	//debug begin
    Can0RecCon = 0;
    Can1RecCon = 0;
	//debug end
    I2CSem        = OSSemCreate(1);						//初始化信号量
    CanReceiveSem = OSSemCreate(0);						//初始化信号量
    CanSendSem[0] = OSSemCreate(1);                     //初始化信号量
    CanSendSem[1] = OSSemCreate(1);                     //初始化信号量
	for(CanIndex=0;CanIndex<REALCAN;CanIndex++)
	{
		InitCAN(CanIndex);	
	}
	while (1)
	{			
        OSSemPend(CanReceiveSem,0,&err);                //等待接收CAN口数据包
		for(CanIndex=0;CanIndex<REALCAN;CanIndex++)     //循环读取两个CAN口
		{
			if(ReadCANRcvCyBuf(CanIndex,&CRBuf) == 0)   //驱动接收到数据。
			{
			    if(CanIndex==0)
				{
				    Can0RecCon++;
				}
				else
				{
				    Can1RecCon++;
				}
				if(0 == CRBuf.RxCANID.FrameFm.stcSTRFRFM.ID_BIT && 0x7F)
				{
					//广播报文处理。。。。。。。。。。。。。
				}
				else if(BoardAddress == (CRBuf.RxCANID.FrameFm.stcSTRFRFM.ID_BIT & 0x7F))
				{
				    FunctionDescription = ((uint8)(CRBuf.RxCANID.FrameFm.stcSTRFRFM.ID_BIT>>7)) & 0x07; //取出结构体中的ID码中功能描述部分
					switch(FunctionDescription)
					{
					    case CAN_R_FIXED_VALUE:
						{
							CanSendFixedValue(CanIndex);
						}break;
					    case CAN_W_FIXED_VALUE:
						{
							CanReceiveFixedValue();
						}break;
					    case CAN_R_ANALOG:
						{
							CanSendAnalog(CanIndex);
						}break;
					    case CAN_R_DIGITAL:
						{
							CanSendDigital(CanIndex);
						}break;
					}//switch(FunctionDescription)
				}
			}
		}
	}
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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