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

📄 icandrv.c51

📁 infineon C515C RTX51 example. it contains example on using this device
💻 C51
📖 第 1 页 / 共 2 页
字号:

      case CAN_STOP_ORDER:
         c_stop ();
         can_stopped = TRUE;
      break;

      case CAN_START_ORDER:
         /* Alle Objekte im Objekt-Buffer als gelesen markieren   */
         /* zum Erreichen eines definierten Anfangszustandes      */
         c_set_all_read ();
         c_start ();
         can_stopped = FALSE;
         if (c_get_status() == bus_off) {
            /* wenn der CAN-Controller bereits nach dem Starten im */
            /* Bus-Off Zustand ist, ist etwas schief gelaufen       */
            c_get_back (C_CAN_FAILURE);
            return;
         }
      break;

      case CAN_SEND_ORDER:
         if (c_get_status() == bus_off) {
            c_get_back (C_BUS_OFF);
            return;
         }
         /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[0];
         po.short_ptr.offs[1] = c_order_buf.param[1];

         /* ident = *po.l_ptr */
         temp_0 = c_get_index_from_ident (*po.l_ptr);
         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         temp_1 = c_get_obj_typ (temp_0);
         if ((temp_1 != D_SEND) && (temp_1 != D_SEND_R_REC)) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         done = c_transmit_obj (temp_0,         /* obj index */
                                po.c_ptr+4    /* pointer to datas */
                               );
         if (done==FALSE) {
            c_get_back (C_SEND_ERROR);
            return;
         }
      break;

      case CAN_REQUEST_ORDER:
         if (c_get_status() == bus_off) {
            c_get_back (C_BUS_OFF);
            return;
         }
         /* identifier */
         qq.tb[0] = c_order_buf.param[0];               /* ident */
         qq.tb[1] = c_order_buf.param[1];
         qq.tb[2] = c_order_buf.param[2];
         qq.tb[3] = c_order_buf.param[3];

         temp_0 = c_get_index_from_ident (qq.tl);

         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         temp_1 = c_get_obj_typ (temp_0);
         if (temp_1 != D_REC_R_SEND) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         done = c_send_remote (temp_0);
         if (done==FALSE) {
            c_get_back (C_SEND_ERROR);
            return;
         }
      break;

      case CAN_BIND_OBJ_ORDER:
         /* identifier */
         qq.tb[0] = c_order_buf.param[0];               /* ident */
         qq.tb[1] = c_order_buf.param[1];
         qq.tb[2] = c_order_buf.param[2];
         qq.tb[3] = c_order_buf.param[3];

         temp_0 = c_get_index_from_ident (qq.tl);
         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         temp_1 = c_get_bind (temp_0);

         done = c_set_bind (temp_0,               /* obj index */
                            c_order_buf.param[4]  /* task ID */
                                    );

         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if ((signal_ok[i].task_id == NO_BIND)
            || (signal_ok[i].task_id == c_order_buf.param[4])) {
               signal_ok[i].task_id = c_order_buf.param[4];
               signal_ok[i].task_waits = FALSE;
               break;
            }
         }

         if (done == FALSE) {
            c_get_back (C_MEM_FULL);
            return;
         }
         if (temp_1 != NO_BIND) {
            /* Objekt war schon an Task gebunden */
            c_get_back (C_OBJ_REBIND);
            return;
         }
      break;

      case CAN_UNBIND_OBJ_ORDER:
         /* identifier */
         qq.tb[0] = c_order_buf.param[0];               /* ident */
         qq.tb[1] = c_order_buf.param[1];
         qq.tb[2] = c_order_buf.param[2];
         qq.tb[3] = c_order_buf.param[3];

         temp_0 = c_get_index_from_ident (qq.tl);

         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         temp_1 = c_get_bind(temp_0);
         c_clear_bind (temp_0);
         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if (signal_ok[i].task_id == temp_1) {
               signal_ok[i].task_id = NO_BIND;
               signal_ok[i].task_waits = FALSE;
               break;
            }
         }
      break;

      case CAN_BIND_L_OBJ_ORDER:
         temp_0 = 15;                    /* last obj index */
         temp_1 = c_get_bind (temp_0);

         done = c_set_bind (temp_0,                    /* obj index */
                            c_order_buf.param[1]       /* task ID */
                           );

         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if ((signal_ok[i].task_id == NO_BIND)
            || (signal_ok[i].task_id == c_order_buf.param[1])) {
               signal_ok[i].task_id = c_order_buf.param[1];
               signal_ok[i].task_waits = FALSE;
               break;
            }
         }

         if (done == FALSE) {
            c_get_back (C_MEM_FULL);
            return;
         }
         if (temp_1 != NO_BIND) {
            /* Objekt war schon an Task gebunden */
            c_get_back (C_OBJ_REBIND);
            return;
         }
      break;

      case CAN_UNBIND_L_OBJ_ORDER:
         temp_0 = 15;                    /* last obj index */
         temp_1 = c_get_bind(temp_0);
         c_clear_bind (temp_0);
         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if (signal_ok[i].task_id == temp_1) {
               signal_ok[i].task_id = NO_BIND;
               signal_ok[i].task_waits = FALSE;
               break;
            }
         }

      break;


      case CAN_WRITE_ORDER:
         /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[0];
         po.short_ptr.offs[1] = c_order_buf.param[1];

         temp_0 = c_get_index_from_ident (*po.l_ptr);
         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }
         temp_1 = c_get_obj_typ (temp_0);
         if ((temp_1 != D_SEND) && (temp_1 != D_SEND_R_REC)) {
            c_get_back (C_OBJ_ERROR);
            return;
         }

         c_write_data (temp_0,         /* obj index */
                       po.c_ptr+4    /* pointer to datas */
                      );
      break;

      /* aufgerufen wenn can_receive */
      case CAN_READ_W_IND_ORDER:
         if (c_get_status() == bus_off) {
            c_get_back (C_BUS_OFF);
         return;
         }

         /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[0];
         po.short_ptr.offs[1] = c_order_buf.param[1];

         /* lese Identifikation f乺 Objekts 1..14 */
         /* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index = 0xF */
         /* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
         *po.l_ptr = c_get_ident (c_order_buf.param[2]);

         /*  param[2] ist obj index */
         /* lese Data oder lese Data und Ident fuer 15. Objekt */
         c_read_data (c_order_buf.param[2],    /* index */
                             po.c_ptr+4        /* pointer to datas */
                            );
      break;

      /* aufgerufen wenn can_wait */
      case CAN_READ_W_TID_ORDER:
         /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[0];
         po.short_ptr.offs[1] = c_order_buf.param[1];

         /*  param[2] ist obj task ID tmp_0 ist Objekt Index */
         temp_0 = c_get_rec_bind (c_order_buf.param[2]);
         if (temp_0 == 0) {
            c_get_back (C_CAN_FAILURE);
            return;
         }

         /* lese Identifikation f乺 Objekts 1..14 */
         /* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index(temp_0 = 0xF */
         /* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
         *po.l_ptr = c_get_ident (temp_0);

         /* lese Data oder lese Data und Ident fuer 15. Objekt */
         c_read_data (temp_0,       /* index */
                      po.c_ptr+4  /* pointer to datas */
                     );

         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if (signal_ok[i].task_id == c_order_buf.param[2]) {
               signal_ok[i].task_waits = FALSE;
               break;
            }
         }
      break;

      case CAN_READ_ORDER:
         qq.tb[0] = c_order_buf.param[0];               /* ident */
         qq.tb[1] = c_order_buf.param[1];
         qq.tb[2] = c_order_buf.param[2];
         qq.tb[3] = c_order_buf.param[3];

         temp_0 = c_get_index_from_ident (qq.tl);

         if (temp_0 == 0) {
            c_get_back (C_OBJ_ERROR);
            return;
         }

         /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[4];
         po.short_ptr.offs[1] = c_order_buf.param[5];

         /* lese Identifikation f乺 Objekts 1..14 */
         /* da wird f乺 15. = Objekt Ident = 0xFFFFFFFF wenn index(temp_0 = 0xF */
         /* diese Ident wird erst beim read_data() (n刢hste Befehl) korrigiert */
         *po.l_ptr = c_get_ident (temp_0);

         /* lese Data oder lese Data und Ident fuer 15. Objekt */
         c_read_data (temp_0,       /* index */
                      po.c_ptr+4  /* pointer to datas */
                     );
      break;

      case CAN_READ_L_OBJ_ORDER:
        /* Pointer auf das Datenfeld initialisieren */
         po.short_ptr.offs[0] = c_order_buf.param[0];
         po.short_ptr.offs[1] = c_order_buf.param[1];

         /* lese Data und Ident fuer 15. Objekt */
         c_read_data (15,           /* index */
                     po.c_ptr+4     /* pointer to datas */
                     );
      break;

      case CAN_GET_STATUS_ORDER:
         if (c_get_status() == error_active) {
            c_get_back (C_ERR_ACTIVE);
         }
         else if (c_get_status() == error_passive) {
            c_get_back (C_ERR_PASSIVE);
         }
         else if (c_get_status() == bus_off) {
            c_get_back (C_BUS_OFF);
         }
         else {
            c_get_back (C_CAN_FAILURE);
         }
         return;
      break;

      case CAN_ACTIVATE_WAIT:
         for (i=0; i<=MAX_BIND_OBJ-1; i++) {
            if (signal_ok[i].task_id == (c_order_buf.task_id)) {
               signal_ok[i].task_waits = TRUE;
               break;
            }
         }
         if (c_get_rec_bind (c_order_buf.task_id) != 0) {
            os_send_signal (c_order_buf.task_id);
         }
         return;
      break;

      default:
         c_get_back (C_CAN_FAILURE);
         return;
      break;
   }
   c_get_back (C_OK);
}




