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

📄 spi.s

📁 文档里面的代码是可以正常使用的
💻 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 + -