📄 spi_test_slave.lis
字号:
.module Spi_test_slave.c
.area text(rom, con, rel)
0000 .dbfile F:\IccAvr_Pro\Spi_test_slave.c
.area vector(rom, abs)
.org 68
0044 0C940000 jmp _spi_stc_isr
.area text(rom, con, rel)
0000 .dbfunc e spi_stc_isr _spi_stc_isr fV
.even
0000 _spi_stc_isr::
0000 2A92 st -y,R2
0002 8A93 st -y,R24
0004 9A93 st -y,R25
0006 EA93 st -y,R30
0008 FA93 st -y,R31
000A 2FB6 in R2,0x3f
000C 2A92 st -y,R2
000E .dbline -1
000E .dbline 16
000E ; #include <iom16v.h>
000E ; #include <macros.h>
000E ; #define SIZE 100
000E ; #define MOSI PORTB5
000E ; #define MISO PINB6
000E ; #define SCK PORTB7
000E ; #define SS PORTB4
000E ;
000E ; unsigned char SPI_rx_buff[SIZE];
000E ; unsigned char SPI_tx_buff[SIZE];
000E ; unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
000E ; unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok,SPI_datain;
000E ;
000E ; #pragma interrupt_handler spi_stc_isr:18
000E ; void spi_stc_isr(void)
000E ; {
000E .dbline 17
000E ; SPI_rx_buff[rx_wr_index] = SPDR; //从ISP口读出收到的字节
000E 80E0 ldi R24,<_SPI_rx_buff
0010 90E0 ldi R25,>_SPI_rx_buff
0012 E0910800 lds R30,_rx_wr_index
0016 FF27 clr R31
0018 E80F add R30,R24
001A F91F adc R31,R25
001C 2FB0 in R2,0xf
001E 2082 std z+0,R2
0020 .dbline 18
0020 ; SPI_ok=1;
0020 81E0 ldi R24,1
0022 80930100 sts _SPI_ok,R24
0026 .dbline 19
0026 ; SPI_datain=1;
0026 80930000 sts _SPI_datain,R24
002A .dbline 20
002A ; if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针
002A 80910800 lds R24,_rx_wr_index
002E 8F5F subi R24,255 ; addi 1
0030 282E mov R2,R24
0032 20920800 sts _rx_wr_index,R2
0036 8436 cpi R24,100
0038 19F4 brne L2
003A .dbline 20
003A 2224 clr R2
003C 20920800 sts _rx_wr_index,R2
0040 L2:
0040 .dbline 21
0040 ; if (++rx_counter == SIZE)
0040 80910600 lds R24,_rx_counter
0044 8F5F subi R24,255 ; addi 1
0046 282E mov R2,R24
0048 20920600 sts _rx_counter,R2
004C 8436 cpi R24,100
004E 31F4 brne L4
0050 .dbline 22
0050 ; {
0050 .dbline 23
0050 ; rx_counter = 0;
0050 2224 clr R2
0052 20920600 sts _rx_counter,R2
0056 .dbline 24
0056 ; rx_buffer_overflow = 1;
0056 81E0 ldi R24,1
0058 80930500 sts _rx_buffer_overflow,R24
005C .dbline 25
005C ; }
005C L4:
005C .dbline 26
005C ; if (tx_counter) //如果发送缓冲区中有待发的数据
005C 20900200 lds R2,_tx_counter
0060 2220 tst R2
0062 D9F0 breq L6
0064 .dbline 27
0064 ; {
0064 .dbline 28
0064 ; --tx_counter;
0064 822D mov R24,R2
0066 8150 subi R24,1
0068 80930200 sts _tx_counter,R24
006C .dbline 29
006C ; SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针
006C 80E0 ldi R24,<_SPI_tx_buff
006E 90E0 ldi R25,>_SPI_tx_buff
0070 E0910300 lds R30,_tx_rd_index
0074 FF27 clr R31
0076 E80F add R30,R24
0078 F91F adc R31,R25
007A 2080 ldd R2,z+0
007C 2FB8 out 0xf,R2
007E .dbline 30
007E ; SPI_ok=0;
007E 2224 clr R2
0080 20920100 sts _SPI_ok,R2
0084 .dbline 31
0084 ; if (++tx_rd_index == SIZE) tx_rd_index = 0;
0084 80910300 lds R24,_tx_rd_index
0088 8F5F subi R24,255 ; addi 1
008A 282E mov R2,R24
008C 20920300 sts _tx_rd_index,R2
0090 8436 cpi R24,100
0092 19F4 brne L8
0094 .dbline 31
0094 2224 clr R2
0096 20920300 sts _tx_rd_index,R2
009A L8:
009A .dbline 32
009A L6:
009A .dbline -2
009A L1:
009A 2990 ld R2,y+
009C 2FBE out 0x3f,R2
009E F991 ld R31,y+
00A0 E991 ld R30,y+
00A2 9991 ld R25,y+
00A4 8991 ld R24,y+
00A6 2990 ld R2,y+
00A8 .dbline 0 ; func end
00A8 1895 reti
00AA .dbend
00AA .dbfunc e getSPIchar _getSPIchar fc
00AA ; data -> R16
.even
00AA _getSPIchar::
00AA .dbline -1
00AA .dbline 36
00AA ; }
00AA ; }
00AA ;
00AA ; unsigned char getSPIchar(void)
00AA ; {
00AA L11:
00AA .dbline 38
00AA L12:
00AA .dbline 38
00AA ; unsigned char data;
00AA ; while (rx_counter == 0); //无接收数据,等待
00AA 20900600 lds R2,_rx_counter
00AE 2220 tst R2
00B0 E1F3 breq L11
00B2 .dbline 39
00B2 ; data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
00B2 80E0 ldi R24,<_SPI_rx_buff
00B4 90E0 ldi R25,>_SPI_rx_buff
00B6 E0910700 lds R30,_rx_rd_index
00BA FF27 clr R31
00BC E80F add R30,R24
00BE F91F adc R31,R25
00C0 0081 ldd R16,z+0
00C2 .dbline 40
00C2 ; if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针
00C2 80910700 lds R24,_rx_rd_index
00C6 8F5F subi R24,255 ; addi 1
00C8 282E mov R2,R24
00CA 20920700 sts _rx_rd_index,R2
00CE 8436 cpi R24,100
00D0 19F4 brne L14
00D2 .dbline 40
00D2 2224 clr R2
00D4 20920700 sts _rx_rd_index,R2
00D8 L14:
00D8 .dbline 41
00D8 ; CLI();
00D8 F894 cli
00DA .dbline 42
00DA ; --rx_counter;
00DA 80910600 lds R24,_rx_counter
00DE 8150 subi R24,1
00E0 80930600 sts _rx_counter,R24
00E4 .dbline 43
00E4 ; SEI();
00E4 7894 sei
00E6 .dbline 44
00E6 ; return data;
00E6 .dbline -2
00E6 L10:
00E6 .dbline 0 ; func end
00E6 0895 ret
00E8 .dbsym r data 16 c
00E8 .dbend
00E8 .dbfunc e putSPIchar _putSPIchar fV
00E8 ; c -> R16
.even
00E8 _putSPIchar::
00E8 .dbline -1
00E8 .dbline 48
00E8 ; }
00E8 ;
00E8 ; void putSPIchar(char c)
00E8 ; {
00E8 L17:
00E8 .dbline 49
00E8 L18:
00E8 .dbline 49
00E8 ; while (tx_counter == SIZE);//发送缓冲区满,等待
00E8 80910200 lds R24,_tx_counter
00EC 8436 cpi R24,100
00EE E1F3 breq L17
00F0 .dbline 50
00F0 ; CLI();
00F0 F894 cli
00F2 .dbline 51
00F2 ; if (tx_counter || (SPI_ok==0))//发送缓冲区已中有待发数据
00F2 8823 tst R24
00F4 21F4 brne L22
00F6 20900100 lds R2,_SPI_ok
00FA 2220 tst R2
00FC C9F4 brne L20
00FE L22:
00FE .dbline 52
00FE ; { //或SPI正在发送数据时
00FE .dbline 53
00FE ; SPI_tx_buff[tx_wr_index] = c; //将数据放入发送缓冲区排队
00FE 80E0 ldi R24,<_SPI_tx_buff
0100 90E0 ldi R25,>_SPI_tx_buff
0102 E0910400 lds R30,_tx_wr_index
0106 FF27 clr R31
0108 E80F add R30,R24
010A F91F adc R31,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -