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

📄 can_lib.c

📁 AVR开发板 C实现 液晶 can总线控制及其他外围电路源代码
💻 C
字号:
//******************************************************************************
#include "common.h"
#include "can_lib.h"
#include "can_drv.h"
//------------------------------------------------------------------------------
U8 can_init(U8 mode)
{
    if ((Can_bit_timing(mode))==0) return (0);  
    can_clear_all_mob();                        
    Can_enable();                               
    return (1);
}
//------------------------------------------------------------------------------
st_cmd_t message;
U8 buffer[8];
//-------------------------------------------------------------------------------
U8 can_cmd(st_cmd_t* cmd)
{
  U8 mob_handle, cpt;
  U32 u32_temp;
  
  if (cmd->cmd == CMD_ABORT)
  {
    if (cmd->status == MOB_PENDING)
    {
      // Rx or Tx not yet performed
      Can_set_mob(cmd->handle);
      Can_mob_abort();
      Can_clear_status_mob();       // To be sure !
      cmd->handle = 0;
    }
    cmd->status = STATUS_CLEARED; 
  }
  else
  {
    mob_handle = can_get_mob_free();
    if (mob_handle!= NO_MOB)
    {
      cmd->status = MOB_PENDING; 
      cmd->handle = mob_handle;
      Can_set_mob(mob_handle);
      Can_clear_mob();
          
      switch (cmd->cmd)
      {
        //------------      
        case CMD_TX:    
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
          if (cmd->ctrl.rtr) Can_set_rtr(); 
            else Can_clear_rtr();    
          Can_set_dlc(cmd->dlc);
          Can_config_tx();
          break;
        //------------      
        case CMD_TX_DATA:    
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
          cmd->ctrl.rtr=0; Can_clear_rtr();
          Can_set_dlc(cmd->dlc);
          Can_config_tx();
          break;
        //------------      
        case CMD_TX_REMOTE:       
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          cmd->ctrl.rtr=1; Can_set_rtr();
          Can_set_dlc(cmd->dlc);
          Can_config_tx();
          break;
        //------------      
        case CMD_RX:
          u32_temp=0; Can_set_ext_msk(u32_temp);
          Can_clear_rtrmsk();
          Can_clear_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_RX_DATA:
          u32_temp=0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=0; Can_set_rtrmsk(); Can_clear_rtr();
          Can_clear_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_RX_REMOTE:
          u32_temp=0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
          Can_clear_rplv();
          Can_clear_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_RX_MASKED:
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          u32_temp=~0; Can_set_ext_msk(u32_temp);
          Can_clear_rtrmsk();
          Can_set_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_RX_DATA_MASKED:
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          u32_temp=~0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=0; Can_set_rtrmsk(); Can_clear_rtr();
          Can_set_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_RX_REMOTE_MASKED:
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          u32_temp=~0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
          Can_clear_rplv();
          Can_set_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_REPLY:
          for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
          u32_temp=0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
          Can_set_rplv();
          Can_clear_idemsk();
          Can_config_rx();       
          break;
        //------------      
        case CMD_REPLY_MASKED:
          if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
          else              { Can_set_std_id(cmd->id.std);}
          for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
          u32_temp=~0; Can_set_ext_msk(u32_temp);
          cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
          Can_set_rplv();
          Can_set_idemsk();
          Can_config_rx();       
          break;
        //------------      
        default:
          // case CMD_NONE or not implemented command
          cmd->status = STATUS_CLEARED; 
          break;
        //------------      
      } // switch (cmd ...
    } // if (mob_handle ...
    else
    {
      cmd->status = MOB_NOT_REACHED;
      return CAN_CMD_REFUSED;
    }
  } // else of no CMD_ABORT
  return CAN_CMD_ACCEPTED;
}

//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
U8 can_get_status (st_cmd_t* cmd)
{
    U8 a_status, rtn_val;
     
    a_status = cmd->status;
    if ((a_status==STATUS_CLEARED)||(a_status==MOB_NOT_REACHED)||(a_status==MOB_DISABLE))
    {
        return CAN_STATUS_ERROR;
    }

    Can_set_mob(cmd->handle);
    a_status = can_get_mob_status();
    
    switch (a_status)
    {
        case MOB_NOT_COMPLETED:
            // cmd->status not updated
            rtn_val = CAN_STATUS_NOT_COMPLETED;
            break;
        //---------------      
        case MOB_RX_COMPLETED:     
        case MOB_RX_COMPLETED_DLCW:
            cmd->dlc = Can_get_dlc();
            can_get_data(cmd->pt_data);
            cmd->ctrl.rtr = Can_get_rtr();
            if (Can_get_ide()) // if extended frame
            {
                cmd->ctrl.ide = 1; // extended frame
                Can_get_ext_id(cmd->id.ext);
            }
            else // else standard frame
                {
                    cmd->ctrl.ide = 0;
                    Can_get_std_id(cmd->id.std);
                }
            // Status field of descriptor: 0x20 if Rx completed
            // Status field of descriptor: 0xA0 if Rx completed with DLCWarning    
            cmd->status = a_status;
            Can_mob_abort();        // Freed the MOB
            Can_clear_status_mob(); //   and reset MOb status
            rtn_val = CAN_STATUS_COMPLETED;
            break;
        //---------------      
        case MOB_TX_COMPLETED:     
            // Status field of descriptor: 0x40 if Tx completed
            cmd->status = a_status;
            Can_mob_abort();        // Freed the MOB
            Can_clear_status_mob(); //   and reset MOb status
            rtn_val = CAN_STATUS_COMPLETED;
            break;
        //---------------      
        default:
            // Status field of descriptor: (bin)000b.scfa if MOb error
            cmd->status = a_status;
            Can_mob_abort();        // Freed the MOB
            Can_clear_status_mob(); //   and reset MOb status
            rtn_val = CAN_STATUS_ERROR;
            break;
             
    } // switch (a_status...
 
    return (rtn_val);
}
    
