📄 m16_vs1003_test.lst
字号:
0778 9ADC SBI 0x1B,4
0779 9508 RET
FILE: C:\AVR\M\1\sd.c
(0001)
(0002) #include"sd.h"
(0003) #include"Usart.h"
(0004)
(0005)
(0006) //---------------------------------
(0007) //
(0008) // SD卡接口初始化函数
(0009) //
(0010) //---------------------------------
(0011) void SD_Port_Init(void)
(0012) {
(0013) SD_CS_DDR |= 1<<SD_CS_BIT;
_SD_Port_Init:
077A 9AD1 SBI 0x1A,1
(0014) SD_CS_PORT |= 1<<SD_CS_BIT;
077B 9AD9 SBI 0x1B,1
077C 9508 RET
_SD_SendCommand:
retry --> R22
r1 --> R20
arg --> Y+6
cmd --> R10
077D 933A ST R19,-Y
077E 932A ST R18,-Y
077F 940E1426 CALL push_gset3
0781 2EA0 MOV R10,R16
(0015) }
(0016)
(0017)
(0018)
(0019) //---------------------------------
(0020) //
(0021) // SD卡写寄存器函数
(0022) // arg:命令
(0023) // cmd:命令号
(0024) //
(0025) //---------------------------------
(0026) uint8 SD_SendCommand(uint8 cmd, uint32 arg)
(0027) {
(0028) uint8 r1=1;
0782 E041 LDI R20,1
(0029) uint8 retry=0;
0783 2766 CLR R22
(0030)
(0031)
(0032) SPI_SrByte(0xff);
0784 EF0F LDI R16,0xFF
0785 940E08FF CALL _SPI_SrByte
(0033) SPI_CS_Assert;
0787 98D9 CBI 0x1B,1
(0034) while(r1--);
0788 2E24 MOV R2,R20
0789 2433 CLR R3
078A 5041 SUBI R20,1
078B 2022 TST R2
078C F7D9 BNE 0x0788
(0035)
(0036) SPI_SrByte((cmd & 0x3f) | 0x40); /* send command */
078D 2D0A MOV R16,R10
078E 730F ANDI R16,0x3F
078F 6400 ORI R16,0x40
0790 940E08FF CALL _SPI_SrByte
(0037)
(0038) SPI_SrByte(arg>>24);
0792 E188 LDI R24,0x18
0793 E090 LDI R25,0
0794 01FE MOVW R30,R28
0795 8026 LDD R2,Z+6
0796 8037 LDD R3,Z+7
0797 8440 LDD R4,Z+8
0798 8451 LDD R5,Z+9
0799 938A ST R24,-Y
079A 0181 MOVW R16,R2
079B 0192 MOVW R18,R4
079C 940E1479 CALL lsr32
079E 940E08FF CALL _SPI_SrByte
(0039) SPI_SrByte(arg>>16);
07A0 01FE MOVW R30,R28
07A1 8026 LDD R2,Z+6
07A2 8037 LDD R3,Z+7
07A3 8440 LDD R4,Z+8
07A4 8451 LDD R5,Z+9
07A5 0112 MOVW R2,R4
07A6 2444 CLR R4
07A7 2455 CLR R5
07A8 2D02 MOV R16,R2
07A9 940E08FF CALL _SPI_SrByte
(0040) SPI_SrByte(arg>>8);
07AB E088 LDI R24,0x8
07AC E090 LDI R25,0
07AD 01FE MOVW R30,R28
07AE 8026 LDD R2,Z+6
07AF 8037 LDD R3,Z+7
07B0 8440 LDD R4,Z+8
07B1 8451 LDD R5,Z+9
07B2 938A ST R24,-Y
07B3 0181 MOVW R16,R2
07B4 0192 MOVW R18,R4
07B5 940E1479 CALL lsr32
07B7 940E08FF CALL _SPI_SrByte
(0041) SPI_SrByte(arg);
07B9 01FE MOVW R30,R28
07BA 8106 LDD R16,Z+6
07BB 940E08FF CALL _SPI_SrByte
(0042)
(0043) SPI_SrByte(0x95);
07BD E905 LDI R16,0x95
07BE 940E08FF CALL _SPI_SrByte
(0044)
(0045) SPI_SrByte(0xff);
07C0 EF0F LDI R16,0xFF
07C1 940E08FF CALL _SPI_SrByte
07C3 C007 RJMP 0x07CB
(0046) while((r1 = SPI_SrByte(0xff)) == 0xff) /* wait response */
(0047) if(retry++ > 0xfe) break; /* time out error */
07C4 2E26 MOV R2,R22
07C5 2433 CLR R3
07C6 5F6F SUBI R22,0xFF
07C7 EF8E LDI R24,0xFE
07C8 1582 CP R24,R2
07C9 F408 BCC 0x07CB
07CA C006 RJMP 0x07D1
07CB EF0F LDI R16,0xFF
07CC 940E08FF CALL _SPI_SrByte
07CE 2F40 MOV R20,R16
07CF 3F4F CPI R20,0xFF
07D0 F399 BEQ 0x07C4
(0048)
(0049) SPI_CS_Deassert;
07D1 9AD9 SBI 0x1B,1
(0050) SPI_SrByte(0xff); // extra 8 CLK
07D2 EF0F LDI R16,0xFF
07D3 940E08FF CALL _SPI_SrByte
(0051)
(0052) return r1; /* return state */
07D5 2F04 MOV R16,R20
07D6 940E1419 CALL pop_gset3
07D8 9622 ADIW R28,2
07D9 9508 RET
_SD_Init:
retry --> R10
r1 --> R12
i --> R14
07DA 940E1422 CALL push_gset5
07DC 9722 SBIW R28,2
(0053) }
(0054)
(0055)
(0056) //---------------------------------
(0057) //
(0058) // SD卡初始化函数
(0059) //
(0060) //---------------------------------
(0061) uint8 SD_Init(void)
(0062) {
(0063)
(0064) uint8 i;
(0065) uint8 retry = 0;
07DD 24AA CLR R10
(0066) uint8 r1 = 0;
07DE 24CC CLR R12
(0067)
(0068) SD_Port_Init();
07DF DF9A RCALL _SD_Port_Init
(0069)
(0070) SPI_CS_Assert;
07E0 98D9 CBI 0x1B,1
(0071) delay_ms(1);
07E1 E001 LDI R16,1
07E2 E010 LDI R17,0
07E3 E020 LDI R18,0
07E4 E030 LDI R19,0
07E5 940E1103 CALL _delay_ms
(0072) SPI_CS_Deassert;
07E7 9AD9 SBI 0x1B,1
(0073) delay_ms(1);
07E8 E001 LDI R16,1
07E9 E010 LDI R17,0
07EA E020 LDI R18,0
07EB E030 LDI R19,0
07EC 940E1103 CALL _delay_ms
(0074)
(0075)
(0076) SPI_Low();
07EE 940E08F6 CALL _SPI_Low
(0077)
(0078) do
(0079) {
(0080) for(i=0;i<10;i++) SPI_SrByte(0xff);
07F0 24EE CLR R14
07F1 C004 RJMP 0x07F6
07F2 EF0F LDI R16,0xFF
07F3 940E08FF CALL _SPI_SrByte
07F5 94E3 INC R14
07F6 2D8E MOV R24,R14
07F7 308A CPI R24,0xA
07F8 F3C8 BCS 0x07F2
(0081) r1 = SD_SendCommand(0, 0);//发idle命令 //send idle command
07F9 E040 LDI R20,0
07FA E050 LDI R21,0
07FB E060 LDI R22,0
07FC E070 LDI R23,0
07FD 8368 STD Y+0,R22
07FE 8379 STD Y+1,R23
07FF 019A MOVW R18,R20
0800 2700 CLR R16
0801 DF7B RCALL _SD_SendCommand
0802 2EC0 MOV R12,R16
(0082) retry++;
0803 94A3 INC R10
(0083) if(retry>0xfe) return 1;//超时退出 //time out
0804 EF8E LDI R24,0xFE
0805 158A CP R24,R10
0806 F410 BCC 0x0809
0807 E001 LDI R16,1
0808 C02C RJMP 0x0835
(0084) } while(r1 != 0x01);
0809 2D8C MOV R24,R12
080A 3081 CPI R24,1
080B F721 BNE 0x07F0
(0085)
(0086)
(0087) retry = 0;
080C 24AA CLR R10
(0088) do
(0089) {
(0090) r1 = SD_SendCommand(1, 0);//发active命令 //send active command
080D E040 LDI R20,0
080E E050 LDI R21,0
080F E060 LDI R22,0
0810 E070 LDI R23,0
0811 8368 STD Y+0,R22
0812 8379 STD Y+1,R23
0813 019A MOVW R18,R20
0814 E001 LDI R16,1
0815 DF67 RCALL _SD_SendCommand
0816 2EC0 MOV R12,R16
(0091) retry++;
0817 94A3 INC R10
(0092) if(retry>0xfe) return 1;//超时退出 //time out
0818 EF8E LDI R24,0xFE
0819 158A CP R24,R10
081A F410 BCC 0x081D
081B E001 LDI R16,1
081C C018 RJMP 0x0835
(0093) } while(r1);
081D 20CC TST R12
081E F771 BNE 0x080D
(0094)
(0095) SPI_High(); /* Use High Speed SPI*/
081F 940E08FB CALL _SPI_High
(0096)
(0097) r1 = SD_SendCommand(59, 0);//关crc //disable CRC
0821 E040 LDI R20,0
0822 E050 LDI R21,0
0823 E060 LDI R22,0
0824 E070 LDI R23,0
0825 8368 STD Y+0,R22
0826 8379 STD Y+1,R23
0827 019A MOVW R18,R20
0828 E30B LDI R16,0x3B
0829 DF53 RCALL _SD_SendCommand
(0098)
(0099) r1 = SD_SendCommand(16, 512);//设扇区大小512 //set sector size to 512
082A E040 LDI R20,0
082B E052 LDI R21,2
082C E060 LDI R22,0
082D E070 LDI R23,0
082E 8368 STD Y+0,R22
082F 8379 STD Y+1,R23
0830 019A MOVW R18,R20
0831 E100 LDI R16,0x10
0832 DF4A RCALL _SD_SendCommand
0833 2EC0 MOV R12,R16
(0100) return 0;//正常返回 //normal return
0834 2700 CLR R16
0835 9622 ADIW R28,2
0836 940E141F CALL pop_gset5
0838 9508 RET
_SD_ReadBlock:
r1 --> R10
retry --> R22
i --> R10
buffer --> R20
sector --> Y+8
0839 940E132C CALL push_arg4
083B 940E1426 CALL push_gset3
083D 9722 SBIW R28,2
083E 854C LDD R20,Y+12
083F 855D LDD R21,Y+13
(0101) }
(0102)
(0103)
(0104)
(0105) //---------------------------------------------
(0106) //
(0107) // SD卡扇区读取函数
(0108) // sector:扇区号
(0109) // buffer:数据缓存
(0110) //
(0111) //---------------------------------------------
(0112) uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
(0113) {
(0114) uint8 r1;
(0115) uint16 i;
(0116) uint16 retry=0;
0840 2766 CLR R22
0841 2777 CLR R23
(0117)
(0118) SPI_High(); /* Use High Speed SPI*/
0842 940E08FB CALL _SPI_High
(0119)
(0120) r1 = SD_SendCommand(17, sector<<9);//读命令 //read command
0844 E089 LDI R24,0x9
0845 E090 LDI R25,0
0846 01FE MOVW R30,R28
0847 8420 LDD R2,Z+8
0848 8431 LDD R3,Z+9
0849 8442 LDD R4,Z+10
084A 8453 LDD R5,Z+11
084B 938A ST R24,-Y
084C 0181 MOVW R16,R2
084D 0192 MOVW R18,R4
084E 940E1466 CALL lsl32
0850 8328 STD Y+0,R18
0851 8339 STD Y+1,R19
0852 0198 MOVW R18,R16
0853 E101 LDI R16,0x11
0854 DF28 RCALL _SD_SendCommand
0855 2EA0 MOV R10,R16
(0121)
(0122) if(r1 != 0x00)
0856 2300 TST R16
0857 F009 BEQ 0x0859
(0123) return r1;
0858 C02E RJMP 0x0887
(0124)
(0125) SPI_CS_Assert;
0859 98D9 CBI 0x1B,1
085A C00B RJMP 0x0866
(0126) //等数据的开始 //wait to start recieve data
(0127) while(SPI_SrByte(0xff) != 0xfe)
(0128) if(retry++ > 0xfffe)
085B 011B MOVW R2,R22
085C 5F6F SUBI R22,0xFF
085D 4F7F SBCI R23,0xFF
085E EF8E LDI R24,0xFE
085F EF9F LDI R25,0xFF
0860 1582 CP R24,R2
0861 0593 CPC R25,R3
0862 F418 BCC 0x0866
(0129) {SPI_CS_Deassert;return 1;}
0863 9AD9 SBI 0x1B,1
0864 E001 LDI R16,1
0865 C021 RJMP 0x0887
0866 EF0F LDI R16,0xFF
0867 940E08FF CALL _SPI_SrByte
0869 3F0E CPI R16,0xFE
086A F781 BNE 0x085B
(0130)
(0131) for(i=0; i<512; i++)//读512个数据 //read 512 bytes
086B 24AA CLR R10
086C 24BB CLR R11
086D C009 RJMP 0x0877
(0132) {
(0133) *buffer++ = SPI_SrByte(0xff);
086E EF0F LDI R16,0xFF
086F 940E08FF CALL _SPI_SrByte
0871 01FA MOVW R30,R20
0872 9301 ST R16,Z+
0873 01AF MOVW R20,R30
0874 01C5 MOVW R24,R10
0875 9601 ADIW R24,1
0876 015C MOVW R10,R24
0877 01C5 MOVW R24,R10
0878 3080 CPI R24,0
0879 E0E2 LDI R30,2
087A 079E CPC R25,R30
087B F390 BCS 0x086E
(0134) }
(0135)
(0136) SPI_SrByte(0xff);//伪crc //dummy crc
087C EF0F LDI R16,0xFF
087D 940E08FF CALL _SPI_SrByte
(0137) SPI_SrByte(0xff);
087F EF0F LDI R16,0xFF
0880 940E08FF CALL _SPI_SrByte
(0138)
(0139) SPI_CS_Deassert;
0882 9AD9 SBI 0x1B,1
(0140) SPI_SrByte(0xff);// extra 8 CLK
0883 EF0F LDI R16,0xFF
0884 940E08FF CALL _SPI_SrByte
(0141)
(0142)
(0143) return 0;
0886 2700 CLR R16
0887 9622 ADIW R28,2
0888 940E1419 CALL pop_gset3
088A 9624 ADIW R28,4
088B 9508 RET
_SD_WriteSingleBlock:
r1 --> R20
retry -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -