📄 spi_2dpj_slave.lss
字号:
spi_2dpj_slave.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000210 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 0000000a 00800060 00000210 000002a4 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000019 0080006a 0080006a 000002ae 2**0
ALLOC
3 .noinit 00000000 00800083 00800083 000002ae 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 000002ae 2**0
CONTENTS
5 .debug_aranges 00000014 00000000 00000000 000002ae 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_pubnames 000000cf 00000000 00000000 000002c2 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_info 000001b9 00000000 00000000 00000391 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_abbrev 000000b5 00000000 00000000 0000054a 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_line 000001ad 00000000 00000000 000005ff 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_str 0000011b 00000000 00000000 000007ac 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 95 00 jmp 0x12a
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: e0 e1 ldi r30, 0x10 ; 16
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 ef 00 jmp 0x1de
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0
0000008e <disp>:
//***************************************************
//七段数码管显示函数
//***************************************************
void disp(unsigned char data)
{ DDRB=0xFF;
8e: 98 2f mov r25, r24
90: 8f ef ldi r24, 0xFF ; 255
92: 87 bb out 0x17, r24 ; 23
DDRA=0xFF;
94: 8a bb out 0x1a, r24 ; 26
PORTA&=~(1<<6);
96: de 98 cbi 0x1b, 6 ; 27
PORTB=data;
98: 98 bb out 0x18, r25 ; 24
9a: 08 95 ret
0000009c <fill_tx_buffer>:
}
//***************************************************
// 要发送的数据加载到发送缓冲区的函数fill_tx_buffer()
//***************************************************
void fill_tx_buffer(void)
{
9c: cf 93 push r28
9e: df 93 push r29
a0: cd b7 in r28, 0x3d ; 61
a2: de b7 in r29, 0x3e ; 62
a4: 2a 97 sbiw r28, 0x0a ; 10
a6: 0f b6 in r0, 0x3f ; 63
a8: f8 94 cli
aa: de bf out 0x3e, r29 ; 62
ac: 0f be out 0x3f, r0 ; 63
ae: cd bf out 0x3d, r28 ; 61
uchar SPI_TxBuf[SPI_TX_BUFFER_MASK]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
b0: 8a e0 ldi r24, 0x0A ; 10
b2: a0 e6 ldi r26, 0x60 ; 96
b4: b0 e0 ldi r27, 0x00 ; 0
b6: fe 01 movw r30, r28
b8: 31 96 adiw r30, 0x01 ; 1
ba: 0d 90 ld r0, X+
bc: 01 92 st Z+, r0
be: 8a 95 dec r24
c0: e1 f7 brne .-8 ; 0xba
c2: 2a 96 adiw r28, 0x0a ; 10
c4: 0f b6 in r0, 0x3f ; 63
c6: f8 94 cli
c8: de bf out 0x3e, r29 ; 62
ca: 0f be out 0x3f, r0 ; 63
cc: cd bf out 0x3d, r28 ; 61
ce: df 91 pop r29
d0: cf 91 pop r28
d2: 08 95 ret
000000d4 <read_rx_buffer>:
}
//***************************************************
// 从接收缓冲区读出数据的函数read_rx_buffer()
//***************************************************
void read_rx_buffer(void)
{
/*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&&SPI_RxBuf[3]==0xa4&&SPI_RxBuf[4]==0xb0&&SPI_RxBuf[5]==0x99
d4: 80 91 78 00 lds r24, 0x0078
d8: 80 3c cpi r24, 0xC0 ; 192
da: 29 f5 brne .+74 ; 0x126
dc: 80 91 79 00 lds r24, 0x0079
e0: 89 3f cpi r24, 0xF9 ; 249
e2: 09 f5 brne .+66 ; 0x126
e4: 80 91 7a 00 lds r24, 0x007A
e8: 84 3a cpi r24, 0xA4 ; 164
ea: e9 f4 brne .+58 ; 0x126
ec: 80 91 7b 00 lds r24, 0x007B
f0: 80 3b cpi r24, 0xB0 ; 176
f2: c9 f4 brne .+50 ; 0x126
f4: 80 91 7c 00 lds r24, 0x007C
f8: 89 39 cpi r24, 0x99 ; 153
fa: a9 f4 brne .+42 ; 0x126
fc: 80 91 7d 00 lds r24, 0x007D
100: 82 39 cpi r24, 0x92 ; 146
102: 89 f4 brne .+34 ; 0x126
104: 80 91 7e 00 lds r24, 0x007E
108: 82 38 cpi r24, 0x82 ; 130
10a: 69 f4 brne .+26 ; 0x126
10c: 80 91 7f 00 lds r24, 0x007F
110: 88 3f cpi r24, 0xF8 ; 248
112: 49 f4 brne .+18 ; 0x126
114: 80 91 80 00 lds r24, 0x0080
118: 80 38 cpi r24, 0x80 ; 128
11a: 29 f4 brne .+10 ; 0x126
11c: 80 91 81 00 lds r24, 0x0081
120: 80 39 cpi r24, 0x90 ; 144
122: 09 f4 brne .+2 ; 0x126
&&SPI_RxBuf[6]==0x92&&SPI_RxBuf[7]==0x82&&SPI_RxBuf[8]==0xf8&&SPI_RxBuf[9]==0x80&&SPI_RxBuf[10]==0x90)
PORTC&=~(1<<5); //如果接收的都正确则灯点亮
124: ad 98 cbi 0x15, 5 ; 21
126: 08 95 ret
128: 08 95 ret
0000012a <__vector_10>:
}
//******************************************
// SPI 中断服务程序 interrupt [SPI_STC]:11
//******************************************
SIGNAL(SIG_SPI)
{
12a: 1f 92 push r1
12c: 0f 92 push r0
12e: 0f b6 in r0, 0x3f ; 63
130: 0f 92 push r0
132: 11 24 eor r1, r1
134: 8f 93 push r24
136: ef 93 push r30
138: ff 93 push r31
SPI_RxBuf[SPI_RxHead] = SPDR; //从ISP口读出收到的字节
13a: 80 91 6a 00 lds r24, 0x006A
13e: e8 2f mov r30, r24
140: ff 27 eor r31, r31
142: e9 58 subi r30, 0x89 ; 137
144: ff 4f sbci r31, 0xFF ; 255
146: 8f b1 in r24, 0x0f ; 15
148: 80 83 st Z, r24
if (SPI_RxHead == SPI_RX_BUFFER_MASK) //如果是接收帧的最后一个数据
14a: 80 91 6a 00 lds r24, 0x006A
14e: 8a 30 cpi r24, 0x0A ; 10
150: 31 f4 brne .+12 ; 0x15e
{
SPI_RxHead = 0; //已接收数据还原
152: 10 92 6a 00 sts 0x006A, r1
spi_trans_com=1; //置接收完成标志
156: 81 e0 ldi r24, 0x01 ; 1
158: 80 93 82 00 sts 0x0082, r24
15c: 05 c0 rjmp .+10 ; 0x168
}
else
{
SPI_RxHead++; //已接收数据计数器加1
15e: 80 91 6a 00 lds r24, 0x006A
162: 8f 5f subi r24, 0xFF ; 255
164: 80 93 6a 00 sts 0x006A, r24
}
if (Tx_counter) //如果发送缓冲区中有待发的数据
168: 80 91 6b 00 lds r24, 0x006B
16c: 88 23 and r24, r24
16e: c1 f0 breq .+48 ; 0x1a0
{
--Tx_counter;
170: 81 50 subi r24, 0x01 ; 1
172: 80 93 6b 00 sts 0x006B, r24
SPDR=SPI_TxBuf[SPI_TxHead]; //发送一个字节数据,并调整指针
176: 80 91 6c 00 lds r24, 0x006C
17a: e8 2f mov r30, r24
17c: ff 27 eor r31, r31
17e: e3 59 subi r30, 0x93 ; 147
180: ff 4f sbci r31, 0xFF ; 255
182: 80 81 ld r24, Z
184: 8f b9 out 0x0f, r24 ; 15
if (++SPI_TxHead ==SPI_TX_BUFFER_MASK)
186: 80 91 6c 00 lds r24, 0x006C
18a: 8f 5f subi r24, 0xFF ; 255
18c: 80 93 6c 00 sts 0x006C, r24
190: 80 91 6c 00 lds r24, 0x006C
194: 8a 30 cpi r24, 0x0A ; 10
196: 21 f4 brne .+8 ; 0x1a0
{SPI_TxHead = 0;
198: 10 92 6c 00 sts 0x006C, r1
Tx_counter=SPI_TX_BUFFER_MASK;
19c: 80 93 6b 00 sts 0x006B, r24
1a0: ff 91 pop r31
1a2: ef 91 pop r30
1a4: 8f 91 pop r24
1a6: 0f 90 pop r0
1a8: 0f be out 0x3f, r0 ; 63
1aa: 0f 90 pop r0
1ac: 1f 90 pop r1
1ae: 18 95 reti
000001b0 <spi_init>:
}
}
}
//**************************************************************
// SPI 初始化 (MEGA16 PB4——/SS,PB5——MOSI,PB6——MISO,PB7——SCK)
//**************************************************************
void spi_init(void)
{
unsigned char temp;
DDRB = 0xB0; //MISO=input and MOSI,SCK,SS = output
1b0: 80 eb ldi r24, 0xB0 ; 176
1b2: 87 bb out 0x17, r24 ; 23
PORTB = 0x40; //MISO上拉电阻有效
1b4: 80 e4 ldi r24, 0x40 ; 64
1b6: 88 bb out 0x18, r24 ; 24
SPCR = 0xC5; //SPI允许,从机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
1b8: 85 ec ldi r24, 0xC5 ; 197
1ba: 8d b9 out 0x0d, r24 ; 13
SPSR = 0x00;
1bc: 1e b8 out 0x0e, r1 ; 14
temp = SPSR;
1be: 8e b1 in r24, 0x0e ; 14
temp = SPDR; //清空SPI,和中断标志,使SPI空闲
1c0: 8f b1 in r24, 0x0f ; 15
1c2: 08 95 ret
000001c4 <spi_send>:
}
//***************************************************************
//将数据0XFF送给SPDR,等待主机发送,(接收方接收到的第一个数据为0xFF应忽略 )
//***************************************************************
void spi_send(void)
{
fill_tx_buffer(); //调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区
1c4: 0e 94 4e 00 call 0x9c
spi_init(); //初始化spi为从方式
1c8: 0e 94 d8 00 call 0x1b0
SPDR=0xFF; //开始发送,接收方接收到的第一个数据为0xFF应忽略
1cc: 8f ef ldi r24, 0xFF ; 255
1ce: 8f b9 out 0x0f, r24 ; 15
sei(); //开总中断
1d0: 78 94 sei
SPCR|=(1<<SPIE)|(1<<SPE); //使能SPI,开SPI中断
1d2: 8d b1 in r24, 0x0d ; 13
1d4: 80 6c ori r24, 0xC0 ; 192
1d6: 8d b9 out 0x0d, r24 ; 13
SPI_TxHead = 0; //已发送数据计数器清0
1d8: 10 92 6c 00 sts 0x006C, r1
1dc: 08 95 ret
000001de <main>:
}
int main(void)
{
1de: cf e5 ldi r28, 0x5F ; 95
1e0: d4 e0 ldi r29, 0x04 ; 4
1e2: de bf out 0x3e, r29 ; 62
1e4: cd bf out 0x3d, r28 ; 61
PORTC=0xFF;
1e6: 8f ef ldi r24, 0xFF ; 255
1e8: 85 bb out 0x15, r24 ; 21
DDRC=0xFF; //PC口设为输出高电平,灯灭
1ea: 84 bb out 0x14, r24 ; 20
SPI_RxHead=0;
1ec: 10 92 6a 00 sts 0x006A, r1
SPI_TxHead=0;
1f0: 10 92 6c 00 sts 0x006C, r1
Tx_counter=SPI_TX_BUFFER_MASK;
1f4: 8a e0 ldi r24, 0x0A ; 10
1f6: 80 93 6b 00 sts 0x006B, r24
spi_send();
1fa: 0e 94 e2 00 call 0x1c4
while(1)
{
if(spi_trans_com==1) //如果接收完成标志为1,表明有所数据已接收
1fe: 80 91 82 00 lds r24, 0x0082
202: 81 30 cpi r24, 0x01 ; 1
204: e1 f7 brne .-8 ; 0x1fe
{
read_rx_buffer(); //调用read_rx_buffer函数,将接收到的数据从接收缓冲区读出
206: 0e 94 6a 00 call 0xd4
spi_trans_com=0; //读完清除接收完成标志
20a: 10 92 82 00 sts 0x0082, r1
20e: f7 cf rjmp .-18 ; 0x1fe
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -