📄 canuser.c
字号:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
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 + -