#pragma eject
/*---------------------------------------------------------------------*
 *     C A N - T A S K                                                 *
 *---------------------------------------------------------------------*/

/*---------------------------------------------------------------------*
 *     C A N _ C A N _ T A S K _ M A I N
 *---------------------------------------------------------------------*
 *  Funktion:
 *
 *     Hauptschleife des CAN-Task.
 *
 *---------------------------------------------------------------------*
 *  Parameter:
 *
 *     --
 *
 *---------------------------------------------------------------------*/

void can_can_task_main (void) _task_ CAN_TASK_ID _priority_ 3
{
   byte i;

   /* Grundinitialisierung beim Starten des CAN-Task          */
   /* CAN-Controller auf anhalten, bis zur Initialisierung    */
   /* durch die Applikation d乺fen keine Interrupts auftreten */
   can_stopped = TRUE;
   c_init_obj_buf ();
   for (i=0; i<=MAX_BIND_OBJ-1; i++) {
      signal_ok[i].task_id = NO_BIND;
      signal_ok[i].task_waits = FALSE;
   }

   /* CAN-Interrupt zuordnen */
   os_attach_interrupt (CAN_INT_NBR);

   /* Hauptschleife des Task */
   for (;;) {
      /* Auf Signal von der Applikation oder Interrupt vom  */
      /* CAN-Controller warten                              */
      if (os_wait (K_INT+K_SIG, 0xff, 0) == INT_EVENT) {
         /* CAN-Controller Interrupt abhandeln */

         c_handle_can_int ();

      }
      else {
         /* Signal von der Applikation abhandeln */
         c_handle_appli_signal ();
      }
   }
}


/*---------------------------------------------------------------------*
 *       Ende Modul ICANDRV                                               *
 *---------------------------------------------------------------------*/

⌨️ 快捷键说明

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