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

📄 spi.lis

📁 用AVR端口模拟SPI和AD9517的通信
💻 LIS
字号:
                        .module spi.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\avr_first\spi.c
 0000                   .dbfunc e spisend _spisend fV
 0000           ;              i -> R20
 0000           ;           data -> R16
                        .even
 0000           _spisend::
 0000 00D0              rcall push_gset1
 0002                   .dbline -1
 0002                   .dbline 26
 0002           ; #include <iom48v.h>
 0002           ; #include <macros.h>
 0002           ; 
 0002           ; #define uint unsigned  int
 0002           ; #define ulong unsigned long
 0002           ; #define uchar unsigned char
 0002           ; 
 0002           ; #define clk       PD0//AD_clk
 0002           ; #define data_IO   PD1//AD数据输入输出口
 0002           ; #define cs        PD2//AD片选
 0002           ; 
 0002           ; #define IO_DDR    DDD1//数据读入读出口 
 0002           ; 
 0002           ; #define IO_PIN    PIND
 0002           ; 
 0002           ; //#define clk_s       PD3
 0002           ; //#define ss_s        PD4
 0002           ; //#define data_s      PD5
 0002           ; //#define data_sPIN   PIND5
 0002           ; //#define data_sDDR   DDD5
 0002           ; 
 0002           ; 
 0002           ; 
 0002           ; 
 0002           ; void spisend(uchar data)//写入
 0002           ; {   
 0002                   .dbline 29
 0002           ;     uchar i; 
 0002           ;     //IO_DDR=1;
 0002           ;       DDRD |= 0x02;
 0002 519A              sbi 0xa,1
 0004                   .dbline 31
 0004           ;     //clk=0;
 0004           ;       PORTD &= 0xfe;
 0004 8BB1              in R24,0xb
 0006 8E7F              andi R24,254
 0008 8BB9              out 0xb,R24
 000A                   .dbline 32
 000A           ;     for(i=8;i>0;i--)
 000A 48E0              ldi R20,8
 000C 10C0              rjmp L5
 000E           L2:
 000E                   .dbline 33
 000E           ;  {
 000E                   .dbline 34
 000E           ;   if ((data&0x01)==1)
 000E 802F              mov R24,R16
 0010 8170              andi R24,1
 0012 8130              cpi R24,1
 0014 11F4              brne L6
 0016                   .dbline 35
 0016           ;    { 
 0016                   .dbline 37
 0016           ;    //data_IO=1;
 0016           ;    PORTD |= 0x02;
 0016 599A              sbi 0xb,1
 0018                   .dbline 38
 0018           ;    }
 0018 03C0              rjmp L7
 001A           L6:
 001A                   .dbline 41
 001A           ;   else 
 001A           ;    //data_IO=0;
 001A           ;    PORTD &= 0xFD;
 001A 8BB1              in R24,0xb
 001C 8D7F              andi R24,253
 001E 8BB9              out 0xb,R24
 0020           L7:
 0020                   .dbline 42
 0020 0000              nop
 0022                   .dbline 44
 0022 589A              sbi 0xb,0
 0024                   .dbline 47
 0024 8BB1              in R24,0xb
 0026 8E7F              andi R24,254
 0028 8BB9              out 0xb,R24
 002A                   .dbline 48
 002A 0695              lsr R16
 002C                   .dbline 49
 002C           L3:
 002C                   .dbline 32
 002C 4A95              dec R20
 002E           L5:
 002E                   .dbline 32
 002E 2224              clr R2
 0030 2416              cp R2,R20
 0032 68F3              brlo L2
 0034                   .dbline -2
 0034           L1:
 0034 00D0              rcall pop_gset1
 0036                   .dbline 0 ; func end
 0036 0895              ret
 0038                   .dbsym r i 20 c
 0038                   .dbsym r data 16 c
 0038                   .dbend
 0038                   .dbfunc e spiread _spiread fc
 0038           ;           data -> R20
 0038           ;           temp -> R22
 0038           ;              i -> R10
                        .even
 0038           _spiread::
 0038 00D0              rcall push_gset3
 003A                   .dbline -1
 003A                   .dbline 53
 003A           ;    _NOP();
 003A           ;   //clk=1;
 003A           ;   PORTD |= 0x01;
 003A           ;  //_NOP(); 
 003A           ;   //clk=0;
 003A           ;   PORTD &= 0xfe;   
 003A           ;   data>>=1;//右移一位
 003A           ;  } 
 003A           ; } 
 003A           ; 
 003A           ; uchar spiread(void) //读取
 003A           ; {
 003A                   .dbline 55
 003A           ;  uchar i;
 003A           ;  uchar data=0x00; 
 003A 4427              clr R20
 003C                   .dbline 58
 003C           ;  uchar temp;  
 003C           ;  //IO_DDR=0;  //IO口作为输入,DDR要写0
 003C           ;  DDRD &= 0xfd;  
 003C 8AB1              in R24,0xa
 003E 8D7F              andi R24,253
 0040 8AB9              out 0xa,R24
 0042                   .dbline 61
 0042           ;  //ss_r=0;
 0042           ;  //clk=0; 
 0042           ;  PORTD &= 0xfe;    
 0042 8BB1              in R24,0xb
 0044 8E7F              andi R24,254
 0046 8BB9              out 0xb,R24
 0048                   .dbline 62
 0048           ;  for(i=0;i<8;i++)
 0048 AA24              clr R10
 004A 0CC0              rjmp L12
 004C           L9:
 004C                   .dbline 63
 004C           ;  {   
 004C                   .dbline 65
 004C           ;   //clk=1;
 004C           ;   PORTD |= 0x01; 
 004C 589A              sbi 0xb,0
 004E                   .dbline 67
 004E           ;   //clk=0;
 004E           ;   PORTD &= 0xfe;       
 004E 8BB1              in R24,0xb
 0050 8E7F              andi R24,254
 0052 8BB9              out 0xb,R24
 0054                   .dbline 68
 0054           ;   temp=IO_PIN; 
 0054 69B1              in R22,0x9
 0056                   .dbline 69
 0056           ;         if (temp&0x02)       //下降沿采集数据,调换则会出错 
 0056 61FF              sbrs R22,1
 0058 04C0              rjmp L13
 005A                   .dbline 70
 005A           ;  data|=(0x01<<i);
 005A 01E0              ldi R16,1
 005C 1A2D              mov R17,R10
 005E 00D0              rcall lsl8
 0060 402B              or R20,R16
 0062           L13:
 0062                   .dbline 71
 0062           L10:
 0062                   .dbline 62
 0062 A394              inc R10
 0064           L12:
 0064                   .dbline 62
 0064 8A2D              mov R24,R10
 0066 8830              cpi R24,8
 0068 88F3              brlo L9
 006A                   .dbline 73
 006A           ;  } 
 006A           ;  //IO_DDR=1;
 006A           ;  DDRD |= 0x02;
 006A 519A              sbi 0xa,1
 006C                   .dbline 76
 006C           ;  //ss_r=1;  //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
 006C           ; // clk=1;
 006C           ; PORTD |= 0x01; 
 006C 589A              sbi 0xb,0
 006E                   .dbline 77
 006E           ; return(data);
 006E 042F              mov R16,R20
 0070                   .dbline -2
 0070           L8:
 0070 00D0              rcall pop_gset3
 0072                   .dbline 0 ; func end
 0072 0895              ret
 0074                   .dbsym r data 20 c
 0074                   .dbsym r temp 22 c
 0074                   .dbsym r i 10 c
 0074                   .dbend
                        .area lit(rom, con, rel)
 0000           L16:
 0000 0000              .byte 0,0
 0002 0000              .byte 0,0
 0004           L17:
 0004 0000              .byte 0,0
                        .area text(rom, con, rel)
 0074                   .dbfile E:\avr_first\spi.c
 0074                   .dbfunc e main _main fV
 0074           ;           data -> y+2
 0074           ;     instrution -> y+0
 0074           ;              j -> R20,R21
 0074           ;              i -> R22,R23
 0074           ;        spidata -> y+6
                        .even
 0074           _main::
 0074 2697              sbiw R28,6
 0076                   .dbline -1
 0076                   .dbline 81
 0076           ; }
 0076           ; 
 0076           ; void main(ulong spidata)
 0076           ; {
 0076                   .dbline 83
 0076           ;  uint i,j;
 0076           ;  uchar data[4]={0,0,0,0};
 0076 80E0              ldi R24,<L16
 0078 90E0              ldi R25,>L16
 007A FE01              movw R30,R28
 007C 3296              adiw R30,2
 007E 04E0              ldi R16,4
 0080 10E0              ldi R17,0
 0082 FA93              st -y,R31
 0084 EA93              st -y,R30
 0086 9A93              st -y,R25
 0088 8A93              st -y,R24
 008A 00D0              rcall asgncblk
 008C                   .dbline 84
 008C           ;  uchar instrution[2]={0,0};
 008C 80E0              ldi R24,<L17
 008E 90E0              ldi R25,>L17
 0090 FE01              movw R30,R28
 0092 02E0              ldi R16,2
 0094 10E0              ldi R17,0
 0096 FA93              st -y,R31
 0098 EA93              st -y,R30
 009A 9A93              st -y,R25
 009C 8A93              st -y,R24
 009E 00D0              rcall asgncblk
 00A0                   .dbline 97
 00A0           ;  /*PORTA="0x00";   //灯指示
 00A0           ;  DDRA="0XFF";
 00A0           ;  
 00A0           ; PORTB="0x00";//0101 0000
 00A0           ;  DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
 00A0           ;  
 00A0           ;  PORTC="0x00";
 00A0           ;  DDRC="0x80";
 00A0           ; 
 00A0           ;  DDRD="0xff";//0000 0001 
 00A0           ; PORTD="0x00";*///0100 1000 
 00A0           ;     //cs = 0;
 00A0           ;       PORTD &= 0xfc;
 00A0 8BB1              in R24,0xb
 00A2 8C7F              andi R24,252
 00A4 8BB9              out 0xb,R24
 00A6                   .dbline 98
 00A6           ;     for(i=0;i<2;i++)
 00A6 6627              clr R22
 00A8 7727              clr R23
 00AA 08C0              rjmp L21
 00AC           L18:
 00AC                   .dbline 99
 00AC                   .dbline 100
 00AC CE01              movw R24,R28
 00AE FB01              movw R30,R22
 00B0 E80F              add R30,R24
 00B2 F91F              adc R31,R25
 00B4 0081              ldd R16,z+0
 00B6 A4DF              rcall _spisend
 00B8                   .dbline 101
 00B8           L19:
 00B8                   .dbline 98
 00B8 6F5F              subi R22,255  ; offset = 1
 00BA 7F4F              sbci R23,255
 00BC           L21:
 00BC                   .dbline 98
 00BC 6230              cpi R22,2
 00BE E0E0              ldi R30,0
 00C0 7E07              cpc R23,R30
 00C2 A0F3              brlo L18
 00C4                   .dbline 102
 00C4           ;         {
 00C4           ;            spisend(instrution[i]);
 00C4           ;         }
 00C4           ;     if(instrution[0]&0x8000)
 00C4 2880              ldd R2,y+0
 00C6 3324              clr R3
 00C8 37FE              sbrs R3,7
 00CA 11C0              rjmp L22
 00CC                   .dbline 103
 00CC           ;          {
 00CC                   .dbline 104
 00CC           ;           for(j=0;j<4;j++)
 00CC 4427              clr R20
 00CE 5527              clr R21
 00D0 09C0              rjmp L27
 00D2           L24:
 00D2                   .dbline 105
 00D2                   .dbline 106
 00D2 B2DF              rcall _spiread
 00D4 CE01              movw R24,R28
 00D6 0296              adiw R24,2
 00D8 FA01              movw R30,R20
 00DA E80F              add R30,R24
 00DC F91F              adc R31,R25
 00DE 0083              std z+0,R16
 00E0                   .dbline 107
 00E0           L25:
 00E0                   .dbline 104
 00E0 4F5F              subi R20,255  ; offset = 1
 00E2 5F4F              sbci R21,255
 00E4           L27:
 00E4                   .dbline 104
 00E4 4430              cpi R20,4
 00E6 E0E0              ldi R30,0
 00E8 5E07              cpc R21,R30
 00EA 98F3              brlo L24
 00EC                   .dbline 108
 00EC           ;                  {
 00EC           ;                   data[j]=spiread();
 00EC           ;                  }
 00EC           ;          }
 00EC 10C0              rjmp L23
 00EE           L22:
 00EE                   .dbline 109
 00EE           ;      else  {
 00EE                   .dbline 110
 00EE           ;           for(j=0;j<4;j++)
 00EE 4427              clr R20
 00F0 5527              clr R21
 00F2 09C0              rjmp L31
 00F4           L28:
 00F4                   .dbline 111
 00F4                   .dbline 112
 00F4 CE01              movw R24,R28
 00F6 0296              adiw R24,2
 00F8 FB01              movw R30,R22
 00FA E80F              add R30,R24
 00FC F91F              adc R31,R25
 00FE 0081              ldd R16,z+0
 0100 7FDF              rcall _spisend
 0102                   .dbline 113
 0102           L29:
 0102                   .dbline 110
 0102 4F5F              subi R20,255  ; offset = 1
 0104 5F4F              sbci R21,255
 0106           L31:
 0106                   .dbline 110
 0106 4430              cpi R20,4
 0108 E0E0              ldi R30,0
 010A 5E07              cpc R21,R30
 010C 98F3              brlo L28
 010E                   .dbline 114
 010E           ;                  {
 010E           ;                   spisend(data[i]);
 010E           ;                  }
 010E           ;             }
 010E           L23:
 010E                   .dbline 116
 010E           ;     // cs = 1;
 010E           ;       PORTD |= 0x40;
 010E 5E9A              sbi 0xb,6
 0110                   .dbline -2
 0110           L15:
 0110 2696              adiw R28,6
 0112                   .dbline 0 ; func end
 0112 0895              ret
 0114                   .dbsym l data 2 A[4:4]c
 0114                   .dbsym l instrution 0 A[2:2]c
 0114                   .dbsym r j 20 i
 0114                   .dbsym r i 22 i
 0114                   .dbsym l spidata 6 l
 0114                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -