📄 mcp2515.c
字号:
F_M_data2[0] = (RXM0>>3) & 0xff;
F_M_data2[1] = (RXM0 & 0x7)<<5;
F_M_data2[4] = (RXM1>>3) & 0xff;
F_M_data2[5] = (RXM1 & 0x7)<<5;
}
void MCP2515_Rec(void)
{
U8 CAN_State;
CAN_State = CAN_Read_State();
//System_Light();
//------------------------
//CAN_Write(0x2d, 0x00);
//CAN_Write(0x2c, 0x00);
//---------------------------
if((CAN_State & 0x03) != 0)
{
if((CAN_State & 0x01) == 1)
{
///////////////////////////////////////////////////////////////////////////////
CAN_Bit_cmd(CANINTF,RX0IF,0x00);
CAN_Read_Data(RXB0SIDH,can_rec_data,13);
CANDATA.CAN_IDs = (((int)can_rec_data[0])<<3) | ((can_rec_data[1]>>5) & 0x07);
CANDATA.CAN_DATA[0] = can_rec_data[5];
CANDATA.CAN_DATA[1] = can_rec_data[6];
CANDATA.CAN_DATA[2] = can_rec_data[7];
CANDATA.CAN_DATA[3] = can_rec_data[8];
CANDATA.CAN_DATA[4] = can_rec_data[9];
CANDATA.CAN_DATA[5] = can_rec_data[10];
CANDATA.CAN_DATA[6] = can_rec_data[11];
CANDATA.CAN_DATA[7] = can_rec_data[12];
// Uart_Printf("can0 id is %x\n",CANDATA.CAN_IDs);
MCP2515_DataDeal();
// CAN_Write(CANINTE,0x23); //中断使能 CANINTE,0x23
// CAN_Write(CANINTE,0x23); //中断使能
#if 0
Uart_Printf("RXB0:0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
CANDATA.CAN_DATA[0],CANDATA.CAN_DATA[1],CANDATA.CAN_DATA[2],CANDATA.CAN_DATA[3],
CANDATA.CAN_DATA[4],CANDATA.CAN_DATA[5],CANDATA.CAN_DATA[6],CANDATA.CAN_DATA[7]);
#endif
CAN_Bit_cmd(CANINTF,RX0IF,0x00);
// Uart_Printf("w %d\n",testEint3++);
//////////////////////////////////////////////////////////////////////////////////
}
if((CAN_State & 0x02) == 2)
{
///////////////////////////////////////////////////////////////////////////////
CAN_Bit_cmd(CANINTF,RX1IF,0x00);
CAN_Read_Data(RXB1SIDH,can_rec_data,13);
CANDATA.CAN_IDs = (((int)can_rec_data[0])<<3) | ((can_rec_data[1]>>5) & 0x07);
CANDATA.CAN_DATA[0] = can_rec_data[5];
CANDATA.CAN_DATA[1] = can_rec_data[6];
CANDATA.CAN_DATA[2] = can_rec_data[7];
CANDATA.CAN_DATA[3] = can_rec_data[8];
CANDATA.CAN_DATA[4] = can_rec_data[9];
CANDATA.CAN_DATA[5] = can_rec_data[10];
CANDATA.CAN_DATA[6] = can_rec_data[11];
CANDATA.CAN_DATA[7] = can_rec_data[12];
//Uart_Printf("can1 id is %x\n",CANDATA.CAN_IDs);
MCP2515_DataDeal();
//CAN_Write(CANINTE,0x23); //中断使能 CANINTE,0x23
// CAN_Write(CANINTE,0x23); //中断使能
#if 0
Uart_Printf("RXB1:0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
CANDATA.CAN_DATA[0],CANDATA.CAN_DATA[1],CANDATA.CAN_DATA[2],CANDATA.CAN_DATA[3],
CANDATA.CAN_DATA[4],CANDATA.CAN_DATA[5],CANDATA.CAN_DATA[6],CANDATA.CAN_DATA[7]);
#endif
CAN_Bit_cmd(CANINTF,RX1IF,0x00);
// Uart_Printf("g %d\n",testEint4++);
//////////////////////////////////////////////////////////////////////////////////
}
}
// if (((CANINTE>>7) & 0x01) ==1)
// {
// CAN_Init();
//}
//CAN_Write(CANINTE,0x23); //中断使能 CANINTE,0x23
//CAN_Write(CANINTE,0x23); //中断使能
//System_Light();
}
void MCP2515_DataDeal(void)
{
//Uart_Printf("can2 id is %x\n",CANDATA.CAN_IDs);
switch(CANDATA.CAN_IDs)
{
//Uart_Printf("can3 id is %x\n",CANDATA.CAN_IDs);
case 0x341:
rec_data.bat_vol = (float)((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8))*0.2; //电池端电压(2)
rec_data.bat_cur = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.5-200; //电池电流(2)
rec_data.bat_soc = (float)((CANDATA.CAN_DATA[4])|(CANDATA.CAN_DATA[5]<<8))*0.1; //电池soc(2)
//InvalidateRect(122,370,263,411);
CAN1=CANDATA.CAN_DATA[4];
CAN2=CANDATA.CAN_DATA[5];
// output_number(CANDATA.CAN_DATA[5],151,390,0xFFFF);
if((rec_data.bat_soc - 100.0)>=0)
{ rec_data.bat_soc=100.0;}
//else
// {rec_data.bat_soc=100.0;}
rec_data.bat_tem = (float)((CANDATA.CAN_DATA[6])|(CANDATA.CAN_DATA[7]<<8))*0.16-40; //电池温度(2)
//Uart_Printf("can3 id is %x\n",CANDATA.CAN_IDs);
//Uart_Printf("rec_data.bat_vol id is %d\n",(int)rec_data.bat_vol);
break;
case 0x301:
CANDATA.VMS_State = 1; //收到VMS广播消息
break;
case 0x302:
rec_data.gear = CANDATA.CAN_DATA[4]; //档位信号
break;
/* //轮毂电机电机
case 0x311:
rec_data.mot1_spe = ((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8)); //1#电机转速(2)
rec_data.mot1_tor = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.25-500;//1#电机转矩(2)
break;
case 0x321:
rec_data.mot2_spe = ((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8)); //2#电机转速(2)
rec_data.mot2_tor = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.25-500;//2#电机转矩(2)
break;
case 0x331:
rec_data.mot3_spe = ((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8)); //3#电机转速(2)
rec_data.mot3_tor = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.25-500;//3#电机转矩(2)
break;
case 0x343:
rec_data.mot4_spe = ((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8)); //4#电机转速(2)
rec_data.mot4_tor = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.25-500;//4#电机转矩(2)
break;
*/
case 0x343:
rec_data.bm_status = CANDATA.CAN_DATA[4]; //继电器状态
break;
case 0x311:
rec_data.mot1_spe = ((CANDATA.CAN_DATA[0])|(CANDATA.CAN_DATA[1]<<8)); //1#电机转速(2)
rec_data.mot1_tor = (float)((CANDATA.CAN_DATA[2])|(CANDATA.CAN_DATA[3]<<8))*0.25-500;//1#电机转矩(2)
///现在使用的偏移量为10000
if(rec_data.mot1_spe >= 10000 && rec_data.mot1_spe <= 20504)
{
//rec_data.speed = (int)((rec_data.mot1_spe - 10000)*8.567727/1000);
rec_data.speed = (int)((rec_data.mot1_spe - 10000)*8.84332/1000);
}
else if(rec_data.mot1_spe >= -504 && rec_data.mot1_spe <= 10000)
{
rec_data.speed = (int)((10000 - rec_data.mot1_spe)*8.84332/1000);
//rec_data.speed = (int)((10000 - rec_data.mot1_spe)*8.567727/1000);
}
else
{ rec_data.speed = 90;}
/*//协议规定的偏移量为2000
if(rec_data.mot1_spe >= 2000 && rec_data.mot1_spe <= 2925)
rec_data.speed = (int)((rec_data.mot1_spe - 2000)*97.5702/1000);
else if(rec_data.mot1_spe >= 1075 && rec_data.mot1_spe <= 2000)
rec_data.speed = (int)((2000 - rec_data.mot1_spe)*97.5702/1000);
else
rec_data.speed = 90;
*/
//Uart_Printf("rec_data.mot1_spe id is %d\n",rec_data.mot1_spe);
//Uart_Printf("rec_data.speed id is %d\n",rec_data.speed);
break;
case 0x297:
rec_data.dtc_id = CANDATA.CAN_DATA[0];
rec_data.dtc = (CANDATA.CAN_DATA[4]<<24) | (CANDATA.CAN_DATA[3]<<16) |(CANDATA.CAN_DATA[2]<<8) |(CANDATA.CAN_DATA[1]);
DTC_Deal();
break;
case 0x30c:
break;
case 0x30e:
break;
default:
//Uart_Printf("can3 id is %x\n",CANDATA.CAN_IDs);
break;
}
/* //轮毂电机电机
MOT_Deal();
MOTtor_Deal();
*/
}
void MOT_Deal(void) //07-18-16轮毂电机转速处理
{
int i,j;
i=rec_data.mot1_spe;
j=rec_data.mot2_spe;
if(rec_data.mot1_spe<=rec_data.mot2_spe)
j=rec_data.mot1_spe;
i=rec_data.mot2_spe;
if(rec_data.mot3_spe>=j &&rec_data.mot3_spe<=i)
j=rec_data.mot3_spe;
if(rec_data.mot3_spe >= i)
j=i;
i=rec_data.mot3_spe;
if(rec_data.mot4_spe>=j &&rec_data.mot4_spe<=i)
j=rec_data.mot4_spe;
if(rec_data.mot4_spe >= i)
j=i;
i=rec_data.mot4_spe;
rec_data.mot1_spe=(i+j)/2;
if(rec_data.mot1_spe >= 2000 && rec_data.mot1_spe <= 2925)
rec_data.speed = (int)((rec_data.mot1_spe - 2000)*97.5702/1000);
else if(rec_data.mot1_spe >= 1075 && rec_data.mot1_spe <= 2000)
rec_data.speed = (int)((2000 - rec_data.mot1_spe)*97.5702/1000);
else
rec_data.speed = 90;
}
void MOTtor_Deal(void) //07-18-16轮毂电机扭矩处理
{
int i,j;
i=rec_data.mot1_tor;
j=rec_data.mot2_tor;
if(rec_data.mot1_tor<=rec_data.mot2_tor)
j=rec_data.mot1_tor;
i=rec_data.mot2_tor;
if(rec_data.mot3_tor>=j &&rec_data.mot3_tor<=i)
j=rec_data.mot3_tor;
if(rec_data.mot3_tor >= i)
j=i;
i=rec_data.mot3_tor;
if(rec_data.mot4_tor>=j &&rec_data.mot4_tor<=i)
j=rec_data.mot4_tor;
if(rec_data.mot4_tor >= i)
j=i;
i=rec_data.mot4_tor;
rec_data.mot1_tor=(i+j)/2;
}
void DTC_Deal(void)
{
int i;
for(i=0;i<dtccount+1;i++)
{
if(((rec_data.dtc>>8)&0xffff) == ((DTC[0][i]>>8)&0xffff))
{
flag = 0; //code that already exit
dtc_same_flag = i;
break;
}
}
if(flag == 1) //new DTC code added to DTC[]
{
for(i=0;i<dtccount+1;i++)
{
if(DTC[0][i]==0)
{
dtccount = i;
break;
}
}
DTC[0][dtccount] = rec_data.dtc;
DTC[1][dtccount] =dtc_del_time;
dtccount++;
}
if(flag == 0)
{
if(((rec_data.dtc)&0xff) != ((DTC[0][dtc_same_flag])&0xff))
{
//add:
DTC[1][dtc_same_flag] = dtc_del_time;
}
for(i=0;i<dtccount+1;i++)
{
if(DTC[0][i]==0)
dtccount = i;
}
flag = 1;
dtc_same_flag = 0;
}
}
/*/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////
CAN_Bit_cmd(CANINTF,RX0IF,0x00);
CAN_Read_Data(RXB0SIDH,can_rec_data,13);
CANDATA.CAN_IDs = (((int)can_rec_data[0])<<3) | ((can_rec_data[1]>>5) & 0x07);
/////////////for extend frame data id://///////////////////////////////////////////
CANDATA.CAN_IDe = (((int)can_rec_data[0])<<21) | (((can_rec_data[1]>>5) & 0x07)<<18)
| (((can_rec_data[1]) & 0x03)<<16) | ((can_rec_data[2])<<8)
| (can_rec_data[3]);
////////////////////////////////////////////////////////////////////////////////////
CANDATA.CAN_Frametype = (can_rec_data[1]>>3) & 0x01;
////////////////////for standard frame format: 数据帧:0;远程帧:1;
CANDATA.CAN_sFrameformat = (can_rec_data[1]>>4) & 0x01;
////////////////////for extend frame format: 数据帧:0;远程帧:1;
CANDATA.CAN_eFrameformat = (can_rec_data[4]>>6) & 0x01;
/////////////////////////////////////////////////////////////////
CANDATA.CAN_Datalength = (can_rec_data[4]) & 0x0f;
CANDATA.CAN_DATA[0] = can_rec_data[5];
CANDATA.CAN_DATA[1] = can_rec_data[6];
CANDATA.CAN_DATA[2] = can_rec_data[7];
CANDATA.CAN_DATA[3] = can_rec_data[8];
CANDATA.CAN_DATA[4] = can_rec_data[9];
CANDATA.CAN_DATA[5] = can_rec_data[10];
CANDATA.CAN_DATA[6] = can_rec_data[11];
CANDATA.CAN_DATA[7] = can_rec_data[12];
Uart_Printf("CAN ID is 0x%x\n",CANDATA.CAN_IDs);
Uart_Printf("CAN Frametype is %d\n",CANDATA.CAN_Frametype);
Uart_Printf("CAN Frameformats is %d\n",CANDATA.CAN_sFrameformat);
Uart_Printf("CAN Frameformate is %d\n",CANDATA.CAN_eFrameformat);
Uart_Printf("CAN Datalength is %d\n",CANDATA.CAN_Datalength);
Uart_Printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
CANDATA.CAN_DATA[0],CANDATA.CAN_DATA[1],CANDATA.CAN_DATA[2],CANDATA.CAN_DATA[3],
CANDATA.CAN_DATA[4],CANDATA.CAN_DATA[5],CANDATA.CAN_DATA[6],CANDATA.CAN_DATA[7]);
*//////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -