00001
00014
00015 #include "config.h"
00016 #include "lib_mcu/can/can_lib.h"
00017
00018
00019
00020 #define STATUS_MOB_USED 0x01
00021 #define STATUS_MOB_AVAILABLE 0x00
00022
00023
00024
00025
00026
00027
00028
00029
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())
00109 {
00110 cmd->ctrl.ide = 1;
00111 Can_get_ext_id(cmd->id.ext);
00112 }
00113 else
00114 {
00115 cmd->ctrl.ide = 0;
00116 Can_get_std_id(cmd->id.std);
00117 }
00118 Can_MOB_abort();
00119 return CAN_STATUS_COMPLETED;
00120
00121 }else if (status == MOB_TX_COMPLETED)
00122 {
00123 cmd->status = 0;
00124 Can_MOB_abort();
00125 return CAN_STATUS_COMPLETED;
00126 }
00127
00128 return (status);
00129 }
00130