📄 spiasm.s
字号:
#include <avr/io.h>
//#include <avr/signal.h>
//#include "Atmel_88_8.h"
// Use R4 <- SREG, R5 <-R30, R6<-R31 , R7<-R24 , R8<-R25 Register
.section .text
.global SIG_SPI ;外部函数声明
.macro mcSIG_PoP
out _SFR_IO_ADDR(SREG), r4 ; 63
mov R25,R8 ;pop r25
mov R24,R7 ; pop r24
.endm
// Interrupt Routine Slave Mode (interrupt controlled)
SIG_SPI:// ;------------------------------------------------------------
mov R7,R24 ;push r24
mov R8,R25 ;push r25 // mData
in r4, _SFR_IO_ADDR(SREG)
// PB5-SCk PB4-MISO PB3-MOSI PB2-SS
//unsigned char mData;
//if ( bit_is_set(TIMSK1,ICIE1)) sei();
lds r25, TIMSK1
sbrs r25, ICIE1
rjmp intSPI_CheckTaskStart
sei
intSPI_CheckTaskStart: ;----------------
// mData= SPDR;
in r25,_SFR_IO_ADDR(SPDR);
// if (mSPITask==0) // Read Command
lds r24, mSPITask
and r24, r24
breq intSPI_T0
sbrc r24, 0
rjmp intSPI_T1 // (mSPITask==1)Transmit Data
sbrc r24,1
rjmp intSPI_T2 // mSPITask==2 RxData
intSPI_TNothing:
// { SPDR =0xf0; }
ldi r24, 0xff ; 255
out _SFR_IO_ADDR(SPDR), r24 ; 46
intSPI_End:
mcSIG_PoP
reti
intSPI_T0: ;----------------------------------
sbrc r25, 7
rjmp intSPI_T0ReqSendData // if bit_is_set(mData,7) // if Main Req Read Data
sbrc r25, 6 // if bit_is_set(mData,6) // if Main Req Send Data
rjmp intSPI_T0ReqReadData
intSPI_T0CmReset: ;---------------------
// mData &= 0b111111;
andi r25, 0x3F ; 63
// if (mData == 1 ) { while(1);} // Reset
cpi r25, 0x01 ; 1
brne intSPI_End ; 0x7fe
intSPI_T0CmResetHalt:
rjmp intSPI_T0CmResetHalt ; 0x79e
intSPI_T0ReqSendData: ;---------------------------------
// { SPDR = mSPIOut[0];
lds r24, mSPIOut
out _SFR_IO_ADDR(SPDR), r24 ; ************************** SPI Out
// if (mSPIOut[0]==0) { mSPITask=0xf0; return }
and r24, r24
brne intSPI_SetSPITx ; 0x764
ldi r24, 0xf0 ; 255
sts mSPITask, r24
mcSIG_PoP
reti
intSPI_SetSPITx:
// else { mSPITask=1; mSPINxOut=mSPIOut[1];mSPICount=2;}
ldi r25, 0x01 ; 1
sts mSPITask, r25
ldi r25, 0x02 ;
sts mSPICount, r25
lds r24, mSPIOut+1
sts mSPINxOut, r24
mcSIG_PoP
reti
intSPI_T0ReqReadData: ;---------------------------
// mData &= 0b111111;
andi r25, 0x3F ; 63
// if (( mData > 40 )||( mData ==0 )) { mSPITask=0xf0; return;} // Len too long
mov r24, r25
subi r24, 0x01 ; 1
cpi r24, 0x28 ; 40
brcc intSPI_SetTaskNothing ; 0x7ea
// mSPIIn.Tx[0]= mData;mSPICount=1;mSPITask =2;
sts mSPIIn, r25
ldi r24, 0x01 ; 1
sts mSPICount, r24
ldi r24, 0x02 ; 2
sts mSPITask, r24
mcSIG_PoP
reti
intSPI_T1: ;----------------------------------------------
// SPDR = mSPINxOut;
lds r24, mSPINxOut
out _SFR_IO_ADDR(SPDR), r24 ; ************************** SPI Out
// if ( mSPIOut[0] >= mSPICount)
lds r25, mSPICount
lds r24, mSPIOut
cp r24, r25
brcs intSPI_SetBuzzyTx
// mSPINxOut= mSPIOut[mSPICount];
mov r5,r30 //push r30
mov r6,r31 //push r31
mov r30, r25
eor r31, r31
subi r30, lo8(-(mSPIOut))
sbci r31, hi8(-(mSPIOut))
ld r24, Z
sts mSPINxOut, r24
mov r31,r6 ;pop r31
mov r30,r5 ;pop r30
// mSPICount++;
subi r25, 0xFF ; 255
sts mSPICount, r25
mcSIG_PoP
reti
intSPI_SetBuzzyTx:
// mSPIBusy=0x3; mSPIOut[0]=0;
ldi r24, 0x3 ; Set Bussy
sts mSPIBusy,r24
eor r24,r24
ldi r24, 0 ; Set Bussy
sts mSPIOut,r24
intSPI_SetTaskNothing:
// mSPITask=0xf0; return;
ldi r24, 0xf0 ; 255
sts mSPITask, r24
mcSIG_PoP
reti
intSPI_T2: ;------------------------------------
// mSPIIn.Tx[mSPICount]= mData;
mov r5,r30 //push r30
mov r6,r31 //push r31
lds r24, mSPICount
mov r30, r24
eor r31, r31
subi r30, lo8(-(mSPIIn)) ; 183
sbci r31, hi8(-(mSPIIn)) ; 253
st Z, r25
mov r31,r6 ;pop r31
mov r30,r5 ;pop r30
// if (mSPICount>= mSPIIn[0])
lds r25, mSPIIn
cp r24, r25
brcc intSPI_SetBuzzyRx
//fnSetRxBuff
intSPI_T2AddCount:
// mSPICount++; return;
subi r24, 0xFF ; 255
sts mSPICount, r24
mcSIG_PoP
reti
intSPI_SetBuzzyRx:
; mSPIBusy=5 ;mSPITask=0xf0
ldi r24, 0x5 ; Set Bussy
sts mSPIBusy,r24
ldi r24, 0xf0 ; 255
sts mSPITask, r24
mcSIG_PoP
reti
////////////////////////////////////////////////////////////////////////////////////////////
// Interrupt 1
.section .text
.global SIG_INTERRUPT1 ;外部函数声明
SIG_INTERRUPT1: // M-Net Data Input Interrupt, Use to Cal the Wave Len with Timer 2
mov R8,R25 ;push r25 // mData
in r4, _SFR_IO_ADDR(SREG)
//if ( bit_is_set(TIMSK1,ICIE1)) sei();
lds r25, TIMSK1
sbrs r25, ICIE1
rjmp Int1_Start
sei
Int1_Start:
// if (bit_is_clear(PIND,3) ) SetBit(DDRB,4) else ClrBit(DDRB,4);
cbi _SFR_IO_ADDR(DDRB),4
sbis _SFR_IO_ADDR(PIND),3
sbi _SFR_IO_ADDR(DDRB),4
// if (mSPIBusy)
lds r25, mSPIBusy
and r25, r25
breq Int1_Normal
// { SPDR=0x80; mSPITask=0xf0; }
Int1_Bussy:
ldi r25, 0x80 ; 128
out _SFR_IO_ADDR(SPDR), r25 ; 46
ldi r25, 0xF0 ; 240
sts mSPITask, r25
out _SFR_IO_ADDR(SREG), r4 ; 63
mov R25,R8 ;pop r25
reti
Int1_Normal:
// else { SPDR = MNetStatus; mSPITask=0; }
lds r25, MNetStatus
out _SFR_IO_ADDR(SPDR), r25 ; 46
ldi r25, 0 ; 128
sts mSPITask, r25
out _SFR_IO_ADDR(SREG), r4 ; 63
mov R25,R8 ;pop r25
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -