📄 f34x_msd_mmc.src
字号:
MOVX A,@DPTR
MOV R3,A
INC DPTR
CLR A
MOV B,#01H
LCALL ?C?ILDIX
MOV R1,B
MOV R2,A
MOV A,R7
LCALL ?C?CSTPTR
; #else
; SPI0DAT = 0xFF; // (OCR);
; while(!SPIF){}
; SPIF = 0;
; *pchar++ = SPI0DAT;
; #endif
; #endif
; }
; SOURCE LINE # 584
SJMP ?C0048
; }
; SOURCE LINE # 585
?C0019:
; switch(current_command.trans_type) // This conditional handles all data
; SOURCE LINE # 586
MOV R0,#LOW (current_command?144+03H)
MOV A,@R0
ADD A,#0FEH
JZ ?C0059
INC A
JZ $ + 5H
LJMP ?C0050
; { // operations; The command entry
; SOURCE LINE # 587
; // determines what type, if any, data
; // operations need to occur;
; case RD: // Read data from the MMC;
; SOURCE LINE # 590
?C0051:
; loopguard = 0;
; SOURCE LINE # 591
CLR A
MOV DPTR,#loopguard?143
MOVX @DPTR,A
?C0052:
; #ifdef __F326_VER__
; while(Write_Read_Spi_Byte(0xFF)!=START_SBR) {
; if(!++loopguard) {BACK_FROM_ERROR;}
; }
; #else
; #ifdef SEND__IN_FUNCTION
; while((Write_Read_Spi_Byte(0xFF))!=START_SBR) {
; SOURCE LINE # 598
LCALL L?0178
XRL A,#0FEH
JZ ?C0053
; Wait_ns(700);
; SOURCE LINE # 599
LCALL L?0170
; if(!++loopguard) {
; SOURCE LINE # 600
MOV DPTR,#loopguard?143
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0052
; /*printf("RD Start response not set ");*/
; BACK_FROM_ERROR;}
; SOURCE LINE # 602
MOV SPI0DAT,#0FFH
?C0055:
JNB SPIF,?C0055
?C0056:
LCALL L?0164
?C0057:
JNB SPIF,?C0057
?C0058:
?C0137:
LJMP ?C0138
; }
; SOURCE LINE # 603
?C0053:
; #else
; do // Wait for a start read Token from
; { // the MMC;
; // Start a SPI transfer;
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; if(!++loopguard) break;
; } while(SPI0DAT != START_SBR); // Check for a start read Token;
; if(!loopguard) { BACK_FROM_ERROR; }
; #endif
; #endif
;
; counter = 0; // Reset byte counter;
; SOURCE LINE # 617
LCALL L?0162
; // Read <current_blklen> bytes;
; // START_SPI_TIMEOUT;
; READ_BYTES(pchar,current_blklen);
; SOURCE LINE # 620
LCALL L?0150
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
LCALL _READ_BYTES
; // STOP_SPI_TIME_OUT;
;
; #ifdef __F326_VER__
; dummy_CRC = Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; dummy_CRC = Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 627
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV R0,#LOW (dummy_CRC?151)
MOV A,R7
MOV @R0,A
; #else
; SPI0DAT = 0xFF; // After all data is read, read the two
; while(!SPIF){} // CRC bytes; These bytes are not used
; SPIF = 0; // in this mode, but the placeholders
; dummy_CRC = SPI0DAT; // must be read anyway;
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; dummy_CRC = SPI0DAT;
; #endif
; #endif
; break;
; SOURCE LINE # 639
SJMP ?C0050
; case WR:
; SOURCE LINE # 640
?C0059:
;
; #ifdef __F326_VER__
; Write_Read_Spi_Byte(0xFF);
; Write_Read_Spi_Byte(START_SBW);
; #else
;
; #ifdef SEND__IN_FUNCTION
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 648
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; Write_Read_Spi_Byte(START_SBW);
; SOURCE LINE # 649
MOV R7,#0FEH
LCALL _Write_Read_Spi_Byte
; #else // Write data to the MMC;
; SPI0DAT = 0xFF; // Start by sending 8 SPI clocks so
; while(!SPIF){} // the MMC can prepare for the write;
; SPIF = 0;
; SPI0DAT = START_SBW; // Send the start write block Token;
; while(!SPIF){}
; SPIF = 0;
; // Reset byte counter;
; // Write <current_blklen> bytes to MMC;
; #endif
; Wait_ns(700);
; SOURCE LINE # 660
MOV R7,#0BCH
MOV R6,#02H
LCALL _Wait_ns
; #endif
;
; //START_SPI_TIMEOUT;
; WRITE_BYTES(pchar,current_blklen);
; SOURCE LINE # 664
LCALL L?0151
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
LCALL _WRITE_BYTES
; // STOP_SPI_TIME_OUT;
;
; #ifdef __F326_VER__
; Write_Read_Spi_Byte(0xFF);
; Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 672
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 673
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; #else
; SPI0DAT = 0xFF; // Write CRC bytes (don't cares);
; while(!SPIF){}
; SPIF = 0;
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; #endif
; #endif
; loopguard = 0;
; SOURCE LINE # 683
CLR A
MOV DPTR,#loopguard?143
MOVX @DPTR,A
?C0062:
; do // Read Data Response from card;
; {
; SOURCE LINE # 685
; #ifdef __F326_VER__
; data_resp = Write_Read_Spi_Byte(0xFF);
; if(!++loopguard) break;
; #else
; #ifdef SEND__IN_FUNCTION
; data_resp = Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 691
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV R0,#LOW (data_resp?150)
MOV A,R7
MOV @R0,A
; if(!++loopguard) break;
; SOURCE LINE # 692
MOV DPTR,#loopguard?143
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JZ ?C0061
; #else
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; data_resp = SPI0DAT;
; if(!++loopguard) break;
; #endif
; #endif
; } // When bit 0 of the MMC response
; SOURCE LINE # 701
?C0060:
; // is clear, a valid data response
; // has been received;
; while((data_resp & DATA_RESP_MASK) != 0x01);
; SOURCE LINE # 704
MOV R0,#LOW (data_resp?150)
MOV A,@R0
ANL A,#011H
MOV R7,A
CJNE R7,#01H,?C0062
?C0061:
; if(!loopguard) { BACK_FROM_ERROR; }
; SOURCE LINE # 705
MOV DPTR,#loopguard?143
MOVX A,@DPTR
JNZ ?C0069
MOV SPI0DAT,#0FFH
?C0065:
JNB SPIF,?C0065
?C0066:
LCALL L?0164
?C0067:
JNB SPIF,?C0067
?C0068:
?C0138:
CLR SPIF
MOV R6,#0FFH
MOV R7,#0FFH
RET
?C0069:
;
; #ifdef __F326_VER__
; while(Write_Read_Spi_Byte(0xFF)==0x00);
; Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; while(Write_Read_Spi_Byte(0xFF)==0x00);
; SOURCE LINE # 712
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV A,R7
JZ ?C0069
?C0070:
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 713
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; #else
; do // Wait for end of busy signal;
; {
; SPI0DAT = 0xFF; // Start SPI transfer to receive
; while(!SPIF){} // busy tokens;
; SPIF = 0;
; } while(SPI0DAT == 0x00); // When a non-zero Token is returned,
; // card is no longer busy;
;
; SPI0DAT = 0xFF; // Issue 8 SPI clocks so that all card
; while(!SPIF){} // operations can complete;
; SPIF = 0;
; #endif
; #endif
;
; break;
; SOURCE LINE # 729
; default: break;
; SOURCE LINE # 730
; }
; SOURCE LINE # 731
?C0050:
; #ifdef __F326_VER__
; Write_Read_Spi_Byte(0xFF);
; SCS = 1;
; Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 738
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; NSSMD0 = 1;
; SOURCE LINE # 739
SETB NSSMD0
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 740
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
; #else
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
;
; NSSMD0 = 1; // Deselect memory card;
; SPI0DAT = 0xFF; // Send 8 more SPI clocks to ensure
; while(!SPIF){} // the card has finished all necessary
; SPIF = 0; // operations;
; // Restore old block length if needed;
; #endif
; #endif
; if((current_command.command_byte == 9)||
; SOURCE LINE # 753
MOV R0,#LOW (current_command?144)
MOV A,@R0
MOV R7,A
XRL A,#09H
JZ ?C0073
MOV A,R7
CJNE A,#0AH,?C0072
?C0073:
; (current_command.command_byte == 10)) {
; SOURCE LINE # 754
; current_blklen = old_blklen;
; SOURCE LINE # 755
MOV DPTR,#old_blklen?147
LCALL L?0165
; }
; SOURCE LINE # 756
?C0072:
; return card_response.i;
; SOURCE LINE # 757
MOV R0,#LOW (card_response?149)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
; }
; SOURCE LINE # 758
?C0018:
RET
L?0144:
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV R0,#LOW (card_response?149)
MOV A,R7
MOV @R0,A
MOV DPTR,#loopguard?143
MOVX A,@DPTR
INC A
MOVX @DPTR,A
RET
L?0153:
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV R0,#LOW (card_response?149)
MOV A,R7
MOV @R0,A
MOV DPTR,#loopguard?143
MOVX A,@DPTR
INC A
MOVX @DPTR,A
RET
L?0170:
MOV R7,#0BCH
MOV R6,#02H
LCALL _Wait_ns
RET
L?0178:
MOV R7,#0FFH
LCALL _Write_Read_Spi_Byte
MOV A,R7
RET
; END OF _MMC_Command_Exec
;
;
; //-----------------------------------------------------------------------------
; // MMC_FLASH_Init
; //-----------------------------------------------------------------------------
; //
; // This function initializes the flash card, configures it to operate in SPI
; // mode, and reads the operating conditions register to ensure that the device
; // has initialized correctly. It also determines the size of the card by
; // reading the Card Specific Data Register (CSD).
;
; void MMC_FLASH_Init(void)
RSEG ?PR?MMC_FLASH_Init?F34X_MSD_MMC
MMC_FLASH_Init:
USING 0
; SOURCE LINE # 770
; {
; SOURCE LINE # 771
; xdata unsigned loopguard;
; xdata int i;
; xdata UINT card_status; // Stores card status returned from
; // MMC function calls(MMC_Command_Exec);
; xdata unsigned char counter = 0; // SPI byte counter;
; SOURCE LINE # 776
CLR A
MOV DPTR,#counter?256
MOVX @DPTR,A
; unsigned char xdata *pchar; // Xdata pointer for storing MMC
; // register values;
; // Transmit at least 64 SPI clocks
; // before any bus comm occurs.
;
; unsigned int c_size,bl_len;
; unsigned char c_mult;
; // PHYSICAL_SIZE=0;
; // PHYSICAL_BLOCKS=0;
;
; SPI_Init();
; SOURCE LINE # 787
LCALL SPI_Init
; Wait_ms(100);
; SOURCE LINE # 788
MOV R7,#064H
MOV R6,#00H
LCALL _Wait_ms
; pchar = (unsigned char xdata*)LOCAL_BLOCK;
; SOURCE LINE # 789
MOV DPTR,#pchar?257
MOV A,#HIGH (LOCAL_BLOCK)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (LOCAL_BLOCK)
MOVX @DPTR,A
; for(counter = 0; counter < 8; counter++) {
; SOURCE LINE # 790
CLR A
MOV DPTR,#counter?256
MOVX @DPTR,A
?C0074:
; #ifdef __F326_VER__
; Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 795
; #else
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; #endif
; #endif
; }
; SOURCE LINE # 802
LCALL L?0167
SUBB A,#08H
JC ?C0074
?C0075:
; for(counter = 0; counter < 2; counter++) {
; SOURCE LINE # 803
CLR A
MOV DPTR,#counter?256
MOVX @DPTR,A
?C0077:
; #ifdef __F326_VER__
; Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; Write_Read_Spi_Byte(0xFF);
; SOURCE LINE # 808
; #else
; SPI0DAT = 0xFF;
; while(!SPIF){}
; SPIF = 0;
; #endif
; #endif
; }
; SOURCE LINE # 815
LCALL L?0167
SUBB A,#02H
JC ?C0077
?C0078:
;
; #ifdef __F326_VER__
; SCS = 0;
; #else
; NSSMD0 = 0; // Select the MMC with the CS pin;
; SOURCE LINE # 820
CLR NSSMD0
; // Send 16 more SPI clocks to
; // ensure proper startup;
; #endif
; // Send the GO_IDLE_STATE command with
; // CS driven low; This causes the MMC
; // to enter SPI mode;
; Wait_ms(1);
; SOURCE LINE # 827
LCALL L?0171
; card_status.i = MMC_Command_Exec(GO_IDLE_STATE,EMPTY,EMPTY);
; SOURCE LINE # 828
MOV DPTR,#?_MMC_Command_Exec?BYTE+01H
LCALL ?C?LSTKXDATA
DB 00H
DB 00H
DB 00H
DB 00H
LCALL L?0154
MOV R7,A
LCALL L?0145
;
; loopguard=0;
; SOURCE LINE # 830
LCALL L?0168
?C0082:
;
; // Send the SEND_OP_COND command
; do // until the MMC indicates that it is
; {
; SOURCE LINE # 834
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -