📄 spi.lis
字号:
008C .dbline 102
008C ; else
008C ; SPDR = c; //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
008C ; }
008C ;
008C ;
008C ; uint8 Spi_Receive(uint8 *buffer,uint16 length)
008C ; {
008C .dbline 104
008C ; uint16 i;
008C ; Spi_Receive_Buffer.status=SPI_DATA_RECEIVE;
008C 81E0 ldi R24,1
008E 80930700 sts _Spi_Receive_Buffer+7,R24
0092 .dbline 105
0092 ; for(i=0;i<length;i++)
0092 4427 clr R20
0094 5527 clr R21
0096 06C0 xjmp L37
0098 L34:
0098 .dbline 106
0098 .dbline 107
0098 D2DF xcall _Spi_Get_Char
009A F501 movw R30,R10
009C 0193 st Z+,R16
009E 5F01 movw R10,R30
00A0 .dbline 108
00A0 L35:
00A0 .dbline 105
00A0 4F5F subi R20,255 ; offset = 1
00A2 5F4F sbci R21,255
00A4 L37:
00A4 .dbline 105
00A4 4617 cp R20,R22
00A6 5707 cpc R21,R23
00A8 B8F3 brlo L34
00AA .dbline 109
00AA ; {
00AA ; *buffer++=Spi_Get_Char();
00AA ; }
00AA ; Spi_Receive_Buffer.status=SPI_DATA_FREE;
00AA 2224 clr R2
00AC 20920700 sts _Spi_Receive_Buffer+7,R2
00B0 .dbline 110
00B0 ; return i;
00B0 042F mov R16,R20
00B2 .dbline -2
00B2 L32:
00B2 0E940000 xcall pop_gset3
00B6 .dbline 0 ; func end
00B6 0895 ret
00B8 .dbsym r i 20 i
00B8 .dbsym r length 22 i
00B8 .dbsym r buffer 10 pc
00B8 .dbend
00B8 .dbfunc e Spi_Send _Spi_Send fc
00B8 ; i -> R20,R21
00B8 ; length -> R22,R23
00B8 ; buffer -> R10,R11
.even
00B8 _Spi_Send::
00B8 0E940000 xcall push_gset3
00BC B901 movw R22,R18
00BE 5801 movw R10,R16
00C0 .dbline -1
00C0 .dbline 114
00C0 ; }
00C0 ;
00C0 ; uint8 Spi_Send(uint8 *buffer,uint16 length)
00C0 ; {
00C0 .dbline 116
00C0 ; uint16 i;
00C0 ; Spi_Send_Buffer.status=SPI_DATA_SEND;
00C0 82E0 ldi R24,2
00C2 80931000 sts _Spi_Send_Buffer+7,R24
00C6 .dbline 117
00C6 ; for(i=0;i<length;i++)
00C6 4427 clr R20
00C8 5527 clr R21
00CA 06C0 xjmp L44
00CC L41:
00CC .dbline 118
00CC .dbline 119
00CC F501 movw R30,R10
00CE 0191 ld R16,Z+
00D0 5F01 movw R10,R30
00D2 C3DF xcall _Spi_Put_Char
00D4 .dbline 120
00D4 L42:
00D4 .dbline 117
00D4 4F5F subi R20,255 ; offset = 1
00D6 5F4F sbci R21,255
00D8 L44:
00D8 .dbline 117
00D8 4617 cp R20,R22
00DA 5707 cpc R21,R23
00DC B8F3 brlo L41
00DE .dbline 121
00DE ; {
00DE ; Spi_Put_Char(*buffer++);
00DE ; }
00DE ; Spi_Send_Buffer.status=SPI_DATA_FREE;
00DE 2224 clr R2
00E0 20921000 sts _Spi_Send_Buffer+7,R2
00E4 .dbline 122
00E4 ; return i;
00E4 042F mov R16,R20
00E6 .dbline -2
00E6 L39:
00E6 0E940000 xcall pop_gset3
00EA .dbline 0 ; func end
00EA 0895 ret
00EC .dbsym r i 20 i
00EC .dbsym r length 22 i
00EC .dbsym r buffer 10 pc
00EC .dbend
00EC .dbfunc e Spi_SendReceive _Spi_SendReceive fc
00EC ; ptr -> R22,R23
00EC ; i -> R20,R21
00EC ; receivelength -> R10,R11
00EC ; sendlength -> R12,R13
00EC ; buffer -> R14,R15
.even
00EC _Spi_SendReceive::
00EC 0E940000 xcall push_gset5
00F0 6901 movw R12,R18
00F2 7801 movw R14,R16
00F4 AA84 ldd R10,y+10
00F6 BB84 ldd R11,y+11
00F8 .dbline -1
00F8 .dbline 126
00F8 ; }
00F8 ;
00F8 ; uint8 Spi_SendReceive(uint8 *buffer,uint16 sendlength,uint16 receivelength)
00F8 ; {
00F8 .dbline 129
00F8 ; uint16 i;
00F8 ; uint8 *ptr;
00F8 ; ptr=buffer;
00F8 B701 movw R22,R14
00FA .dbline 130
00FA ; if (receivelength!=0)
00FA AA20 tst R10
00FC 11F4 brne X0
00FE BB20 tst R11
0100 19F0 breq L47
0102 X0:
0102 .dbline 131
0102 ; {
0102 .dbline 132
0102 ; Spi_Receive_Buffer.status=SPI_DATA_RECEIVE;
0102 81E0 ldi R24,1
0104 80930700 sts _Spi_Receive_Buffer+7,R24
0108 .dbline 133
0108 ; }
0108 L47:
0108 .dbline 134
0108 ; Spi_Send_Buffer.status=SPI_DATA_SEND;
0108 82E0 ldi R24,2
010A 80931000 sts _Spi_Send_Buffer+7,R24
010E .dbline 135
010E ; for(i=0;i<sendlength;i++)
010E 4427 clr R20
0110 5527 clr R21
0112 06C0 xjmp L54
0114 L51:
0114 .dbline 136
0114 .dbline 137
0114 FB01 movw R30,R22
0116 0191 ld R16,Z+
0118 BF01 movw R22,R30
011A 9FDF xcall _Spi_Put_Char
011C .dbline 138
011C L52:
011C .dbline 135
011C 4F5F subi R20,255 ; offset = 1
011E 5F4F sbci R21,255
0120 L54:
0120 .dbline 135
0120 4C15 cp R20,R12
0122 5D05 cpc R21,R13
0124 B8F3 brlo L51
0126 .dbline 139
0126 ; {
0126 ; Spi_Put_Char(*ptr++);
0126 ; }
0126 ; ptr=buffer;
0126 B701 movw R22,R14
0128 .dbline 140
0128 ; for(i=0;(i<receivelength)&&(i<sendlength);i++)
0128 4427 clr R20
012A 5527 clr R21
012C 06C0 xjmp L58
012E L55:
012E .dbline 141
012E .dbline 142
012E 87DF xcall _Spi_Get_Char
0130 FB01 movw R30,R22
0132 0193 st Z+,R16
0134 BF01 movw R22,R30
0136 .dbline 143
0136 L56:
0136 .dbline 140
0136 4F5F subi R20,255 ; offset = 1
0138 5F4F sbci R21,255
013A L58:
013A .dbline 140
013A 4A15 cp R20,R10
013C 5B05 cpc R21,R11
013E 18F4 brsh L59
0140 4C15 cp R20,R12
0142 5D05 cpc R21,R13
0144 A0F3 brlo L55
0146 L59:
0146 .dbline 144
0146 ; {
0146 ; *ptr++=Spi_Get_Char();
0146 ; }
0146 ; Spi_Send_Buffer.status=SPI_DATA_FREE;
0146 2224 clr R2
0148 20921000 sts _Spi_Send_Buffer+7,R2
014C .dbline 145
014C ; Spi_Receive_Buffer.status=SPI_DATA_FREE;
014C 20920700 sts _Spi_Receive_Buffer+7,R2
0150 .dbline 146
0150 ; return i;
0150 042F mov R16,R20
0152 .dbline -2
0152 L46:
0152 0E940000 xcall pop_gset5
0156 .dbline 0 ; func end
0156 0895 ret
0158 .dbsym r ptr 22 pc
0158 .dbsym r i 20 i
0158 .dbsym r receivelength 10 i
0158 .dbsym r sendlength 12 i
0158 .dbsym r buffer 14 pc
0158 .dbend
0158 .dbfunc e Spi_Init _Spi_Init fV
0158 ; temp -> R16
.even
0158 _Spi_Init::
0158 .dbline -1
0158 .dbline 151
0158 ; }
0158 ;
0158 ;
0158 ; void Spi_Init(void)
0158 ; {
0158 .dbline 178
0158 ; uint8 temp;
0158 ;
0158 ; #if (CPU_TYPE == M32)|| (CPU_TYPE == M16) // MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4
0158 ; #define DDR_SPI DDRB
0158 ; #define PORT_SPI PORTB
0158 ; #define DD_MOSI 5
0158 ; #define DD_MISO 6
0158 ; #define DD_SCK 7
0158 ; #define DD_SS 4
0158 ; #endif
0158 ; #if CPU_TYPE == M8 // MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4
0158 ; #define DDR_SPI DDRB
0158 ; #define PORT_SPI PORTB
0158 ; #define DD_MOSI 3
0158 ; #define DD_MISO 4
0158 ; #define DD_SCK 5
0158 ; #define DD_SS 2
0158 ; #endif
0158 ; #if (CPU_TYPE == M128)||(CPU_TYPE == M64 ) // MISO-PB6,MOSI-PB5,SCK-PB7,SS-PB4
0158 ; #define DDR_SPI DDRB
0158 ; #define PORT_SPI PORTB
0158 ; #define DD_MOSI 2
0158 ; #define DD_MISO 3
0158 ; #define DD_SCK 1
0158 ; #define DD_SS 0
0158 ; #endif
0158 ; DDR_SPI = DDR_SPI|(1<<DD_SS)|(1<<DD_MOSI)|(1<<DD_SCK); //MISO=input and MOSI,SCK,SS = output
0158 87B3 in R24,0x17
015A 806B ori R24,176
015C 87BB out 0x17,R24
015E .dbline 179
015E ; PORTB |=(1<<DD_MISO)|(1<<DD_SS); //MISO上拉电阻有效
015E 88B3 in R24,0x18
0160 8065 ori R24,80
0162 88BB out 0x18,R24
0164 .dbline 180
0164 ; SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR); //SPI允许,4X 主机模式,MSB先发,SPI模式0 (CPOL CPHA 00(0) 01(1) 10(2) 11(3))
0164 80ED ldi R24,208
0166 8DB9 out 0xd,R24
0168 .dbline 182
0168 ; // SPSR = 0;
0168 ; SPSR = (1<<SPI2X); //enable spi2x
0168 81E0 ldi R24,1
016A 8EB9 out 0xe,R24
016C .dbline 183
016C ; temp = SPSR;
016C 0EB1 in R16,0xe
016E .dbline 184
016E ; temp = SPDR; //清空SPI,和中断标志,使SPI空闲
016E 0FB1 in R16,0xf
0170 .dbline -2
0170 L62:
0170 .dbline 0 ; func end
0170 0895 ret
0172 .dbsym r temp 16 c
0172 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\桌面\mp3\SPI\spi.c
0000 _Spi_Send_Data:
0000 .blkb 10
000A .dbsym s Spi_Send_Data _Spi_Send_Data A[10:10]c
000A _Spi_Receive_Data:
000A .blkb 255
0109 .dbsym s Spi_Receive_Data _Spi_Receive_Data A[255:255]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -