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

📄 aiccoma.asm

📁 "DIGITAL SIGNAL PROCESSING WITH C AND THE TMS32 0C30"一书的附带程序
💻 ASM
字号:
*AICCOMA.ASM-AIC COMMUNICATION ROUTINES IN TMS320C30-POLLING OR INTERRUPT  
        .title  "AICCOMA"       ;TMS320C30/AIC COM WITH POLLING OR INTERRUPT
        .global AICSEC,AICSET,AICSET_I,AICIO_I,AICIO_P,TWAIT,SPSET,IOPRI,IOAUX 
        .data                   ;ASSEMBLE INTO DATA SECTION
PBASE   .word   808000h         ;PERIPHERAL BASE ADDRESS
SETSP   .word   0E970300h       ;SERIAL PORT SET-UP DATA
ATABLE  .word   AICSEC          ;SP0 AIC INIT TABLE ADDR
SPSET   .word   0h              ;SERIAL PORT 0 OFFSET
        .text                   ;ASSEMBLE INTO TEXT
AICSET  PUSH    AR0             ;SAVE AR0
        PUSH    AR1             ;SAVE AR1
        PUSH    AR7             ;SAVE AR7
        PUSH    R0              ;SAVE R0
        PUSH    R1              ;SAVE R1
        LDI     @SPSET,AR7      ;SERIAL PORT OFFSET
        LDI     @PBASE,AR0      ;AR0 -> 808000h
        ADDI    AR7,AR0         ;SERIAL PORT OFFSET + PBASE
        LDI     1h,R0           ;TIMER CLK  = H1/2 *(AIC MASTER CLK)
        STI     R0,*+AR0(28h)   ;INIT TIMER PERIOD REG(TCLK0=7.5 MHZ)
        LDI     02C1h,R0        ;INIT TIMER GLOBAL REG
        STI     R0,*+AR0(20h)   ;RESET TIMER 
        CMPI    0,AR7           ;DETERMINE REQUESTED SERIAL PORT
        BNZ     SP1A            ;BRANCH TO CONFIGURE SERIAL PORT 1
        LDI     62h,IOF         ;PRI AIC RESET = 0
        B       SP0A            ;BRANCH TO CONFIGURE SERIAL PORT 0
SP1A    LDI     26h,IOF         ;AUX AIC RESET = 0
SP0A    LDI     @ATABLE,AR1     ;AR1 -> AIC INIT DATA
        RPTS    99              ;REPEAT NEXT INSTRUCTION 100 TIMES
        NOP                     ;KEEP IOF LOW FOR A WHILE
        LDI     111h,R0         ;X & R PORT CONTROL REGS DATA
        STI     R0,*+AR0(42h)   ;FSX/DX/CLKX = SP OPERATIONAL PINS
        STI     R0,*+AR0(43h)   ;FSR/DR/CLKR = SP OPERATIONAL PINS
        LDI     @SETSP,R0       ;RESET -> SP: 16 BITS, EXT CLKS, STD MODE
        STI     R0,*+AR0(40h)   ;FSX = OUTPUT, & INT ENABL (SP GLOBAL REG)
        LDI     0,R0            ;CLEAR R0
        STI     R0,*+AR0(48h)   ;CLEAR SERIAL PORT XMIT REGISTER
        CMPI    0,AR7           ;DETERMINE REQUESTED SERIAL PORT 
        BNZ     SP1B            ;BRANCH TO CONFIGURE SERIAL PORT 1
        OR      06h,IOF         ;BRING PRI AIC OUT OF RESET
        B       SP0B            ;BRANCH TO CONFIGURE SERIAL PORT 0
SP1B    OR      60h,IOF         ;BRING AUX AIC OUT OF RESET
SP0B    LDI     03h,RC          ;RC = 3 TO TRANSMIT 4 VALUES
        RPTB    SECEND          ;REPEAT 4 DATA TRANSMITS OF SECONDARY COMM
        CALL    TWAIT           ;WAIT FOR DATA TRANSMIT
        LDI     03h,R0          ;VALUE FOR SEC XMIT REQUEST FOR AIC
        STI     R0,*+AR0(48h)   ;SECONDARY XMIT REQUEST FOR AIC
        CALL    TWAIT
        LDI     *AR1++(1),R0    ;AR1 -> NEXT AIC INIT DATA
SECEND  STI     R0,*+AR0(48h)   ;DTR =  CURRENT AIC DATA
        POP     R1              ;RESTORE R1
        POP     R0              ;RESTORE R0
        POP     AR7             ;RESTORE AR7
        POP     AR1             ;RESTORE AR1
        POP     AR0             ;RESTORE AR0
        RETS                    ;RETURN FROM SUBROUTINE
