📄 spi_2dpj_master.lss
字号:
spi_2dpj_master.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000002be 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 0000000a 00800060 000002be 00000352 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000019 0080006a 0080006a 0000035c 2**0
ALLOC
3 .noinit 00000000 00800083 00800083 0000035c 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 0000035c 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 0000035c 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 000000cf 00000000 00000000 00000370 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 0000028d 00000000 00000000 0000043f 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000000d5 00000000 00000000 000006cc 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000001c6 00000000 00000000 000007a1 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000017 00000000 00000000 00000967 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54
4: 0c 94 45 00 jmp 0x8a
8: 0c 94 45 00 jmp 0x8a
c: 0c 94 45 00 jmp 0x8a
10: 0c 94 45 00 jmp 0x8a
14: 0c 94 45 00 jmp 0x8a
18: 0c 94 45 00 jmp 0x8a
1c: 0c 94 45 00 jmp 0x8a
20: 0c 94 45 00 jmp 0x8a
24: 0c 94 45 00 jmp 0x8a
28: 0c 94 b9 00 jmp 0x172
2c: 0c 94 45 00 jmp 0x8a
30: 0c 94 45 00 jmp 0x8a
34: 0c 94 45 00 jmp 0x8a
38: 0c 94 45 00 jmp 0x8a
3c: 0c 94 45 00 jmp 0x8a
40: 0c 94 45 00 jmp 0x8a
44: 0c 94 45 00 jmp 0x8a
48: 0c 94 45 00 jmp 0x8a
4c: 0c 94 45 00 jmp 0x8a
50: 0c 94 45 00 jmp 0x8a
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d4 e0 ldi r29, 0x04 ; 4
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ee eb ldi r30, 0xBE ; 190
68: f2 e0 ldi r31, 0x02 ; 2
6a: 02 c0 rjmp .+4 ; 0x70
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: aa 36 cpi r26, 0x6A ; 106
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c
00000076 <__do_clear_bss>:
76: 10 e0 ldi r17, 0x00 ; 0
78: aa e6 ldi r26, 0x6A ; 106
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a3 38 cpi r26, 0x83 ; 131
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e
86: 0c 94 43 01 jmp 0x286
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <disp>:
//***************************************************
//七段数码管显示函数
//***************************************************
void disp(unsigned char data)
{ DDRB=0xFF;
8e: cf 93 push r28
90: df 93 push r29
92: cd b7 in r28, 0x3d ; 61
94: de b7 in r29, 0x3e ; 62
96: 21 97 sbiw r28, 0x01 ; 1
98: 0f b6 in r0, 0x3f ; 63
9a: f8 94 cli
9c: de bf out 0x3e, r29 ; 62
9e: 0f be out 0x3f, r0 ; 63
a0: cd bf out 0x3d, r28 ; 61
a2: 89 83 std Y+1, r24 ; 0x01
a4: 8f ef ldi r24, 0xFF ; 255
a6: 80 93 37 00 sts 0x0037, r24
DDRA=0xFF;
aa: 8f ef ldi r24, 0xFF ; 255
ac: 80 93 3a 00 sts 0x003A, r24
PORTA&=~(1<<6);
b0: 80 91 3b 00 lds r24, 0x003B
b4: 8f 7b andi r24, 0xBF ; 191
b6: 80 93 3b 00 sts 0x003B, r24
PORTB=data;
ba: 89 81 ldd r24, Y+1 ; 0x01
bc: 80 93 38 00 sts 0x0038, r24
c0: 21 96 adiw r28, 0x01 ; 1
c2: 0f b6 in r0, 0x3f ; 63
c4: f8 94 cli
c6: de bf out 0x3e, r29 ; 62
c8: 0f be out 0x3f, r0 ; 63
ca: cd bf out 0x3d, r28 ; 61
cc: df 91 pop r29
ce: cf 91 pop r28
d0: 08 95 ret
000000d2 <fill_tx_buffer>:
}
//***************************************************
// 要发送的数据加载到发送缓冲区的函数fill_tx_buffer()
//***************************************************
void fill_tx_buffer(void)
{
d2: cf 93 push r28
d4: df 93 push r29
d6: cd b7 in r28, 0x3d ; 61
d8: de b7 in r29, 0x3e ; 62
da: 2a 97 sbiw r28, 0x0a ; 10
dc: 0f b6 in r0, 0x3f ; 63
de: f8 94 cli
e0: de bf out 0x3e, r29 ; 62
e2: 0f be out 0x3f, r0 ; 63
e4: cd bf out 0x3d, r28 ; 61
uchar SPI_TxBuf[SPI_TX_BUFFER_MASK]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
e6: 8a e0 ldi r24, 0x0A ; 10
e8: de 01 movw r26, r28
ea: 11 96 adiw r26, 0x01 ; 1
ec: e0 e6 ldi r30, 0x60 ; 96
ee: f0 e0 ldi r31, 0x00 ; 0
f0: 01 90 ld r0, Z+
f2: 0d 92 st X+, r0
f4: 8a 95 dec r24
f6: e1 f7 brne .-8 ; 0xf0
f8: 2a 96 adiw r28, 0x0a ; 10
fa: 0f b6 in r0, 0x3f ; 63
fc: f8 94 cli
fe: de bf out 0x3e, r29 ; 62
100: 0f be out 0x3f, r0 ; 63
102: cd bf out 0x3d, r28 ; 61
104: df 91 pop r29
106: cf 91 pop r28
108: 08 95 ret
0000010a <read_rx_buffer>:
}
//***************************************************
// 从接收缓冲区读出数据的函数read_rx_buffer()
//***************************************************
void read_rx_buffer(void)
{
10a: cf 93 push r28
10c: df 93 push r29
10e: cd b7 in r28, 0x3d ; 61
110: de b7 in r29, 0x3e ; 62
/*for(uint i=1;i<SPI_TX_BUFFER_SIZE;i++)
{disp(SPI_RxBuf[i]);
for (uint k=0;k<50 ;k++) _delay_ms(20);}*/
if(SPI_RxBuf[1]==0xc0 && SPI_RxBuf[2]==0xf9)
112: 80 91 78 00 lds r24, 0x0078
116: 80 3c cpi r24, 0xC0 ; 192
118: 49 f5 brne .+82 ; 0x16c
11a: 80 91 79 00 lds r24, 0x0079
11e: 89 3f cpi r24, 0xF9 ; 249
120: 29 f5 brne .+74 ; 0x16c
if (SPI_RxBuf[3]==0xa4 && SPI_RxBuf[4]==0xb0)
122: 80 91 7a 00 lds r24, 0x007A
126: 84 3a cpi r24, 0xA4 ; 164
128: 09 f5 brne .+66 ; 0x16c
12a: 80 91 7b 00 lds r24, 0x007B
12e: 80 3b cpi r24, 0xB0 ; 176
130: e9 f4 brne .+58 ; 0x16c
if(SPI_RxBuf[5]==0x99 && SPI_RxBuf[6]==0x92 )
132: 80 91 7c 00 lds r24, 0x007C
136: 89 39 cpi r24, 0x99 ; 153
138: c9 f4 brne .+50 ; 0x16c
13a: 80 91 7d 00 lds r24, 0x007D
13e: 82 39 cpi r24, 0x92 ; 146
140: a9 f4 brne .+42 ; 0x16c
if(SPI_RxBuf[7]==0x82 && SPI_RxBuf[8]==0xf8)
142: 80 91 7e 00 lds r24, 0x007E
146: 82 38 cpi r24, 0x82 ; 130
148: 89 f4 brne .+34 ; 0x16c
14a: 80 91 7f 00 lds r24, 0x007F
14e: 88 3f cpi r24, 0xF8 ; 248
150: 69 f4 brne .+26 ; 0x16c
if (SPI_RxBuf[9]==0x80 && SPI_RxBuf[10]==0x90)
152: 80 91 80 00 lds r24, 0x0080
156: 80 38 cpi r24, 0x80 ; 128
158: 49 f4 brne .+18 ; 0x16c
15a: 80 91 81 00 lds r24, 0x0081
15e: 80 39 cpi r24, 0x90 ; 144
160: 29 f4 brne .+10 ; 0x16c
PORTC&=~(1<<5); //
162: 80 91 35 00 lds r24, 0x0035
166: 8f 7d andi r24, 0xDF ; 223
168: 80 93 35 00 sts 0x0035, r24
16c: df 91 pop r29
16e: cf 91 pop r28
170: 08 95 ret
00000172 <__vector_10>:
}
//******************************************
// SPI 中断服务程序 interrupt [SPI_STC]:11
//******************************************
SIGNAL (SIG_SPI)
{
172: 1f 92 push r1
174: 0f 92 push r0
176: 0f b6 in r0, 0x3f ; 63
178: 0f 92 push r0
17a: 11 24 eor r1, r1
17c: 8f 93 push r24
17e: 9f 93 push r25
180: ef 93 push r30
182: ff 93 push r31
184: cf 93 push r28
186: df 93 push r29
188: cd b7 in r28, 0x3d ; 61
18a: de b7 in r29, 0x3e ; 62
SPI_RxBuf[SPI_RxHead] = SPDR; //从ISP口读出收到的字节
18c: 80 91 6a 00 lds r24, 0x006A
190: 99 27 eor r25, r25
192: fc 01 movw r30, r24
194: e9 58 subi r30, 0x89 ; 137
196: ff 4f sbci r31, 0xFF ; 255
198: 80 91 2f 00 lds r24, 0x002F
19c: 80 83 st Z, r24
if (SPI_RxHead == SPI_RX_BUFFER_MASK) //如果是接收帧的最后一个数据
19e: 80 91 6a 00 lds r24, 0x006A
1a2: 8a 30 cpi r24, 0x0A ; 10
1a4: 31 f4 brne .+12 ; 0x1b2
{
SPI_RxHead = 0; //已接收数据还原
1a6: 10 92 6a 00 sts 0x006A, r1
spi_trans_com=1; //置接收完成标志
1aa: 81 e0 ldi r24, 0x01 ; 1
1ac: 80 93 82 00 sts 0x0082, r24
1b0: 05 c0 rjmp .+10 ; 0x1bc
}
else
{
SPI_RxHead++; //已接收数据计数器加1
1b2: 80 91 6a 00 lds r24, 0x006A
1b6: 8f 5f subi r24, 0xFF ; 255
1b8: 80 93 6a 00 sts 0x006A, r24
}
if (Tx_counter) //如果发送缓冲区中有待发的数据
1bc: 80 91 6b 00 lds r24, 0x006B
1c0: 88 23 and r24, r24
1c2: e1 f0 breq .+56 ; 0x1fc
{
--Tx_counter;
1c4: 80 91 6b 00 lds r24, 0x006B
1c8: 81 50 subi r24, 0x01 ; 1
1ca: 80 93 6b 00 sts 0x006B, r24
SPDR=SPI_TxBuf[SPI_TxHead]; //发送一个字节数据,并调整指针
1ce: 80 91 6c 00 lds r24, 0x006C
1d2: 99 27 eor r25, r25
1d4: fc 01 movw r30, r24
1d6: e3 59 subi r30, 0x93 ; 147
1d8: ff 4f sbci r31, 0xFF ; 255
1da: 80 81 ld r24, Z
1dc: 80 93 2f 00 sts 0x002F, r24
if (++SPI_TxHead ==SPI_TX_BUFFER_MASK)
1e0: 80 91 6c 00 lds r24, 0x006C
1e4: 8f 5f subi r24, 0xFF ; 255
1e6: 80 93 6c 00 sts 0x006C, r24
1ea: 80 91 6c 00 lds r24, 0x006C
1ee: 8a 30 cpi r24, 0x0A ; 10
1f0: 29 f4 brne .+10 ; 0x1fc
{SPI_TxHead = 0;
1f2: 10 92 6c 00 sts 0x006C, r1
Tx_counter=SPI_TX_BUFFER_MASK;
1f6: 8a e0 ldi r24, 0x0A ; 10
1f8: 80 93 6b 00 sts 0x006B, r24
1fc: df 91 pop r29
1fe: cf 91 pop r28
200: ff 91 pop r31
202: ef 91 pop r30
204: 9f 91 pop r25
206: 8f 91 pop r24
208: 0f 90 pop r0
20a: 0f be out 0x3f, r0 ; 63
20c: 0f 90 pop r0
20e: 1f 90 pop r1
210: 18 95 reti
00000212 <spi_init>:
}
}
}
//**************************************************************
// SPI 初始化 (MEGA16 PB4——/SS,PB5——MOSI,PB6——MISO,PB7——SCK)
//**************************************************************
void spi_init(void)
{
212: cf 93 push r28
214: df 93 push r29
216: cd b7 in r28, 0x3d ; 61
218: de b7 in r29, 0x3e ; 62
21a: 21 97 sbiw r28, 0x01 ; 1
21c: 0f b6 in r0, 0x3f ; 63
21e: f8 94 cli
220: de bf out 0x3e, r29 ; 62
222: 0f be out 0x3f, r0 ; 63
224: cd bf out 0x3d, r28 ; 61
unsigned char temp;
DDRB = 0xB0; //MISO=input and MOSI,SCK,SS = output
226: 80 eb ldi r24, 0xB0 ; 176
228: 80 93 37 00 sts 0x0037, r24
PORTB = 0x40; //MISO上拉电阻有效
22c: 80 e4 ldi r24, 0x40 ; 64
22e: 80 93 38 00 sts 0x0038, r24
SPCR = 0xD5; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
232: 85 ed ldi r24, 0xD5 ; 213
234: 80 93 2d 00 sts 0x002D, r24
SPSR = 0x00;
238: 10 92 2e 00 sts 0x002E, r1
temp = SPSR;
23c: 80 91 2e 00 lds r24, 0x002E
240: 89 83 std Y+1, r24 ; 0x01
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
242: 80 91 2f 00 lds r24, 0x002F
246: 89 83 std Y+1, r24 ; 0x01
248: 21 96 adiw r28, 0x01 ; 1
24a: 0f b6 in r0, 0x3f ; 63
24c: f8 94 cli
24e: de bf out 0x3e, r29 ; 62
250: 0f be out 0x3f, r0 ; 63
252: cd bf out 0x3d, r28 ; 61
254: df 91 pop r29
256: cf 91 pop r28
258: 08 95 ret
0000025a <spi_send>:
}
//***************************************************************
//发送数据0XFF,启动发送,(接收方接收到的第一个数据为0xFF应忽略 )
//***************************************************************
void spi_send(void)
{
25a: cf 93 push r28
25c: df 93 push r29
25e: cd b7 in r28, 0x3d ; 61
260: de b7 in r29, 0x3e ; 62
fill_tx_buffer(); //调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区
262: 0e 94 69 00 call 0xd2
spi_init(); //初始化spi为主方式
266: 0e 94 09 01 call 0x212
SPDR=0xFF; //开始发送,接收方接收到的第一个数据为0xFF应忽略
26a: 8f ef ldi r24, 0xFF ; 255
26c: 80 93 2f 00 sts 0x002F, r24
sei(); //开总中断
270: 78 94 sei
SPCR|=(1<<SPIE)|(1<<SPE); //使能SPI,开SPI中断
272: 80 91 2d 00 lds r24, 0x002D
276: 80 6c ori r24, 0xC0 ; 192
278: 80 93 2d 00 sts 0x002D, r24
SPI_TxHead = 0; //已发送数据计数器清0
27c: 10 92 6c 00 sts 0x006C, r1
280: df 91 pop r29
282: cf 91 pop r28
284: 08 95 ret
00000286 <main>:
}
int main(void)
{
286: cf e5 ldi r28, 0x5F ; 95
288: d4 e0 ldi r29, 0x04 ; 4
28a: de bf out 0x3e, r29 ; 62
28c: cd bf out 0x3d, r28 ; 61
PORTC=0xFF;
28e: 8f ef ldi r24, 0xFF ; 255
290: 80 93 35 00 sts 0x0035, r24
DDRC=0xFF; //PC口设为输出高电平,灯灭
294: 8f ef ldi r24, 0xFF ; 255
296: 80 93 34 00 sts 0x0034, r24
SPI_RxHead=0;
29a: 10 92 6a 00 sts 0x006A, r1
SPI_TxHead=0;
29e: 10 92 6c 00 sts 0x006C, r1
Tx_counter=SPI_TX_BUFFER_MASK;
2a2: 8a e0 ldi r24, 0x0A ; 10
2a4: 80 93 6b 00 sts 0x006B, r24
spi_send();
2a8: 0e 94 2d 01 call 0x25a
while(1)
{
if(spi_trans_com==1) //如果接收完成标志为1,表明有所数据已接收
2ac: 80 91 82 00 lds r24, 0x0082
2b0: 81 30 cpi r24, 0x01 ; 1
2b2: e1 f7 brne .-8 ; 0x2ac
{
read_rx_buffer(); //调用read_rx_buffer函数,将接收到的数据从接收缓冲区读出
2b4: 0e 94 85 00 call 0x10a
spi_trans_com=0; //读完清除接收完成标志
2b8: 10 92 82 00 sts 0x0082, r1
2bc: f7 cf rjmp .-18 ; 0x2ac
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -