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

📄 mcp2515.c

📁 车用液晶仪表中s3c2410的can接口程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -