📄 spi.s
字号:
.module spi.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\icc\stk500\avrasp\spi.c
.dbfunc e spi_enable _spi_enable fV
; i -> R20
.even
_spi_enable::
rcall push_gset1
.dbline -1
.dbline 11
; /** \file
; <b>SPI</b><br>
; Autor: Matthias Wei遝r<br>
; Copyright 2005: Matthias Wei遝r<br>
; License: QPL (see license.txt)
; <hr>
; */
; #include "stk500.h"
;
; void spi_enable(void)
; {
.dbline 14
; unsigned char i;
;
; R_RES_ON;
ldi R24,-5
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 15
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 16
; PORTB &= BIT3_NEG & BIT5_NEG; //MOSI und SCK low
ldi R24,-33
ldi R25,-1
ldi R30,-9
ldi R31,-1
and R30,R24
in R2,0x5
and R2,R30
out 0x5,R2
.dbline 17
; DDRB |= BIT3_POS | BIT5_POS; //MOSI und SCK als Ausgang
in R24,0x4
ori R24,40
out 0x4,R24
.dbline 18
; SPCR = 0x51; //SPI Master /16
ldi R24,81
out 0x2c,R24
.dbline 19
; R_RES_OFF;
sbi 0x5,2
.dbline 20
clr R20
rjmp L6
L3:
.dbline 20
nop
L4:
.dbline 20
inc R20
L6:
.dbline 20
; for(i=0;i<200;i++) asm("nop");
cpi R20,200
brlo L3
.dbline 21
; R_RES_ON;
ldi R24,-5
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 22
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 25
;
; //spi_set_speed(eeprom_read_byte(&eeprom_sck_period));
; spi_set_speed(eeprom_sck_period);
lds R16,_eeprom_sck_period
rcall _spi_set_speed
.dbline -2
L2:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e spi_disable _spi_disable fV
.even
_spi_disable::
.dbline -1
.dbline 29
; }
;
; void spi_disable(void)
; {
.dbline 30
; SPCR=0x00; //SPI aus
clr R2
out 0x2c,R2
.dbline 31
; DDRB &= BIT3_NEG & BIT5_NEG; //MOSI und SCK als Eingang (hochohmig)
ldi R24,-33
ldi R25,-1
ldi R30,-9
ldi R31,-1
and R30,R24
in R2,0x4
and R2,R30
out 0x4,R2
.dbline 32
; R_RES_OFF;
sbi 0x5,2
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_reset _spi_reset fV
.even
_spi_reset::
.dbline -1
.dbline 36
; }
;
; void spi_reset(void)
; {
.dbline 37
; R_RES_OFF;
sbi 0x5,2
.dbline 38
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 39
; R_RES_ON;
ldi R24,-5
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_set_speed _spi_set_speed fV
; s -> R16
.even
_spi_set_speed::
rcall push_gset1
.dbline -1
.dbline 56
; }
;
; /**
; Stellt die Geschwindigkeit des SPI-Busses ein (bei f=8MHz)
; 0: /2 4MHz --SPI2X
; 1 /4 2MHz
; 2: /8 1MHz --SPI2X
; 3 /16 500kHz
; 4: /32 250kHz --SPI2X
; 5 /64 125kHz
; 6: /128 62,5kHz
;
; weitere Geschwindigkeiten geplant
; -> dann per Software-SPI
; */
; void spi_set_speed(unsigned char s)
; {
.dbline 57
tst R16
breq L13
cpi R16,2
breq L13
cpi R16,4
brne L10
L13:
.dbline 57
in R24,0x2d
ori R24,1
out 0x2d,R24
rjmp L11
L10:
.dbline 57
; if((s==0)||(s==2)||(s==4)) SPSR|=1; else SPSR&=0xFE;
in R24,0x2d
andi R24,254
out 0x2d,R24
L11:
.dbline 59
;
; switch(s)
mov R20,R16
clr R21
cpi R20,0
cpc R20,R21
breq L17
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L17
cpi R20,2
ldi R30,0
cpc R21,R30
breq L18
cpi R20,3
ldi R30,0
cpc R21,R30
breq L18
cpi R20,4
ldi R30,0
cpc R21,R30
breq L19
cpi R20,5
ldi R30,0
cpc R21,R30
breq L19
cpi R20,6
ldi R30,0
cpc R21,R30
breq L20
rjmp L14
X1:
.dbline 60
; {
L17:
.dbline 63
; case 0:
; case 1:
; SPCR&=0xFC;
in R24,0x2c
andi R24,252
out 0x2c,R24
.dbline 64
; break;
rjmp L15
L18:
.dbline 67
; case 2:
; case 3:
; SPCR&=0xFC;
in R24,0x2c
andi R24,252
out 0x2c,R24
.dbline 68
; SPCR|=0x01;
in R24,0x2c
ori R24,1
out 0x2c,R24
.dbline 69
; break;
rjmp L15
L19:
.dbline 72
; case 4:
; case 5:
; SPCR&=0xFC;
in R24,0x2c
andi R24,252
out 0x2c,R24
.dbline 73
; SPCR|=0x02;
in R24,0x2c
ori R24,2
out 0x2c,R24
.dbline 74
; break;
rjmp L15
L20:
.dbline 76
; case 6:
; SPCR|=0x03;
in R24,0x2c
ori R24,3
out 0x2c,R24
.dbline 77
; break;
rjmp L15
L14:
.dbline 79
in R24,0x2c
ori R24,3
out 0x2c,R24
.dbline 80
L15:
.dbline -2
L9:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r s 16 c
.dbend
.dbfunc e spi_clock_pulse _spi_clock_pulse fV
.even
_spi_clock_pulse::
.dbline -1
.dbline 85
; default: //Wenn Wert ung黮tig ganz langsam
; SPCR|=0x03;
; break;
; }
; }
;
; void spi_clock_pulse(void)
; {
.dbline 87
;
; SPCR&=BIT6_NEG; //SPI kurz aus
ldi R24,-65
ldi R25,-1
in R2,0x2c
and R2,R24
out 0x2c,R2
.dbline 88
; PORTB|=BIT5_POS; //Taktimpuls
sbi 0x5,5
.dbline 89
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 90
; PORTB&=BIT5_NEG;
ldi R24,-33
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 91
; SPCR|=BIT6_POS; //SPI wieder an
in R24,0x2c
ori R24,64
out 0x2c,R24
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_transfer_8 _spi_transfer_8 fc
; d -> R16
.even
_spi_transfer_8::
.dbline -1
.dbline 103
; }
;
; /**
; Does a 8 bit transfer over the SPI-Interface
; and gives back the byte received
;
; @param d the byte to be transmitted
;
; @return the byte received
; */
; unsigned char spi_transfer_8(unsigned char d)
; {
.dbline 104
; SPDR=d;
out 0x2e,R16
L23:
.dbline 105
L24:
.dbline 105
; while(!(SPSR&0x80));
in R2,0x2d
sbrs R2,7
rjmp L23
.dbline 107
;
; return SPDR;
in R16,0x2e
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbsym r d 16 c
.dbend
.dbfunc e spi_transfer_16 _spi_transfer_16 fc
; d -> R20,R21
.even
_spi_transfer_16::
rcall push_gset1
movw R20,R16
.dbline -1
.dbline 119
; }
;
; /**
; Does a 16 bit transfer over the SPI-Interface
; and gives back the last byte received
;
; @param d the int to be transmitted
;
; @return the last byte received
; */
; unsigned char spi_transfer_16(unsigned int d)
; {
.dbline 120
; spi_transfer_8((d>>8)&0xFF);
movw R16,R20
mov R16,R17
clr R17
andi R17,0
rcall _spi_transfer_8
.dbline 121
; return spi_transfer_8(d&0xFF);
mov R16,R20
andi R17,0
rcall _spi_transfer_8
.dbline -2
L26:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r d 20 i
.dbend
.dbfunc e spi_transfer_32 _spi_transfer_32 fc
; d -> y+4
.even
_spi_transfer_32::
rcall push_arg4
rcall push_gset2
.dbline -1
.dbline 133
; }
;
; /**
; Does a 32 bit transfer over the SPI-Interface
; and gives back the last byte received
;
; @param d the long to be transmitted
;
; @return the last byte received
; */
; unsigned char spi_transfer_32(unsigned long d)
; {
.dbline 134
; spi_transfer_8((d>>24)&0xFF);
ldi R24,24
ldi R25,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R24
movw R16,R2
movw R18,R4
rcall lsr32
movw R2,R16
movw R4,R18
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
and R2,R20
and R3,R21
and R4,R22
and R5,R23
mov R16,R2
rcall _spi_transfer_8
.dbline 135
; spi_transfer_8((d>>16)&0xFF);
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
movw R2,R4
clr R4
clr R5
and R2,R20
and R3,R21
and R4,R22
and R5,R23
mov R16,R2
rcall _spi_transfer_8
.dbline 136
; spi_transfer_8((d>>8)&0xFF);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R24
movw R16,R2
movw R18,R4
rcall lsr32
movw R2,R16
movw R4,R18
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
and R2,R20
and R3,R21
and R4,R22
and R5,R23
mov R16,R2
rcall _spi_transfer_8
.dbline 137
; return spi_transfer_8(d&0xFF);
ldi R20,255
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
and R2,R20
and R3,R21
and R4,R22
and R5,R23
mov R16,R2
rcall _spi_transfer_8
.dbline -2
L27:
rcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l d 4 l
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -