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

📄 spi_2dpj_slave.lss

📁 arm的功能测试模块
💻 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 + -