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

📄 dss_aisr.s62

📁 DSP 基于 TMS320C6711 DSK 的功能演示程序
💻 S62
字号:
;;  Copyright 2001 by Texas Instruments Incorporated.;  All rights reserved. Property of Texas Instruments Incorporated.;  Restricted rights to use, duplicate or disclose this code are;  granted through contract.;  U.S. Patent Nos. 5,283,900  5,392,448;; "@(#) XDAS 2.12 05-21-01 (__imports)";
;  ======== dss_aisr.s62 ========
;
;  Can be used as an alternative to DMA/EDMA transfers from the serial ports.
;
;
        .include c62.h62
        .include hwi.h62        
        .include pip.h62

        .include dss.h62


DRR             .set    0x018c0000      ; Data Receive Register McBSP 0
DXR             .set    0x018c0004      ; Data Transmit Register McBSP 0


        .bss rtxDone,4,4                ; Allocate temp variable in .bss to 
                                        ; allow loads via b14.  No cinit record
                                        ; needed because ISR writes to this 
                                        ; location before it reads it.
        .text

        .global _DSS_isr, rtxDone, rxErr, txErr

;
; ====== _DSS_aisr ======
;
_DSS_isr:

        stw a0,*b15--[2]                ; push temp registers
        stw a1,*b15--[2]
        stw a2,*b15--[2]
        stw b1,*b15--[2]
        stw b2,*b15--[2]

        ;  rxDone = 0, txDone = 0
        zero a2                         

        ;    if (DSS_rxCnt) {
        ldw *+b14(_DSS_rxCnt),b1        
        nop 4

 [!b1]  b rxErr                         ; process rx error

        ;       *DSS_rxPtr++ = *DRR;
 [b1]   mvkl DRR,a1                     ; load address of serial port DRR
 [b1]   mvkh DRR,a1
 [b1]   ldw *a1,a1                      ; read word from DRR
 ||[b1] ldw *+b14(_DSS_rxPtr),b1        ; load DSS_rxPtr
 [b1]   ldw *+b14(_DSS_rxCnt),b2        ; load DSS_rxCnt
        nop 3
        stw a1,*b1++                    ; store DRR at *DSS_rxPtr, auto
                                        ; increment DSS_rxPtr
        stw b1,*+b14(_DSS_rxPtr)        ; store updated DSS_rxPtr

        ;       DSS_rxCnt--;
        sub b2,1,b2                     ; decrement DSS_rxCnt
        stw b2,*+b14(_DSS_rxCnt)        ; store updated DSS_rxCnt

        ;       if (DSS_rxCnt == 0) {
        ;           rxDone = 1;
        ;       }
        ;    }
  [!b2] mvk 1,a2

checkTx:

        ;    if (DSS_txCnt) {
        ldw *+b14(_DSS_txCnt),b1        
        nop 4

 [!b1]  b txErr                         ; process tx error

        ;       *DXR = *DSS_txPtr++;
 [b1]   ldw *+b14(_DSS_txPtr),b1        ; load DSS_txPtr
 [b1]   ldw *+b14(_DSS_txCnt),b2        ; load DSS_txCnt
        nop 3

        ldw *b1++,a0                    ; load word pointed to by DSS_txPtr
                                        ; autoincrement DSS_txPtr
        stw b1,*+b14(_DSS_txPtr)        ; store updated DSS_txPtr

        mvkl DXR,a1                     ; load address of serial port DXR
        mvkh DXR,a1


        ;       DSS_txCnt--;
        sub b2,1,b2                     ; decrement DSS_txCnt

        nop                             ; wait for 'ldw' (above) to complete
        and 0xfffffffe,a0,a0            ; clear lsb to avoid AIC reprogram

        stw a0,*a1                      ; write word to DXR

        stw b2,*+b14(_DSS_txCnt)        ; store updated DSS_txCnt

        ;       if (DSS_txCnt == 0) {
        ;           txDone = 1;
        ;       }
        ;    }
  [!b2] or 2,a2,a2


checkDn:

        ;    if ((rxDone | txDone) == 0) {
 [a2]   b Done                          ; if rxDone or txDone do Done processing
        stw a2,*+b14(rtxDone)           ; store done flags into memory

        ;       return;         /* return from interrupt */
        ;    }
        
 [!a2]  ldw *++b15[2],b2                ; restore temp registers
 [!a2]  ldw *++b15[2],b1
 [!a2]  ldw *++b15[2],a2
 [!a2]  ldw *++b15[2],a1
        b irp                           ; return from interrupt
        ldw *++b15[2],a0
        nop 4


Done:
        ldw *++b15[2],b2                ; restore temp registers
        ldw *++b15[2],b1
        ldw *++b15[2],a2
        ldw *++b15[2],a1
        ldw *++b15[2],a0
        nop 4

        HWI_enter C62_ABTEMPS, 0, 0xffff, 0

        ;    if (rxDone) {
        ldw *+b14(rtxDone),b0           ; load done flags from memory
        nop 4

        and b0,1,b0                     ; check if rxDone set
 [!b0]  b txDone
        nop 3

        ;       PIP_put(&DSS_rxPipe);
 [b0]   mvkl _DSS_rxPipe,a4             ; load pipe address
 [b0]   mvkh _DSS_rxPipe,a4
        PIP_put

        ;       DSS_rxPrime();
        ;   }
        b _DSS_rxPrime
        mvkl txDone,b3                  ; set return pointer to come back here
        mvkh txDone,b3
        nop 3

txDone:

        ;    if (txDone) {
        ldw *+b14(rtxDone),b0           ; load done flags from memory
        nop 4

        and b0,2,b0                     ; check if txDone set
 [!b0]  b allDone
        nop 3

        ;       PIP_free(&DSS_txPipe);
 [b0]   mvkl _DSS_txPipe,a4             ; load pipe address
 [b0]   mvkh _DSS_txPipe,a4
        PIP_free

        ;       DSS_txPrime();
        ;    }
        b _DSS_txPrime
        mvkl allDone,b3                 ; set return pointer to come back here
        mvkh allDone,b3
        nop 3

allDone:
        HWI_exit C62_ABTEMPS, 0, 0xffff, 0


        
rxErr:                                  
        ;       dummy = *DRR;
        mvkl DRR,a1                     ; load address of serial port DRR
        mvkh DRR,a1
        ldw *a1,a1                      ; read word from DRR
  ||    ldw *+b14(_DSS_error),b1        ; load DSS_error value 

        b checkTx                       ; start return to primary ISR code
        nop 3

        ;       DSS_error |= 1;
        or b1,1,b1                      ; DSS_error has now arrived
        stw b1,*+b14(_DSS_error)        ; save new value of DSS_error



txErr:
        ;       *DXR = 0;
        mvkl DXR,a1                     ; load address of serial port DXR
        mvkh DXR,a1
 ||     zero b1
        stw b1,*a1                      ; write to DXR
        ldw *+b14(_DSS_error),b1        ; load DSS_error value 

        b checkDn                       ; start return to primary ISR code
        nop 3

        ;       DSS_error |= 2;
        or b1,2,b1                      ; DSS_error has now arrived
        stw b1,*+b14(_DSS_error)        ; save new value of DSS_error

        .end

⌨️ 快捷键说明

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