📄 spi.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 + -