?? 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);
}
{
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 + -