//ZX加CAN——BUS通信  
//extern st_cmd_t message;
//extern U8 buffer[8];
  
uchar CAN_SHOU(uchar *p)
{
	U8 i, u8_temp;
	U8 led_out = 0;	     
// --- Rx Command       
//==================================
    message.pt_data = &buffer[0];
    for(i=0; i<8; i++) buffer[i]=0;		// --- Init Rx data
      message.cmd = CMD_RX;//_DATA_MASKED;//REMOTE_MASKED;//_DATA_MASKED;//CMD_RX_DATA;//	// --- Rx Command
		//========================
			message.id.ext = 0x7e0;
			message.ctrl.ide = 1;
		//========================
        while(can_cmd(&message) != CAN_CMD_ACCEPTED);	// --- Enable Rx
        while(1)
        {												// --- Wait for Rx completed
            u8_temp = can_get_status(&message);
            if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
        }
//        if (u8_temp == CAN_STATUS_ERROR) break; // Out of the function
	for(i=0;i<8;i++)
	{
		*p = buffer[i];
		p++;
	}
	if(message.dlc >8)
		*p = 8;
	else
		*p = message.dlc;
	if(u8_temp == CAN_STATUS_ERROR)
		return 1;
	else
		return 0;	        
}	
//==========================================================

uchar  CAN_FA(uchar gs,uchar *p)
{
	U8 i, u8_temp;
	U8 led_out = 0;
	
// --- Tx Command
//===========================
			message.pt_data = &buffer[0];
            for(i=0; i<8; i++) 
			{
				buffer[i]=*p;
				p++;
			 }
		//=============================
			message.id.ext = 0x7e8;			
			message.ctrl.ide  = 1;
		//==============================
        message.dlc = gs;
        message.cmd = CMD_TX;//_REMOTE;//CMD_TX_DATA;       
        while(can_cmd(&message) != CAN_CMD_ACCEPTED);	// --- Enable Tx
        while(1)										// --- Wait for Tx completed        
        {
            u8_temp = can_get_status(&message);
            if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
        }        
//zx        if (u8_temp == CAN_STATUS_ERROR) break;     // ---- Exit if CAN error(s)
      if(u8_temp == CAN_STATUS_ERROR)
		return 1;
		else
			return 0;	        
}	
//==========================================================
void CAN_INIT(void)    
{
	CLKPR = 0x80;  CLKPR = 0x00;	
    CAN_PORT_DIR &= ~(1<<CAN_INPUT_PIN );	
    CAN_PORT_DIR &= ~(1<<CAN_OUTPUT_PIN);		
    CAN_PORT_OUT |=  (1<<CAN_INPUT_PIN );			
    CAN_PORT_OUT |=  (1<<CAN_OUTPUT_PIN);
	DDRB = 0XFF;
	PORTB = 0X00;	
	Can_reset();        
    can_init((U16)CAN_BAUDRATE);        
    CANTCON = CANBT1;               
}

//============================================================
    
uchar CAN_TEST_SHOU(uchar *p,U32 *p1)
{
	U8 i, u8_temp;
	U8 led_out = 0;	     
// --- Rx Command       
//==================================
    message.pt_data = &buffer[0];
    for(i=0; i<8; i++) buffer[i]=0;		// --- Init Rx data
      message.cmd = CMD_RX;//_DATA_MASKED;//REMOTE_MASKED;//_DATA_MASKED;//CMD_RX_DATA;//	// --- Rx Command
		//========================
			message.id.ext = 0x7e0;
			message.ctrl.ide = 1;
		//========================
        while(can_cmd(&message) != CAN_CMD_ACCEPTED);	// --- Enable Rx
        while(1)
        {												// --- Wait for Rx completed
            u8_temp = can_get_status(&message);
            if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
        }
//        if (u8_temp == CAN_STATUS_ERROR) break; // Out of the function
	*p1 = message.id.ext;
	for(i=0;i<8;i++)
	{
		*p = buffer[i];
		p++;
	}	
	if(message.dlc >8)
		*p = 8;
	else
		*p = message.dlc;
	if(u8_temp == CAN_STATUS_ERROR)
		return 1;
	else
		return 0;	        
}	    
    
    
    
    
    
    
    
    
    

⌨️ 快捷键说明

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