Main Page | Data Structures | File List | Data Fields | Globals | Related Pages

can_lib.c

Go to the documentation of this file.
00001 
00014 /*_____ I N C L U D E - F I L E S ____________________________________________*/
00015 #include "config.h"
00016 #include "lib_mcu/can/can_lib.h"
00017 
00018 /*_____ G L O B A L S ________________________________________________________*/
00019 
00020 #define STATUS_MOB_USED      0x01
00021 #define STATUS_MOB_AVAILABLE 0x00
00022 
00023 /*_____ P R I V A T E - F U N C T I O N S - D E C L A R A T I O N ____________*/
00024 
00025 /*_____ L O C A L S __________________________________________________________*/
00026 
00027 /*_____ P U B L I C - F U N C T I O N S ______________________________________*/
00028 
00029 /*_____ P R I V A T E - F U N C T I O N S ____________________________________*/
00030 
00031 void can_init (void)
00032 {
00033   Can_bit_timing();
00034   Can_clear_all_MOB();
00035   Can_enable();  
00036  
00037 }
00038 
00039 
00040 Uchar can_cmd (st_cmd_t* cmd)
00041 {
00042   Uchar mob_handle, cpt;
00043   
00044   if (cmd->cmd == CMD_ABORT)
00045   {
00046     if (cmd->status!= STATUS_MOB_AVAILABLE)
00047     {
00048       Can_set_MOB(cmd->handle);
00049       Can_MOB_abort();
00050       cmd->handle = 0;
00051       cmd->status = STATUS_MOB_AVAILABLE; 
00052     }
00053   }
00054   else
00055   {
00056     mob_handle = Can_get_MOB_free();
00057     cmd->status = STATUS_MOB_USED; 
00058  
00059     if (mob_handle!= NO_MOB)
00060     {
00061       cmd->handle = mob_handle;
00062       Can_set_MOB(mob_handle);
00063       Can_clear_MOB();    
00064       switch (cmd->cmd){
00065         case CMD_TX:    
00066           if (cmd->ctrl.ide){ Can_set_ext_id (cmd->id.ext);}
00067           else               { Can_set_std_id(cmd->id.std);}
00068           for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);         
00069           Can_set_dlc(cmd->dlc);
00070           Can_config_tx();
00071           break;
00072       
00073         case CMD_TX_REMOTE:       
00074           if (cmd->ctrl.ide){ Can_set_ext_remote_id (cmd->id.ext);}
00075           else               { Can_set_std_remote_id(cmd->id.std);}
00076           Can_set_dlc(cmd->dlc);
00077           Can_config_tx();
00078           break;
00079            
00080         case CMD_RX:
00081           Can_config_rx();       
00082           break;
00083         
00084         default:
00085            cmd->status = STATUS_MOB_AVAILABLE; 
00086          break;
00087       }
00088     }else {return CAN_CMD_REFUSED;}
00089   }
00090   return CAN_CMD_ACCEPTED;
00091 }
00092 
00093 
00094 Uchar can_getstatus (st_cmd_t* cmd)
00095 {
00096   Uchar status;
00097  
00098   if (cmd->status == STATUS_MOB_AVAILABLE) {return CAN_STATUS_DISABLED;}
00099   Can_set_MOB(cmd->handle);
00100   status = Can_get_MOB_status();
00101   if (status == MOB_RX_COMPLETED)
00102   {    
00103     cmd->status = 0;
00104     cmd->dlc = Can_get_dlc();
00105     Can_get_data(cmd->pt_data);
00106     cmd->ctrl.rtr = Can_get_rtr();
00107 
00108     if (Can_get_ide()) // if extended frame
00109     {
00110       cmd->ctrl.ide = 1; // extended frame
00111       Can_get_ext_id(cmd->id.ext);
00112     }
00113     else // else standard frame
00114     {
00115       cmd->ctrl.ide = 0;
00116       Can_get_std_id(cmd->id.std);
00117     }
00118     Can_MOB_abort(); // freed the MOB
00119     return CAN_STATUS_COMPLETED;
00120 
00121   }else if (status == MOB_TX_COMPLETED)
00122   {
00123     cmd->status = 0;
00124     Can_MOB_abort(); // freed the MOB
00125     return CAN_STATUS_COMPLETED;
00126   }
00127  
00128   return (status);
00129 }
00130 

Generated on Thu Apr 1 15:49:28 2004 for Library CAN by doxygen 1.3.6