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

📄 dss_aisr.s62

📁 使用在dsp TI DSK6711中 很多controller 的例子
💻 S62
字号:
;

;  Copyright 2003 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.

;

;  @(#) XDAS 2.51.00 11-29-2003 (xdas-2.50.00.9)

;

;

;  ======== 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 + -