📄 spi.s
字号:
.module spi.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRISP~1\icc\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;
cbi 0x12,7
.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,0x18
and R2,R30
out 0x18,R2
.dbline 17
; DDRB |= BIT3_POS | BIT5_POS; //MOSI und SCK als Ausgang
in R24,0x17
ori R24,40
out 0x17,R24
.dbline 18
; SPCR = 0x51; //SPI Master /16
ldi R24,81
out 0xd,R24
.dbline 19
; R_RES_OFF;
sbi 0x12,7
.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;
cbi 0x12,7
.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(SPI_SPEED_230KHz);
ldi R16,1
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 0xd,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,0x17
and R2,R30
out 0x17,R2
.dbline 32
; R_RES_OFF;
sbi 0x12,7
.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 0x12,7
.dbline 38
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 39
; R_RES_ON;
cbi 0x12,7
.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 54
; }
;
; /**
; Stellt die Geschwindigkeit des SPI-Busses ein (bei f=3.6864MHz)
; 0: /4 921.50KHz
; 1: /16 230.37kHz
; 2: /64 57.59kHz
; 3: /128 28.79kHz
; 26: / 4kHz
; 0xFE: / 603Hz
;
; weitere Geschwindigkeiten geplant
; -> dann per Software-SPI
; */
; void spi_set_speed(unsigned char s) {
.dbline 56
mov R20,R16
clr R21
cpi R20,0
cpc R20,R21
breq L13
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L14
cpi R20,2
ldi R30,0
cpc R21,R30
breq L15
rjmp L10
X1:
.dbline 56
;
; switch(s) {
L13:
.dbline 58
; case 0:
; SPCR&=0xFC;
in R24,0xd
andi R24,252
out 0xd,R24
.dbline 59
; break;
rjmp L11
L14:
.dbline 61
; case 1:
; SPCR&=0xFC;
in R24,0xd
andi R24,252
out 0xd,R24
.dbline 62
; SPCR|=0x01;
sbi 0xd,0
.dbline 63
; break;
rjmp L11
L15:
.dbline 65
; case 2:
; SPCR&=0xFC;
in R24,0xd
andi R24,252
out 0xd,R24
.dbline 66
; SPCR|=0x02;
sbi 0xd,1
.dbline 67
; break;
rjmp L11
L10:
.dbline 69
in R24,0xd
ori R24,3
out 0xd,R24
.dbline 70
L11:
.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 75
; default: //Wenn Wert ung黮tig ganz langsam
; SPCR|=0x03;
; break;
; }
; }
;
; void spi_clock_pulse(void)
; {
.dbline 77
;
; SPCR&=BIT6_NEG; //SPI kurz aus
ldi R24,-65
ldi R25,-1
in R2,0xd
and R2,R24
out 0xd,R2
.dbline 78
; PORTB|=BIT5_POS; //Taktimpuls
sbi 0x18,5
.dbline 79
; wait_ms(2);
ldi R16,2
ldi R17,0
rcall _wait_ms
.dbline 80
; PORTB&=BIT5_NEG;
ldi R24,-33
ldi R25,-1
in R2,0x18
and R2,R24
out 0x18,R2
.dbline 81
; SPCR|=BIT6_POS; //SPI wieder an
sbi 0xd,6
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e spi_transfer_8 _spi_transfer_8 fc
; d -> R16
.even
_spi_transfer_8::
.dbline -1
.dbline 93
; }
;
; /**
; 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 94
; SPDR=d;
out 0xf,R16
L18:
.dbline 95
L19:
.dbline 95
; while(!(SPSR&0x80));
sbis 0xe,7
rjmp L18
.dbline 97
;
; return SPDR;
in R16,0xf
.dbline -2
L17:
.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 109
; }
;
; /**
; 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 110
; spi_transfer_8((d>>8)&0xFF);
movw R16,R20
mov R16,R17
clr R17
andi R17,0
rcall _spi_transfer_8
.dbline 111
; return spi_transfer_8(d&0xFF);
mov R16,R20
andi R17,0
rcall _spi_transfer_8
.dbline -2
L21:
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 123
; }
;
; /**
; 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 124
; 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 125
; 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 126
; 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 127
; 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
L22:
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 + -