AICSET_I                        ;-----CONFIG FOR INTERRUPT-----
        PUSH    AR7             ;SAVE AR7
        CALL    AICSET          ;CALL AICSET ROUTINE
        LDI     @SPSET,AR7      ;SERIAL PORT OFFSET
        LDI     0h,IF           ;CLEAR IF REGISTER
        CMPI    0,AR7           ;DETERMINE REQUESTED SERIAL PORT
        BNZ     SP1C            ;BRANCH TO CONFIGURE SERIAL PORT 1
        OR      10h,IE          ;ENABLE EXINT0 CPU INTERRUPT
        B       SP0C            ;BRANCH TO LABEL A2
SP1C    OR      40h,IE          ;ENABLE EXINT1 CPU INTERRUPT
SP0C    OR      2000h,ST        ;GLOBAL INTERRUPT ENABLE
        POP     AR7             ;RESTORE AR7
        RETS                    ;RETURN FROM SUBROUTINE      
;--------------------TRANSMIT WAIT ROUTINE-------------------------
TWAIT   PUSH    AR0             ;SAVE AR0
        PUSH    AR7             ;SAVE AR7
        PUSH    R0              ;SAVE R0
        LDI     @PBASE,AR0      ;AR0 -> 0808000h
        LDI     @SPSET,AR7      ;SERIAL PORT OFFSET
        ADDI    AR7,AR0         ;SERIAL PORT OFFSET + PBASE
TW1     LDI     *+AR0(40h),R0   ;R0 = CONTENT OF SP GLOBAL CONTROL REG
        AND     02h,R0          ;SEE IF TRANSMIT BUFFER IS READY
        BZ      TW1             ;IF NOT READY, TRY AGAIN
        POP     R0              ;RESTORE R0
        POP     AR7             ;RESTORE AR7
        POP     AR0             ;RESTORE AR0
        RETS                    ;RETURN FROM SUBROUTINE
;--------------------AIC TRANSFER ROUTINE--------------------------
AICIO_I LSH     2,R7            ;TWO LSB MUST = 0 FOR PRIMARY AIC COM
IO      PUSH    AR0             ;SAVE AR0 
        PUSH    AR7             ;SAVE AR7
        LDI     @SPSET,AR7      ;SERIAL PORT OFFSET
        LDI     @PBASE,AR0      ;AR0 -> 0808000h
        ADDI    AR7,AR0         ;SERIAL PORT OFFSET + PBASE
        STI     R7,*+AR0(48h)   ;DTR = NEXT DATA FOR AIC D/A
        LDI     *+AR0(4Ch),R6   ;R6 = DRR DATA FROM AIC A/D
        LSH     16,R6           ;LEFT SHIFT FOR SIGN EXTENSION
        ASH     -18,R6          ;RIGHT SHIFT KEEPING SIGN
        POP     AR7             ;RESTORE AR7 
        POP     AR0             ;RESTORE AR0
        RETS
;--------------------AIC POLLING ROUTINE---------------------------
AICIO_P CALL    TWAIT           ;WAIT FOR DATA TO BE TRANSFERED
        CALL    AICIO_I         ;CALL AIC TRANSFER ROUTINE
        RETS                    ;RETURN FROM SUBROUTINE     
SW_IO   LSH     2,R7            ;PREPARE FOR SECONDARY AIC COM
        OR      03h,R7          ;SET TWO LSB FOR SECONDARY COM
        CALL    TWAIT           ;WAIT FOR DATA TO BE TRANSFERED
        CALL    IO              ;CALL AIC TRANSFER ROUTINE
        LDI     R1,R7           ;LOAD SECONDARY COM DATA INTO R7
        CALL    TWAIT           ;WAIT FOR DATA TO BE TRANSFERED
        CALL    IO              ;CALL AIC TRANSFER ROUTINE
        RETS
;SUBROUTINES FOR PRIMARY OR AUXILIARY INPUT
IOPRI   PUSH    R1              ;SAVE R1
        LDI     067h,R1         ;LOAD SECONDARY COM DATA INTO R1
        CALL    SW_IO           ;CALL IO ROUTINE TO SWITCH INPUTS
        POP     R1              ;RESTORE R1
        RETS
IOAUX   PUSH    R1              ;SAVE R1
        LDI     077h,R1         ;LOAD SECONDARY COM DATA INTO R1
        CALL    SW_IO           ;CALL IO ROUTINE TO SWITCH INPUTS
        POP     R1              ;RESTORE R1
        RETS
            







⌨️ 快捷键说明

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