📄 spi.lis
字号:
00A8 8E7F andi R24,254
00AA 8EB9 out 0xe,R24
00AC L13:
00AC .dbline 112
00AC ;
00AC ; switch (s)
00AC 402F mov R20,R16
00AE 0023 tst R16
00B0 69F0 breq L19
00B2 X5:
00B2 0130 cpi R16,1
00B4 59F0 breq L19
00B6 X6:
00B6 0230 cpi R16,2
00B8 69F0 breq L20
00BA X7:
00BA 0330 cpi R16,3
00BC 59F0 breq L20
00BE X8:
00BE 0430 cpi R16,4
00C0 71F0 breq L21
00C2 X9:
00C2 0530 cpi R16,5
00C4 61F0 breq L21
00C6 X10:
00C6 0630 cpi R16,6
00C8 79F0 breq L22
00CA X11:
00CA 12C0 xjmp L16
00CC L19:
00CC .dbline 116
00CC ; {
00CC ; case 0:
00CC ; case 1:
00CC ; SPCR&=0xFC;
00CC 8DB1 in R24,0xd
00CE 8C7F andi R24,252
00D0 8DB9 out 0xd,R24
00D2 .dbline 117
00D2 ; break;
00D2 11C0 xjmp L17
00D4 L20:
00D4 .dbline 120
00D4 ; case 2:
00D4 ; case 3:
00D4 ; SPCR&=0xFC;
00D4 8DB1 in R24,0xd
00D6 8C7F andi R24,252
00D8 8DB9 out 0xd,R24
00DA .dbline 121
00DA ; SPCR|=0x01;
00DA 689A sbi 0xd,0
00DC .dbline 122
00DC ; break;
00DC 0CC0 xjmp L17
00DE L21:
00DE .dbline 125
00DE ; case 4:
00DE ; case 5:
00DE ; SPCR&=0xFC;
00DE 8DB1 in R24,0xd
00E0 8C7F andi R24,252
00E2 8DB9 out 0xd,R24
00E4 .dbline 126
00E4 ; SPCR|=0x02;
00E4 699A sbi 0xd,1
00E6 .dbline 127
00E6 ; break;
00E6 07C0 xjmp L17
00E8 L22:
00E8 .dbline 129
00E8 ; case 6:
00E8 ; SPCR|=0x03;
00E8 8DB1 in R24,0xd
00EA 8360 ori R24,3
00EC 8DB9 out 0xd,R24
00EE .dbline 130
00EE ; break;
00EE 03C0 xjmp L17
00F0 L16:
00F0 .dbline 132
00F0 ; default: //Wenn Wert ung黮tig ganz langsam
00F0 ; SPCR|=0x03;
00F0 8DB1 in R24,0xd
00F2 8360 ori R24,3
00F4 8DB9 out 0xd,R24
00F6 .dbline 133
00F6 ; break;
00F6 L17:
00F6 .dbline -2
00F6 L11:
00F6 .dbline 0 ; func end
00F6 4991 ld R20,y+
00F8 0895 ret
00FA .dbsym r s 16 c
00FA .dbend
00FA .dbfunc e spi_clock_pulse _spi_clock_pulse fV
.even
00FA _spi_clock_pulse::
00FA .dbline -1
00FA .dbline 194
00FA ; }
00FA ; #else
00FA ; /**
00FA ; Stellt die Geschwindigkeit des SPI-Busses ein (bei f=16MHz)
00FA ; 0: /4 4MHz
00FA ; 1 /8 2MHz -SPI2X
00FA ; 2: /16 1MHz
00FA ; 3 /32 500kHz -SPI2X
00FA ; 4: /64 250kHz
00FA ; 5 /128 125kHz -SPI2X
00FA ; 6: /128 62,5kHz
00FA ;
00FA ; weitere Geschwindigkeiten geplant
00FA ; -> dann per Software-SPI
00FA ; */
00FA ; if ((s==1)||(s==3))
00FA ; {
00FA ; SPSR|=1;
00FA ; }
00FA ; else
00FA ; {
00FA ; SPSR&=0xFE;
00FA ; }
00FA ;
00FA ; switch (s)
00FA ; {
00FA ; case 0:
00FA ; SPCR&=0xFC;
00FA ; break;
00FA ; case 1:
00FA ; SPCR&=0xFC;
00FA ; SPCR|=0x01;
00FA ; break;
00FA ; case 2:
00FA ; SPCR&=0xFC;
00FA ; SPCR|=0x01;
00FA ; break;
00FA ; case 3:
00FA ; SPCR&=0xFC;
00FA ; SPCR|=0x02;
00FA ; break;
00FA ; case 4:
00FA ; SPCR&=0xFC;
00FA ; SPCR|=0x02;
00FA ; break;
00FA ; case 5:
00FA ; SPCR|=0x03;
00FA ; break;
00FA ; case 6:
00FA ; SPCR|=0x03;
00FA ; break;
00FA ; default: //Wenn Wert ung黮tig ganz langsam
00FA ; SPCR|=0x03;
00FA ; break;
00FA ; }
00FA ;
00FA ; #endif
00FA ; }
00FA ;
00FA ; void spi_clock_pulse(void) //模拟SPI时钟
00FA ; {
00FA .dbline 195
00FA ; if (!use_sw_spi)
00FA 20900000 lds R2,_use_sw_spi
00FE 2220 tst R2
0100 29F4 brne L24
0102 X12:
0102 .dbline 196
0102 ; {
0102 .dbline 197
0102 ; SPCR&=BIT6_NEG; //SPI 使能关闭
0102 8FEB ldi R24,-65
0104 9FEF ldi R25,-1
0106 2DB0 in R2,0xd
0108 2822 and R2,R24
010A 2DB8 out 0xd,R2
010C .dbline 198
010C ; }
010C L24:
010C .dbline 200
010C ;
010C ; SCK_SET
010C C79A sbi 0x18,7
010E .dbline 202
010E ; //PORTB|=BIT5_POS; //SPI SCK impuls
010E ; wait_ms(2);
010E 02E0 ldi R16,2
0110 10E0 ldi R17,0
0112 0E940000 xcall _wait_ms
0116 .dbline 204
0116 ; //PORTB&=BIT5_NEG;
0116 ; SCK_CLEAR
0116 C798 cbi 0x18,7
0118 .dbline 206
0118 ;
0118 ; if (!use_sw_spi)
0118 20900000 lds R2,_use_sw_spi
011C 2220 tst R2
011E 09F4 brne L26
0120 X13:
0120 .dbline 207
0120 ; {
0120 .dbline 208
0120 ; SPCR|=BIT6_POS; //SPI 使能
0120 6E9A sbi 0xd,6
0122 .dbline 209
0122 ; }
0122 L26:
0122 .dbline -2
0122 L23:
0122 .dbline 0 ; func end
0122 0895 ret
0124 .dbend
0124 .dbfunc e spi_transfer_8 _spi_transfer_8 fc
0124 ; j -> y+0
0124 ; i0 -> R22
0124 ; result0 -> R20
0124 ; d -> R16
.even
0124 _spi_transfer_8::
0124 4A93 st -y,R20
0126 6A93 st -y,R22
0128 2297 sbiw R28,2
012A .dbline -1
012A .dbline 221
012A ; }
012A ;
012A ; /**
012A ; Does a 8 bit transfer over the SPI-Interface
012A ; and gives back the byte received
012A ;
012A ; @param d the byte to be transmitted
012A ;
012A ; @return the byte received
012A ; */
012A ; unsigned char spi_transfer_8(unsigned char d)
012A ; {
012A .dbline 222
012A ; if (!use_sw_spi)
012A 20900000 lds R2,_use_sw_spi
012E 2220 tst R2
0130 31F4 brne L29
0132 X14:
0132 .dbline 223
0132 ; {
0132 .dbline 224
0132 ; SPDR=d;
0132 0FB9 out 0xf,R16
0134 L31:
0134 .dbline 225
0134 ; while (!(SPSR&0x80));
0134 L32:
0134 .dbline 225
0134 8EB1 in R24,0xe
0136 8078 andi R24,128
0138 E9F3 breq L31
013A X15:
013A .dbline 227
013A ;
013A ; return SPDR;
013A 0FB1 in R16,0xf
013C 37C0 xjmp L28
013E L29:
013E .dbline 230
013E ; }
013E ; else
013E ; {
013E .dbline 231
013E ; unsigned char result=0,i;
013E 4427 clr R20
0140 .dbline 234
0140 ; volatile unsigned int j;
0140 ;
0140 ; for (i = 0; i < 8; i++)
0140 6627 clr R22
0142 30C0 xjmp L37
0144 L34:
0144 .dbline 235
0144 ; {
0144 .dbline 236
0144 ; if (d&0x80)
0144 802F mov R24,R16
0146 8078 andi R24,128
0148 11F0 breq L38
014A X16:
014A .dbline 237
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -