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

📄 spi.s

📁 用AVR端口模拟SPI和AD9517的通信
💻 S
字号:
	.module spi.c
	.area text(rom, con, rel)
	.dbfile E:\avr_first\spi.c
	.dbfunc e spisend _spisend fV
;              i -> R20
;           data -> R16
	.even
_spisend::
	rcall push_gset1
	.dbline -1
	.dbline 26
; #include <iom48v.h>
; #include <macros.h>
; 
; #define uint unsigned  int
; #define ulong unsigned long
; #define uchar unsigned char
; 
; #define clk       PD0//AD_clk
; #define data_IO   PD1//AD数据输入输出口
; #define cs        PD2//AD片选
; 
; #define IO_DDR    DDD1//数据读入读出口 
; 
; #define IO_PIN    PIND
; 
; //#define clk_s       PD3
; //#define ss_s        PD4
; //#define data_s      PD5
; //#define data_sPIN   PIND5
; //#define data_sDDR   DDD5
; 
; 
; 
; 
; void spisend(uchar data)//写入
; {   
	.dbline 29
;     uchar i; 
;     //IO_DDR=1;
; 	DDRD |= 0x02;
	sbi 0xa,1
	.dbline 31
;     //clk=0;
; 	PORTD &= 0xfe;
	in R24,0xb
	andi R24,254
	out 0xb,R24
	.dbline 32
;     for(i=8;i>0;i--)
	ldi R20,8
	rjmp L5
L2:
	.dbline 33
;  {
	.dbline 34
;   if ((data&0x01)==1)
	mov R24,R16
	andi R24,1
	cpi R24,1
	brne L6
	.dbline 35
;    { 
	.dbline 37
;    //data_IO=1;
;    PORTD |= 0x02;
	sbi 0xb,1
	.dbline 38
;    }
	rjmp L7
L6:
	.dbline 41
;   else 
;    //data_IO=0;
;    PORTD &= 0xFD;
	in R24,0xb
	andi R24,253
	out 0xb,R24
L7:
	.dbline 42
	nop
	.dbline 44
	sbi 0xb,0
	.dbline 47
	in R24,0xb
	andi R24,254
	out 0xb,R24
	.dbline 48
	lsr R16
	.dbline 49
L3:
	.dbline 32
	dec R20
L5:
	.dbline 32
	clr R2
	cp R2,R20
	brlo L2
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r data 16 c
	.dbend
	.dbfunc e spiread _spiread fc
;           data -> R20
;           temp -> R22
;              i -> R10
	.even
_spiread::
	rcall push_gset3
	.dbline -1
	.dbline 53
;    _NOP();
;   //clk=1;
;   PORTD |= 0x01;
;  //_NOP(); 
;   //clk=0;
;   PORTD &= 0xfe;   
;   data>>=1;//右移一位
;  } 
; } 
; 
; uchar spiread(void) //读取
; {
	.dbline 55
;  uchar i;
;  uchar data=0x00; 
	clr R20
	.dbline 58
;  uchar temp;  
;  //IO_DDR=0;  //IO口作为输入,DDR要写0
;  DDRD &= 0xfd;  
	in R24,0xa
	andi R24,253
	out 0xa,R24
	.dbline 61
;  //ss_r=0;
;  //clk=0; 
;  PORTD &= 0xfe;    
	in R24,0xb
	andi R24,254
	out 0xb,R24
	.dbline 62
;  for(i=0;i<8;i++)
	clr R10
	rjmp L12
L9:
	.dbline 63
;  {   
	.dbline 65
;   //clk=1;
;   PORTD |= 0x01; 
	sbi 0xb,0
	.dbline 67
;   //clk=0;
;   PORTD &= 0xfe;       
	in R24,0xb
	andi R24,254
	out 0xb,R24
	.dbline 68
;   temp=IO_PIN; 
	in R22,0x9
	.dbline 69
;         if (temp&0x02)       //下降沿采集数据,调换则会出错 
	sbrs R22,1
	rjmp L13
	.dbline 70
;  data|=(0x01<<i);
	ldi R16,1
	mov R17,R10
	rcall lsl8
	or R20,R16
L13:
	.dbline 71
L10:
	.dbline 62
	inc R10
L12:
	.dbline 62
	mov R24,R10
	cpi R24,8
	brlo L9
	.dbline 73
;  } 
;  //IO_DDR=1;
;  DDRD |= 0x02;
	sbi 0xa,1
	.dbline 76
;  //ss_r=1;  //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
; // clk=1;
; PORTD |= 0x01; 
	sbi 0xb,0
	.dbline 77
; return(data);
	mov R16,R20
	.dbline -2
L8:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r temp 22 c
	.dbsym r i 10 c
	.dbend
	.area lit(rom, con, rel)
L16:
	.byte 0,0
	.byte 0,0
L17:
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile E:\avr_first\spi.c
	.dbfunc e main _main fV
;           data -> y+2
;     instrution -> y+0
;              j -> R20,R21
;              i -> R22,R23
;        spidata -> y+6
	.even
_main::
	sbiw R28,6
	.dbline -1
	.dbline 81
; }
; 
; void main(ulong spidata)
; {
	.dbline 83
;  uint i,j;
;  uchar data[4]={0,0,0,0};
	ldi R24,<L16
	ldi R25,>L16
	movw R30,R28
	adiw R30,2
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 84
;  uchar instrution[2]={0,0};
	ldi R24,<L17
	ldi R25,>L17
	movw R30,R28
	ldi R16,2
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 97
;  /*PORTA="0x00";   //灯指示
;  DDRA="0XFF";
;  
; PORTB="0x00";//0101 0000
;  DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
;  
;  PORTC="0x00";
;  DDRC="0x80";
; 
;  DDRD="0xff";//0000 0001 
; PORTD="0x00";*///0100 1000 
;     //cs = 0;
; 	PORTD &= 0xfc;
	in R24,0xb
	andi R24,252
	out 0xb,R24
	.dbline 98
;     for(i=0;i<2;i++)
	clr R22
	clr R23
	rjmp L21
L18:
	.dbline 99
	.dbline 100
	movw R24,R28
	movw R30,R22
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _spisend
	.dbline 101
L19:
	.dbline 98
	subi R22,255  ; offset = 1
	sbci R23,255
L21:
	.dbline 98
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	brlo L18
	.dbline 102
;         {
;            spisend(instrution[i]);
;         }
;     if(instrution[0]&0x8000)
	ldd R2,y+0
	clr R3
	sbrs R3,7
	rjmp L22
	.dbline 103
; 	   {
	.dbline 104
; 	    for(j=0;j<4;j++)
	clr R20
	clr R21
	rjmp L27
L24:
	.dbline 105
	.dbline 106
	rcall _spiread
	movw R24,R28
	adiw R24,2
	movw R30,R20
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 107
L25:
	.dbline 104
	subi R20,255  ; offset = 1
	sbci R21,255
L27:
	.dbline 104
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brlo L24
	.dbline 108
; 		   {
; 		    data[j]=spiread();
; 		   }
; 	   }
	rjmp L23
L22:
	.dbline 109
;      else  {
	.dbline 110
; 	    for(j=0;j<4;j++)
	clr R20
	clr R21
	rjmp L31
L28:
	.dbline 111
	.dbline 112
	movw R24,R28
	adiw R24,2
	movw R30,R22
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _spisend
	.dbline 113
L29:
	.dbline 110
	subi R20,255  ; offset = 1
	sbci R21,255
L31:
	.dbline 110
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brlo L28
	.dbline 114
; 		   {
; 		    spisend(data[i]);
; 		   }
;             }
L23:
	.dbline 116
;     // cs = 1;
; 	PORTD |= 0x40;
	sbi 0xb,6
	.dbline -2
L15:
	adiw R28,6
	.dbline 0 ; func end
	ret
	.dbsym l data 2 A[4:4]c
	.dbsym l instrution 0 A[2:2]c
	.dbsym r j 20 i
	.dbsym r i 22 i
	.dbsym l spidata 6 l
	.dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -