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

📄 icanap_2.inc

📁 infineon C515C RTX51 example. it contains example on using this device
💻 INC
📖 第 1 页 / 共 5 页
字号:
;*        C_OBJ_ERROR         Objekt existiert schon
;*        C_TOO_LONG          DATA_LENGTH ist gr攕ser als 8
;*        C_INVALID_TYPE      Falscher Objekttyp
;*        C_MEM_FULL          Objekt-Speicher ist voll, es k攏nen keine
;*                            neuen Objekte definiert werden
;*                            (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;*                            Entweder sind bereits 255 Objekte definiert
;*                            oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/

?XD?_can_def_obj_ext?ICANAPIF        SEGMENT XDATA
                                RSEG ?XD?_can_def_obj_ext?ICANAPIF
?_can_def_obj_ext?BYTE:
ident_x:         DS 4
dat_len:         DS 1
obj_typ:         DS 1


?CAN?_can_def_obj_ext?ICANAPIF     SEGMENT CODE
                              RSEG    ?CAN?_can_def_obj_ext?ICANAPIF

_can_def_obj_ext:
                        MOV     A,R4
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    @DPTR, A

                        MOV     A,R5
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 1
                        MOVX    @DPTR, A

                        MOV     A,R6
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 2
                        MOVX    @DPTR, A

                        MOV     A,R7
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 3
                        MOVX    @DPTR, A

                        MOV     DPTR, #dat_len
                        MOVX    A, @DPTR
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 4
                        MOVX    @DPTR, A

                        MOV     DPTR, #obj_typ
                        MOVX    A, @DPTR
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 5
                        MOVX    @DPTR, A

                        ; Testen ob CAN-Task besetzt
                        CALL    C_ENTER_DRIVER
                        CJNE    A, #TRUE, CDOX_1

                        SETUP_ORDER CAN_DEF_OBJ_ORDER_EXT, 0
                        ; Befehle an CAN-Task aufsetzen

                        ; CAN-Task starten
                        MOV     R7, #C_DRIVER_ID
                        CALL    _os_send_signal
                        MOV     R7, #K_SIG
                        CALL    _os_wait
                        ;Returnwert retten
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    A, @DPTR
                        PUSH    ACC
                        CALL    C_LEAVE_DRIVER
                        POP     ACC
                        MOV     R7, A
                        RET

CDOX_1:                 MOV     R7, #C_CAN_FAILURE
                        RET


$EJECT
;*---------------------------------------------------------------------*
;*     C A N _ D E F _ L A S T _ O B J
;*---------------------------------------------------------------------*
;*  Funktion:
;*     Definieren 15. Kommunikationsobjekts. Diese Funktion
;*     kann nur nach CAN_HW_INIT oder nach CAN_STOP ausgef乭rt werden.
;*     Es k攏nen Objekte definiert werden, bis der Objekt-Speicher voll
;*     ist (beim Full-CAN ist dies das Controller-interne Dual-Port RAM,
;*     beim Basic-CAN wird der Objekt-Speicher im externen RAM alloziert)
;*     oder die maximale Anzahl von 255 definierten Objekten erreicht ist.
;*     Falls ein Objekt definiert wird, dass bereits existiert, wird eine
;*     Fehlermeldung (in CANRETURN) zur乧kgegeben.
;*     Nach der Beendigung der Initialisierung kann der CAN-Treiber mit
;*     CAN_START gestartet werden.
;*
;* BEGIN
;*    R4 := HIGH(IDENTIFIER);
;*    R5 := LOW(IDENTIFIER);
;*    R6 := HIGH(IDENTIFIER);
;*    R7 := LOW(IDENTIFIER);
;*    IF C_ENTER_DRIVER THEN
;*       C_ORDER_BUF.ORDER := CAN_DEF_L_OBJ_ORDER;
;*       C_ORDER_BUF.PARAM[0] := R4;
;*       C_ORDER_BUF.PARAM[1] := R5;
;*       C_ORDER_BUF.PARAM[2] := R6;
;*       C_ORDER_BUF.PARAM[3] := R7;
;*       C_ORDER_BUF.PARAM[4] := dat_len;
;*       C_ORDER_BUF.TASK_ID := os_running_task_id ();
;*       os_send_signal an CAN-Task;
;*       os_wait (K_SIG,0,0);
;*       PUSH(C_ORDER_BUF.PARAM[0]);  (* Returnwert auf Stack pushen *)
;*       C_LEAVE_DRIVER;
;*       POP(ACC);                    (* Returnwert in Akku *)
;*       RETURN;
;*    ELSE
;*       RETURN C_CAN_FAILURE;
;*    END IF;
;* END CAN_HW_INIT;
;*
;*---------------------------------------------------------------------*
;*  Parameter :
;*
;*    R4/R7   : IDENTIFIER    Identifikation des Kommunikationsobjektes
;*                            entsprechend der CAN-Definition (0 .. 7EFH)
;*    dat_len : DATA_LENGTH   Anzahl Datenbyte im Objekt (0..8)
;*
;*
;*  Returnwert in R7 :
;*
;*        C_OK                Objekt definiert
;*        C_NOT_STOPPED       CAN_STOP oder CAN_HW_INIT muss vor der
;*                            Ausf乭rung dieser Funktion aufgerufen werden
;*        C_OBJ_ERROR         Objekt existiert schon
;*        C_TOO_LONG          DATA_LENGTH ist gr攕ser als 8
;*        C_INVALID_TYPE      Falscher Objekttyp
;*        C_MEM_FULL          Objekt-Speicher ist voll, es k攏nen keine
;*                            neuen Objekte definiert werden
;*                            (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;*                            Entweder sind bereits 255 Objekte definiert
;*                            oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/

?XD?_can_def_last_obj?ICANAPIF  SEGMENT XDATA
                                RSEG ?XD?_can_def_last_obj?ICANAPIF
?_can_def_last_obj?BYTE:
l_ident:           DS 4
l_dat_len:         DS 1


?CAN?_can_def_last_obj?ICANAPIF    SEGMENT CODE
                                RSEG    ?CAN?_can_def_last_obj?ICANAPIF

_can_def_last_obj:
                        MOV     A,R4
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    @DPTR, A

                        MOV     A,R5
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 1
                        MOVX    @DPTR, A

                        MOV     A,R6
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 2
                        MOVX    @DPTR, A

                        MOV     A,R7
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 3
                        MOVX    @DPTR, A

                        MOV     DPTR, #l_dat_len
                        MOVX    A, @DPTR
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 4
                        MOVX    @DPTR, A

                        ; Testen ob CAN-Task besetzt
                        CALL    C_ENTER_DRIVER
                        CJNE    A, #TRUE, L_CDOX_1

                        SETUP_ORDER CAN_DEF_L_OBJ_ORDER, 0
                        ; Befehle an CAN-Task aufsetzen

                        ; CAN-Task starten
                        MOV     R7, #C_DRIVER_ID
                        CALL    _os_send_signal
                        MOV     R7, #K_SIG
                        CALL    _os_wait
                        ;Returnwert retten
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    A, @DPTR
                        PUSH    ACC
                        CALL    C_LEAVE_DRIVER
                        POP     ACC
                        MOV     R7, A
                        RET

L_CDOX_1:               MOV     R7, #C_CAN_FAILURE
                        RET



$EJECT
;*---------------------------------------------------------------------*
;*     C A N _ D E F _ L _ O B J _ E X T
;*---------------------------------------------------------------------*
;*  Funktion:
;*     Definieren 15. Kommunikationsobjekts. Diese Funktion
;*     kann nur nach CAN_HW_INIT oder nach CAN_STOP ausgef乭rt werden.
;*     Es k攏nen Objekte definiert werden, bis der Objekt-Speicher voll
;*     ist (beim Full-CAN ist dies das Controller-interne Dual-Port RAM,
;*     beim Basic-CAN wird der Objekt-Speicher im externen RAM alloziert)
;*     oder die maximale Anzahl von 255 definierten Objekten erreicht ist.
;*     Falls ein Objekt definiert wird, dass bereits existiert, wird eine
;*     Fehlermeldung (in CANRETURN) zur乧kgegeben.
;*     Nach der Beendigung der Initialisierung kann der CAN-Treiber mit
;*     CAN_START gestartet werden.
;*
;* BEGIN
;*    R4 := HIGH(IDENTIFIER);
;*    R5 := LOW(IDENTIFIER);
;*    R6 := HIGH(IDENTIFIER);
;*    R7 := LOW(IDENTIFIER);
;*    IF C_ENTER_DRIVER THEN
;*       C_ORDER_BUF.ORDER := CAN_DEF_L_OBJ_ORDER_EXT;
;*       C_ORDER_BUF.PARAM[0] := R4;
;*       C_ORDER_BUF.PARAM[1] := R5;
;*       C_ORDER_BUF.PARAM[2] := R6;
;*       C_ORDER_BUF.PARAM[3] := R7;
;*       C_ORDER_BUF.PARAM[4] := dat_len;
;*       C_ORDER_BUF.TASK_ID := os_running_task_id ();
;*       os_send_signal an CAN-Task;
;*       os_wait (K_SIG,0,0);
;*       PUSH(C_ORDER_BUF.PARAM[0]);  (* Returnwert auf Stack pushen *)
;*       C_LEAVE_DRIVER;
;*       POP(ACC);                    (* Returnwert in Akku *)
;*       RETURN;
;*    ELSE
;*       RETURN C_CAN_FAILURE;
;*    END IF;
;* END CAN_HW_INIT;
;*
;*---------------------------------------------------------------------*
;*  Parameter :
;*
;*    R4/R7   : IDENTIFIER    Identifikation des Kommunikationsobjektes
;*                            entsprechend der CAN-Definition (0 .. 7EFH)
;*    dat_len : DATA_LENGTH   Anzahl Datenbyte im Objekt (0..8)
;*
;*
;*  Returnwert in R7 :
;*
;*        C_OK                Objekt definiert
;*        C_NOT_STOPPED       CAN_STOP oder CAN_HW_INIT muss vor der
;*                            Ausf乭rung dieser Funktion aufgerufen werden
;*        C_OBJ_ERROR         Objekt existiert schon
;*        C_TOO_LONG          DATA_LENGTH ist gr攕ser als 8
;*        C_INVALID_TYPE      Falscher Objekttyp
;*        C_MEM_FULL          Objekt-Speicher ist voll, es k攏nen keine
;*                            neuen Objekte definiert werden
;*                            (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;*                            Entweder sind bereits 255 Objekte definiert
;*                            oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/

?XD?_can_def_last_obj_ext?ICANAPIF  SEGMENT XDATA
                                 RSEG ?XD?_can_def_last_obj_ext?ICANAPIF
?_can_def_last_obj_ext?BYTE:
lx_ident:           DS 4
lx_dat_len:         DS 1


?CAN?_can_def_last_obj_ext?ICANAPIF SEGMENT CODE
                                 RSEG    ?CAN?_can_def_last_obj_ext?ICANAPIF

_can_def_last_obj_ext:
                        MOV     A,R4
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    @DPTR, A

                        MOV     A,R5
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 1
                        MOVX    @DPTR, A

                        MOV     A,R6
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 2
                        MOVX    @DPTR, A

                        MOV     A,R7
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 3
                        MOVX    @DPTR, A

                        MOV     DPTR, #lx_dat_len
                        MOVX    A, @DPTR
                        MOV     DPTR, #C_ORDER_BUF_PARAM + 4
                        MOVX    @DPTR, A

                        ; Testen ob CAN-Task besetzt
                        CALL    C_ENTER_DRIVER
                        CJNE    A, #TRUE, LX_CDOX_1

                        SETUP_ORDER CAN_DEF_L_OBJ_ORDER_EXT, 0
                        ; Befehle an CAN-Task aufsetzen

                        ; CAN-Task starten
                        MOV     R7, #C_DRIVER_ID
                        CALL    _os_send_signal
                        MOV     R7, #K_SIG
                        CALL    _os_wait
                        ;Returnwert retten
                        MOV     DPTR, #C_ORDER_BUF_PARAM
                        MOVX    A, @DPTR
                        PUSH    ACC
                        CALL    C_LEAVE_DRIVER
                        POP     ACC
                        MOV     R7, A
                        RET

LX_CDOX_1:              MOV     R7, #C_CAN_FAILURE
                        RET



$EJECT
;*---------------------------------------------------------------------*
;*     C A N _ G E T _ S T A T U S
;*---------------------------------------------------------------------*
;*  Funktion:
;*     Lesen des aktuellen CAN-Controller Status.
;*
;* BEGIN
;*    IF C_ENTER_DRIVER THEN
;*       C_ORDER_BUF.ORDER := CAN_GET_STATUS_ORDER;
;*       C_ORDER_BUF.TASK_ID := os_running_task_id ();
;*       os_send_signal an CAN-Task;
;*       os_wait (K_SIG,FFH,0);
;*       C_LEAVE_DRIVER;
;*       RETURN;
;*    ELSE
;*       RETURN C_CAN_FAILURE;
;*    END IF;
;* END CAN_STOP;
;*
;*---------------------------------------------------------------------*
;*  Parameter :
;*
;*     --
;*
;*  Returnwert in R7 :
;*

⌨️ 快捷键说明

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