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

📄 spi_master.lis

📁 用ICC编写的程序包括SPI
💻 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 + -