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

📄 spi.s

📁 AVR单片机,STK500下载线制作全套资料,包括程序,电路图
💻 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 + -