📄 spi_master.lis
字号:
.module SPI_master.c
.area text(rom, con, rel)
0000 .dbfile F:\IccAvr_Pro\SPI_master.c
.area vector(rom, abs)
.org 40
0028 0C940000 jmp _spi_stc_isr
.area text(rom, con, rel)
0000 .dbfile F:\IccAvr_Pro\SPI_master.c
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 10
000E ; #include "SPI_master.h"
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,temp;
000E ;
000E ; #pragma interrupt_handler spi_stc_isr:11
000E ; void spi_stc_isr(void)
000E ; {
000E .dbline 12
000E ; //PORTB|=BIT(SS);
000E ; if (tx_counter) //如果发送缓冲区中有待发的数据
000E 20900300 lds R2,_tx_counter
0012 2220 tst R2
0014 D9F0 breq L2
0016 .dbline 13
0016 ; {
0016 .dbline 14
0016 ; --tx_counter;
0016 822D mov R24,R2
0018 8150 subi R24,1
001A 80930300 sts _tx_counter,R24
001E .dbline 16
001E ;
001E ; SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针
001E 80E0 ldi R24,<_SPI_tx_buff
0020 90E0 ldi R25,>_SPI_tx_buff
0022 E0910400 lds R30,_tx_rd_index
0026 FF27 clr R31
0028 E80F add R30,R24
002A F91F adc R31,R25
002C 2080 ldd R2,z+0
002E 2FB8 out 0xf,R2
0030 .dbline 17
0030 ; SPI_ok=0;
0030 2224 clr R2
0032 20920200 sts _SPI_ok,R2
0036 .dbline 18
0036 ; if (++tx_rd_index == SIZE) tx_rd_index = 0;
0036 80910400 lds R24,_tx_rd_index
003A 8F5F subi R24,255 ; addi 1
003C 282E mov R2,R24
003E 20920400 sts _tx_rd_index,R2
0042 8436 cpi R24,100
0044 19F4 brne L4
0046 .dbline 18
0046 2224 clr R2
0048 20920400 sts _tx_rd_index,R2
004C L4:
004C .dbline 19
004C ; }
004C L2:
004C .dbline 20
004C ; SPI_rx_buff[rx_wr_index] = SPDR; //从ISP口读出收到的字节
004C 80E0 ldi R24,<_SPI_rx_buff
004E 90E0 ldi R25,>_SPI_rx_buff
0050 E0910900 lds R30,_rx_wr_index
0054 FF27 clr R31
0056 E80F add R30,R24
0058 F91F adc R31,R25
005A 2FB0 in R2,0xf
005C 2082 std z+0,R2
005E .dbline 22
005E ;
005E ; SPI_datain=1;
005E 81E0 ldi R24,1
0060 80930100 sts _SPI_datain,R24
0064 .dbline 23
0064 ; SPI_ok=1;
0064 80930200 sts _SPI_ok,R24
0068 .dbline 24
0068 ; if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收缓冲区,并调整队列指针
0068 80910900 lds R24,_rx_wr_index
006C 8F5F subi R24,255 ; addi 1
006E 282E mov R2,R24
0070 20920900 sts _rx_wr_index,R2
0074 8436 cpi R24,100
0076 19F4 brne L6
0078 .dbline 24
0078 2224 clr R2
007A 20920900 sts _rx_wr_index,R2
007E L6:
007E .dbline 25
007E 80910700 lds R24,_rx_counter
0082 8F5F subi R24,255 ; addi 1
0084 282E mov R2,R24
0086 20920700 sts _rx_counter,R2
008A 8436 cpi R24,100
008C 31F4 brne L8
008E .dbline 26
008E .dbline 27
008E 2224 clr R2
0090 20920700 sts _rx_counter,R2
0094 .dbline 28
0094 81E0 ldi R24,1
0096 80930600 sts _rx_buffer_overflow,R24
009A .dbline 29
009A L8:
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 34
00AA ; if (++rx_counter == SIZE)
00AA ; {
00AA ; rx_counter = 0;
00AA ; rx_buffer_overflow = 1;
00AA ; }
00AA ; //PORTB&=~BIT(SS);
00AA ; }
00AA ;
00AA ; unsigned char getSPIchar(void)
00AA ; {
00AA L11:
00AA .dbline 36
00AA L12:
00AA .dbline 36
00AA ; unsigned char data;
00AA ; while (rx_counter == 0); //无接收数据,等待
00AA 20900700 lds R2,_rx_counter
00AE 2220 tst R2
00B0 E1F3 breq L11
00B2 .dbline 37
00B2 ; data = SPI_rx_buff[rx_rd_index]; //从接收缓冲区取出一个SPI收到的数据
00B2 80E0 ldi R24,<_SPI_rx_buff
00B4 90E0 ldi R25,>_SPI_rx_buff
00B6 E0910800 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 38
00C2 ; if (++rx_rd_index == SIZE) rx_rd_index = 0; //调整指针
00C2 80910800 lds R24,_rx_rd_index
00C6 8F5F subi R24,255 ; addi 1
00C8 282E mov R2,R24
00CA 20920800 sts _rx_rd_index,R2
00CE 8436 cpi R24,100
00D0 19F4 brne L14
00D2 .dbline 38
00D2 2224 clr R2
00D4 20920800 sts _rx_rd_index,R2
00D8 L14:
00D8 .dbline 39
00D8 ; CLI();
00D8 F894 cli
00DA .dbline 40
00DA ; --rx_counter;
00DA 80910700 lds R24,_rx_counter
00DE 8150 subi R24,1
00E0 80930700 sts _rx_counter,R24
00E4 .dbline 41
00E4 ; SEI();
00E4 7894 sei
00E6 .dbline 42
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 46
00E8 ; }
00E8 ;
00E8 ; void putSPIchar(char c)
00E8 ; {
00E8 L17:
00E8 .dbline 47
00E8 L18:
00E8 .dbline 47
00E8 ; while (tx_counter == SIZE);//发送缓冲区满,等待
00E8 80910300 lds R24,_tx_counter
00EC 8436 cpi R24,100
00EE E1F3 breq L17
00F0 .dbline 48
00F0 ; CLI();
00F0 F894 cli
00F2 .dbline 49
00F2 ; if (tx_counter || (SPI_ok==0))//发送缓冲区已中有待发数据
00F2 8823 tst R24
00F4 21F4 brne L22
00F6 20900200 lds R2,_SPI_ok
00FA 2220 tst R2
00FC C9F4 brne L20
00FE L22:
00FE .dbline 50
00FE ; { //或SPI正在发送数据时
00FE .dbline 51
00FE ; SPI_tx_buff[tx_wr_index] = c; //将数据放入发送缓冲区排队
00FE 80E0 ldi R24,<_SPI_tx_buff
0100 90E0 ldi R25,>_SPI_tx_buff
0102 E0910500 lds R30,_tx_wr_index
0106 FF27 clr R31
0108 E80F add R30,R24
010A F91F adc R31,R25
010C 0083 std z+0,R16
010E .dbline 52
010E ; if (++tx_wr_index == SIZE) tx_wr_index = 0; //调整指针
010E 80910500 lds R24,_tx_wr_index
0112 8F5F subi R24,255 ; addi 1
0114 282E mov R2,R24
0116 20920500 sts _tx_wr_index,R2
011A 8436 cpi R24,100
011C 19F4 brne L23
011E .dbline 52
011E 2224 clr R2
0120 20920500 sts _tx_wr_index,R2
0124 L23:
0124 .dbline 53
0124 ; ++tx_counter;
0124 80910300 lds R24,_tx_counter
0128 8F5F subi R24,255 ; addi 1
012A 80930300 sts _tx_counter,R24
012E .dbline 54
012E ; }
012E 07C0 xjmp L21
0130 L20:
0130 .dbline 56
0130 ; else
0130 ; {
0130 .dbline 58
0130 ; //PORTB&=~BIT(SS);
0130 ; SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
0130 0FB9 out 0xf,R16
0132 .dbline 59
0132 ; temp=SPDR;
0132 2FB0 in R2,0xf
0134 20920000 sts _temp,R2
0138 .dbline 60
0138 ; SPI_ok=0;
0138 2224 clr R2
013A 20920200 sts _SPI_ok,R2
013E .dbline 61
013E ; }
013E L21:
013E .dbline 62
013E ; SEI();
013E 7894 sei
0140 .dbline -2
0140 L16:
0140 .dbline 0 ; func end
0140 0895 ret
0142 .dbsym r c 16 c
0142 .dbend
0142 .dbfunc e spi_init _spi_init fV
.even
0142 _spi_init::
0142 .dbline -1
0142 .dbline 67
0142 ; }
0142 ;
0142 ; //主机模式
0142 ; void spi_init(void)
0142 ; {
0142 .dbline 68
0142 ; DDRB |= BIT(MOSI)|BIT(SCK)|BIT(SS); //MISO=input and MOSI,SCK,SS = output
0142 87B3 in R24,0x17
0144 806B ori R24,176
0146 87BB out 0x17,R24
0148 .dbline 69
0148 ; DDRB &=~BIT(MISO);
0148 BE98 cbi 0x17,6
014A .dbline 70
014A ; PORTB|= BIT(SCK)|BIT(MOSI)|BIT(SS); //MISO上拉电阻有效
014A 88B3 in R24,0x18
014C 806B ori R24,176
014E 88BB out 0x18,R24
0150 .dbline 71
0150 ; SPCR = 0xD4; //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/4系统时钟速率
0150 84ED ldi R24,212
0152 8DB9 out 0xd,R24
0154 .dbline 72
0154 ; SPSR = 0x00;
0154 2224 clr R2
0156 2EB8 out 0xe,R2
0158 .dbline 73
0158 ; temp = SPSR;
0158 2EB0 in R2,0xe
015A 20920000 sts _temp,R2
015E .dbline 74
015E ; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
015E 2FB0 in R2,0xf
0160 20920000 sts _temp,R2
0164 .dbline 75
0164 ; SPI_ok=1;
0164 81E0 ldi R24,1
0166 80930200 sts _SPI_ok,R24
016A .dbline 76
016A ; SPI_datain=0;
016A 2224 clr R2
016C 20920100 sts _SPI_datain,R2
0170 .dbline -2
0170 L25:
0170 .dbline 0 ; func end
0170 0895 ret
0172 .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\IccAvr_Pro\SPI_master.c
0000 _temp::
0000 .blkb 1
0001 .dbsym e temp _temp c
0001 _SPI_datain::
0001 .blkb 1
0002 .dbsym e SPI_datain _SPI_datain c
0002 _SPI_ok::
0002 .blkb 1
0003 .dbsym e SPI_ok _SPI_ok c
0003 _tx_counter::
0003 .blkb 1
0004 .dbsym e tx_counter _tx_counter c
0004 _tx_rd_index::
0004 .blkb 1
0005 .dbsym e tx_rd_index _tx_rd_index c
0005 _tx_wr_index::
0005 .blkb 1
0006 .dbsym e tx_wr_index _tx_wr_index c
0006 _rx_buffer_overflow::
0006 .blkb 1
0007 .dbsym e rx_buffer_overflow _rx_buffer_overflow c
0007 _rx_counter::
0007 .blkb 1
0008 .dbsym e rx_counter _rx_counter c
0008 _rx_rd_index::
0008 .blkb 1
0009 .dbsym e rx_rd_index _rx_rd_index c
0009 _rx_wr_index::
0009 .blkb 1
000A .dbsym e rx_wr_index _rx_wr_index c
000A _SPI_tx_buff::
000A .blkb 100
006E .dbsym e SPI_tx_buff _SPI_tx_buff A[100:100]c
006E _SPI_rx_buff::
006E .blkb 100
00D2 .dbsym e SPI_rx_buff _SPI_rx_buff A[100:100]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -