📄 m16_vs1003_test.lst
字号:
(0006) //整理日期:2009.7.8
(0007) //
(0008) //------------------------------------------------------------------------
(0009)
(0010) #include"sd.h"
(0011)
(0012)
(0013) //---------------------------------
(0014) //
(0015) // SD卡接口初始化函数
(0016) //
(0017) //---------------------------------
(0018) void SD_Port_Init(void)
(0019) {
(0020) SD_CS_DDR |= 1<<SD_CS_BIT;
_SD_Port_Init:
3A8 9AD1 SBI 0x1A,1
(0021) SD_CS_PORT |= 1<<SD_CS_BIT;
3A9 9AD9 SBI 0x1B,1
3AA 9508 RET
_SD_SendCommand:
retry --> R22
r1 --> R20
arg --> Y,+6
cmd --> R10
3AB 933A ST -Y,R19
3AC 932A ST -Y,R18
3AD 940E 0E0C CALL push_xgsetF00C
3AF 2EA0 MOV R10,R16
(0022) }
(0023)
(0024)
(0025)
(0026) //---------------------------------
(0027) //
(0028) // SD卡写寄存器函数
(0029) // arg:命令
(0030) // cmd:命令号
(0031) //
(0032) //---------------------------------
(0033) uint8 SD_SendCommand(uint8 cmd, uint32 arg)
(0034) {
(0035) uint8 r1=1;
3B0 E041 LDI R20,1
(0036) uint8 retry=0;
3B1 2766 CLR R22
(0037)
(0038)
(0039) SPI_SrByte(0xff);
3B2 EF0F LDI R16,0xFF
3B3 940E 0C45 CALL _SPI_SrByte
(0040) SPI_CS_Assert;
3B5 98D9 CBI 0x1B,1
(0041) while(r1--);
3B6 2E24 MOV R2,R20
3B7 2433 CLR R3
3B8 5041 SUBI R20,1
3B9 2022 TST R2
3BA F7D9 BNE 0x03B6
(0042)
(0043) SPI_SrByte((cmd & 0x3f) | 0x40); /* send command */
3BB 2D0A MOV R16,R10
3BC 730F ANDI R16,0x3F
3BD 6400 ORI R16,0x40
3BE 940E 0C45 CALL _SPI_SrByte
(0044)
(0045) SPI_SrByte(arg>>24);
3C0 E188 LDI R24,0x18
3C1 E090 LDI R25,0
3C2 810E LDD R16,Y+6
3C3 811F LDD R17,Y+7
3C4 8528 LDD R18,Y+8
3C5 8539 LDD R19,Y+9
3C6 938A ST -Y,R24
3C7 940E 0E6D CALL lsr32
3C9 940E 0C45 CALL _SPI_SrByte
(0046) SPI_SrByte(arg>>16);
3CB 802E LDD R2,Y+6
3CC 803F LDD R3,Y+7
3CD 8448 LDD R4,Y+8
3CE 8459 LDD R5,Y+9
3CF 0112 MOVW R2,R4
3D0 2444 CLR R4
3D1 2455 CLR R5
3D2 2D02 MOV R16,R2
3D3 940E 0C45 CALL _SPI_SrByte
(0047) SPI_SrByte(arg>>8);
3D5 E088 LDI R24,0x8
3D6 E090 LDI R25,0
3D7 810E LDD R16,Y+6
3D8 811F LDD R17,Y+7
3D9 8528 LDD R18,Y+8
3DA 8539 LDD R19,Y+9
3DB 938A ST -Y,R24
3DC 940E 0E6D CALL lsr32
3DE 940E 0C45 CALL _SPI_SrByte
(0048) SPI_SrByte(arg);
3E0 810E LDD R16,Y+6
3E1 940E 0C45 CALL _SPI_SrByte
(0049)
(0050) SPI_SrByte(0x95);
3E3 E905 LDI R16,0x95
3E4 940E 0C45 CALL _SPI_SrByte
(0051)
(0052) SPI_SrByte(0xff);
3E6 EF0F LDI R16,0xFF
3E7 940E 0C45 CALL _SPI_SrByte
3E9 C007 RJMP 0x03F1
(0053) while((r1 = SPI_SrByte(0xff)) == 0xff) /* wait response */
(0054) if(retry++ > 0xfe) break; /* time out error */
3EA 2E26 MOV R2,R22
3EB 2433 CLR R3
3EC 5F6F SUBI R22,0xFF
3ED EF8E LDI R24,0xFE
3EE 1582 CP R24,R2
3EF F408 BCC 0x03F1
3F0 C007 RJMP 0x03F8
3F1 EF0F LDI R16,0xFF
3F2 940E 0C45 CALL _SPI_SrByte
3F4 2EA0 MOV R10,R16
3F5 2D4A MOV R20,R10
3F6 3F0F CPI R16,0xFF
3F7 F391 BEQ 0x03EA
(0055)
(0056) SPI_CS_Deassert;
3F8 9AD9 SBI 0x1B,1
(0057) SPI_SrByte(0xff); // extra 8 CLK
3F9 EF0F LDI R16,0xFF
3FA 940E 0C45 CALL _SPI_SrByte
(0058)
(0059) return r1; /* return state */
3FC 2F04 MOV R16,R20
3FD 940E 0E13 CALL pop_xgsetF00C
3FF 9622 ADIW R28,2
400 9508 RET
_SD_Init:
retry --> R10
r1 --> R20
i --> R22
401 940E 0E0C CALL push_xgsetF00C
403 9722 SBIW R28,2
(0060) }
(0061)
(0062)
(0063) //---------------------------------
(0064) //
(0065) // SD卡初始化函数
(0066) //
(0067) //---------------------------------
(0068) uint8 SD_Init(void)
(0069) {
(0070)
(0071) uint8 i;
(0072) uint8 retry = 0;
404 24AA CLR R10
(0073) uint8 r1 = 0;
405 2744 CLR R20
(0074)
(0075) SD_Port_Init();
406 DFA1 RCALL _SD_Port_Init
(0076)
(0077) SPI_CS_Assert;
407 98D9 CBI 0x1B,1
(0078) delay_ms(1);
408 E001 LDI R16,1
409 E010 LDI R17,0
40A E020 LDI R18,0
40B E030 LDI R19,0
40C 940E 0C4A CALL _delay_ms
(0079) SPI_CS_Deassert;
40E 9AD9 SBI 0x1B,1
(0080) delay_ms(1);
40F E001 LDI R16,1
410 E010 LDI R17,0
411 E020 LDI R18,0
412 E030 LDI R19,0
413 940E 0C4A CALL _delay_ms
(0081)
(0082)
(0083) SPI_Low();
415 940E 0C3C CALL _SPI_Low
(0084)
(0085) do
(0086) {
(0087) for(i=0;i<10;i++) SPI_SrByte(0xff);
417 2766 CLR R22
418 C004 RJMP 0x041D
419 EF0F LDI R16,0xFF
41A 940E 0C45 CALL _SPI_SrByte
41C 9563 INC R22
41D 306A CPI R22,0xA
41E F3D0 BCS 0x0419
(0088) r1 = SD_SendCommand(0, 0);//发idle命令 //send idle command
41F E080 LDI R24,0
420 E090 LDI R25,0
421 E0A0 LDI R26,0
422 E0B0 LDI R27,0
423 83A8 ST Y,R26
424 83B9 STD Y+1,R27
425 019C MOVW R18,R24
426 2700 CLR R16
427 DF83 RCALL _SD_SendCommand
428 2F40 MOV R20,R16
(0089) retry++;
429 94A3 INC R10
(0090) if(retry>0xfe) return 1;//超时退出 //time out
42A EF8E LDI R24,0xFE
42B 158A CP R24,R10
42C F410 BCC 0x042F
42D E001 LDI R16,1
42E C02C RJMP 0x045B
(0091) } while(r1 != 0x01);
42F 3041 CPI R20,1
430 F731 BNE 0x0417
(0092)
(0093)
(0094) retry = 0;
431 24AA CLR R10
(0095) do
(0096) {
(0097) r1 = SD_SendCommand(1, 0);//发active命令 //send active command
432 E080 LDI R24,0
433 E090 LDI R25,0
434 E0A0 LDI R26,0
435 E0B0 LDI R27,0
436 83A8 ST Y,R26
437 83B9 STD Y+1,R27
438 019C MOVW R18,R24
439 E001 LDI R16,1
43A DF70 RCALL _SD_SendCommand
43B 2F40 MOV R20,R16
(0098) retry++;
43C 94A3 INC R10
(0099) if(retry>0xfe) return 1;//超时退出 //time out
43D EF8E LDI R24,0xFE
43E 158A CP R24,R10
43F F410 BCC 0x0442
440 E001 LDI R16,1
441 C019 RJMP 0x045B
(0100) } while(r1);
442 2344 TST R20
443 F771 BNE 0x0432
(0101)
(0102) SPI_High(); /* Use High Speed SPI*/
444 940E 0C41 CALL _SPI_High
(0103)
(0104) r1 = SD_SendCommand(59, 0);//关crc //disable CRC
446 E080 LDI R24,0
447 E090 LDI R25,0
448 E0A0 LDI R26,0
449 E0B0 LDI R27,0
44A 83A8 ST Y,R26
44B 83B9 STD Y+1,R27
44C 019C MOVW R18,R24
44D E30B LDI R16,0x3B
44E DF5C RCALL _SD_SendCommand
(0105)
(0106) r1 = SD_SendCommand(16, 512);//设扇区大小512 //set sector size to 512
44F E080 LDI R24,0
450 E092 LDI R25,2
451 E0A0 LDI R26,0
452 E0B0 LDI R27,0
453 83A8 ST Y,R26
454 83B9 STD Y+1,R27
455 019C MOVW R18,R24
456 E100 LDI R16,0x10
457 DF53 RCALL _SD_SendCommand
458 2EA0 MOV R10,R16
459 2D4A MOV R20,R10
(0107) return 0;//正常返回 //normal return
45A 2700 CLR R16
45B 9622 ADIW R28,2
45C 940C 0E13 JMP pop_xgsetF00C
_SD_ReadBlock:
r1 --> R12
retry --> R20
i --> R20
buffer --> R10
sector --> Y,+10
45E 940E 0D3D CALL push_arg4
460 940E 0E1A CALL push_xgsetF03C
462 9722 SBIW R28,2
463 84AE LDD R10,Y+14
464 84BF LDD R11,Y+15
(0108) }
(0109)
(0110)
(0111)
(0112) //---------------------------------------------
(0113) //
(0114) // SD卡扇区读取函数
(0115) // sector:扇区号
(0116) // buffer:数据缓存
(0117) //
(0118) //---------------------------------------------
(0119) uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
(0120) {
(0121) uint8 r1;
(0122) uint16 i;
(0123) uint16 retry=0;
465 2744 CLR R20
466 2755 CLR R21
(0124)
(0125) SPI_High(); /* Use High Speed SPI*/
467 940E 0C41 CALL _SPI_High
(0126)
(0127) r1 = SD_SendCommand(17, sector<<9);//读命令 //read command
469 E089 LDI R24,0x9
46A E090 LDI R25,0
46B 850A LDD R16,Y+10
46C 851B LDD R17,Y+11
46D 852C LDD R18,Y+12
46E 853D LDD R19,Y+13
46F 938A ST -Y,R24
470 940E 0E5A CALL lsl32
472 8328 ST Y,R18
473 8339 STD Y+1,R19
474 0198 MOVW R18,R16
475 E101 LDI R16,0x11
476 DF34 RCALL _SD_SendCommand
477 2EC0 MOV R12,R16
(0128)
(0129) if(r1 != 0x00)
478 2300 TST R16
479 F009 BEQ 0x047B
(0130) return r1;
47A C02E RJMP 0x04A9
(0131)
(0132) SPI_CS_Assert;
47B 98D9 CBI 0x1B,1
47C C00B RJMP 0x0488
(0133) //等数据的开始 //wait to start recieve data
(0134) while(SPI_SrByte(0xff) != 0xfe)
(0135) if(retry++ > 0xfffe)
47D 011A MOVW R2,R20
47E 5F4F SUBI R20,0xFF
47F 4F5F SBCI R21,0xFF
480 EF8E LDI R24,0xFE
481 EF9F LDI R25,0xFF
482 1582 CP R24,R2
483 0593 CPC R25,R3
484 F418 BCC 0x0488
(0136) {SPI_CS_Deassert;return 1;}
485 9AD9 SBI 0x1B,1
486 E001 LDI R16,1
487 C021 RJMP 0x04A9
488 EF0F LDI R16,0xFF
489 940E 0C45 CALL _SPI_SrByte
48B 2F60 MOV R22,R16
48C 3F0E CPI R16,0xFE
48D F779 BNE 0x047D
(0137)
(0138) for(i=0; i<512; i++)//读512个数据 //read 512 bytes
48E 2744 CLR R20
48F 2755 CLR R21
490 C009 RJMP 0x049A
(0139) {
(0140) *buffer++ = SPI_SrByte(0xff);
491 EF0F LDI R16,0xFF
492 940E 0C45 CALL _SPI_SrByte
494 2EC0 MOV R12,R16
495 01F5 MOVW R30,R10
496 92C1 ST Z+,R12
497 015F MOVW R10,R30
498 5F4F SUBI R20,0xFF
499 4F5F SBCI R21,0xFF
49A 3040 CPI R20,0
49B E0E2 LDI R30,2
49C 075E CPC R21,R30
49D F398 BCS 0x0491
(0141) }
(0142)
(0143) SPI_SrByte(0xff);//伪crc //dummy crc
49E EF0F LDI R16,0xFF
49F 940E 0C45 CALL _SPI_SrByte
(0144) SPI_SrByte(0xff);
4A1 EF0F LDI R16,0xFF
4A2 940E 0C45 CALL _SPI_SrByte
(0145)
(0146) SPI_CS_Deassert;
4A4 9AD9 SBI 0x1B,1
(0147) SPI_SrByte(0xff);// extra 8 CLK
4A5 EF0F LDI R16,0xFF
4A6 940E 0C45 CALL _SPI_SrByte
(0148)
(0149) return 0;
4A8 2700 CLR R16
4A9 9622 ADIW R28,2
4AA 940E 0E23 CALL pop_xgsetF03C
4AC 9624 ADIW R28,4
4AD 9508 RET
_SD_WriteSingleBlock:
r1 --> R22
retry --> R20
i --> R10
buffer --> Y,+12
sector --> Y,+8
4AE 940E 0D3D CALL push_arg4
4B0 940E 0E0C CALL push_xgsetF00C
4B2 9722 SBIW R28,2
(0150) }
(0151)
(0152)
(0153) //---------------------------------------------
(0154) //
(0155) // SD卡扇区写入函数
(0156) // sector:扇区号
(0157) // buffer:数据缓存
(0158) //
(0159) //---------------------------------------------
(0160) uint8 SD_WriteSingleBlock(uint32 sector, uint8* buffer)
(0161) {
(0162) uint8 r1;
(0163) uint16 i;
(0164) uint16 retry=0;
4B3 2744 CLR R20
4B4 2755 CLR R21
(0165)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -