📄 mmc.lst
字号:
CCS PCH C Compiler, Version 3.249, 28193 21-Kas-07 00:11
Filename: D:\Elektronik\PIC\Proje\MMC\SD_MMC\mmc.lst
ROM used: 8026 bytes (24%)
Largest free fragment is 24742
RAM used: 275 (18%) at main() level
378 (25%) worst case
Stack: 4 locations
*
0000: GOTO 1C40
....................
.................... #include "18f452.h"
.................... //////// Standard Header file for the PIC18F452 device ////////////////
.................... #device PIC18F452
.................... #list
....................
.................... #fuses H4,NOWDT,NOPROTECT,NOWRT,NOWRTD,NOLVP,NOOSCSEN,BORV27,PUT,STVREN,NODEBUG,NOWRTB
.................... #use delay(clock=40000000,RESTART_WDT)
*
01E0: MOVLW 01
01E2: MOVWF FEA
01E4: MOVLW 48
01E6: MOVWF FE9
01E8: MOVF FEF,W
01EA: BZ 020E
01EC: MOVLW 0C
01EE: MOVWF 01
01F0: MOVLW BF
01F2: MOVWF 00
01F4: CLRWDT
01F6: DECFSZ 00,F
01F8: BRA 01F4
01FA: DECFSZ 01,F
01FC: BRA 01F0
01FE: MOVLW F7
0200: MOVWF 00
0202: DECFSZ 00,F
0204: BRA 0202
0206: NOP
0208: CLRWDT
020A: DECFSZ FEF,F
020C: BRA 01EC
020E: RETLW 00
.................... #use rs232(baud=57600,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
....................
.................... #include "HDD Driver.c"
.................... //////////////////////////////////////////////////////////////////////
.................... //////////////////////////////////////////////////////////////////////
.................... // Name: HDD Driver.c //
.................... // Date: 02/01/2004 //
.................... // Version: 1.1 //
.................... // Type: PIC C Driver for MMC //
.................... // Author: Mike Luck & Douglas Kennedy //
.................... // Company: MPIC3.COM //
.................... //////////////////////////////////////////////////////////////////////
.................... //////////////////////////////////////////////////////////////////////
....................
.................... // Note:
.................... // This code is a work in progress & not a finished fully working
.................... // project. Please check www.mpic3.com reguarly for updates.
....................
.................... /// PIN Assignments //////////////////////////////
.................... #DEFINE _CS PIN_C2 // chip select for MMC
.................... //#DEFINE SDO PIN_C5
.................... //#DEFINE CLK PIN_C3
.................... //#DEFINE SDI PIN_C4
.................... // SPI hardware pins are
.................... // SDO C5
.................... // SDI C4
.................... // SCK C3
.................... ///////////////////////////////////////////////////////////////
....................
.................... ///// Note old values needed before all SPI modes could be set up using SPI_setup
.................... /// for 16 parts ///////////
.................... //#DEFINE SSPCON 0x14
.................... //#DEFINE SSPSTAT 0x94
.................... //#BIT SMP=SSPSTAT.7
.................... //#BIT CKE=SSPSTAT.6
.................... //#BIT CKP=SSPCON.4
.................... //#BIT SSPEN=SSPCON.5
.................... //////////////////////////////
....................
.................... // For 18F452
.................... #DEFINE SSPSTAT 0x0FC7
.................... #DEFINE SSPCON1 0x0FC6
.................... #BIT SMP=SSPSTAT.7
.................... #BIT CKE=SSPSTAT.6
.................... #BIT CKP=SSPCON1.4
....................
.................... #DEFINE MAX_FILES 2 /// max number of open files
.................... #DEFINE MMC_BUFF_SIZE 32 /// 32 for PCM
.................... #DEFINE MMC_FILE_NAME_SIZE 32
....................
.................... #DEFINE ROOT_CLUSTER 0
.................... #DEFINE NEXT_CLUSTER 1
....................
.................... #define MMC_INIT_TRACE FALSE
.................... #define MMC_CMD_TRACE FALSE
.................... #define MMC_CLUSTER_TRACE FALSE // if true prints to serial port
.................... #define MMC_OPEN_TRACE FALSE // if true prints to serial port
.................... #define MMC_READ_TRACE FALSE // if true prints file_addr,cluster index etc
.................... #define MMC_WRITE_TRACE FALSE
.................... #define MMC_READ_BLOCK_TRACE FALSE
.................... #define MMC_SET_BLOCK_LEN_TRACE FALSE
.................... #define MMC_WRITE_BLOCK_TRACE FALSE
.................... #define MMC_NEW_CLUSTER FALSE
.................... ////// MMC prototypes
.................... #separate
.................... int init_MMC(int max_tries);
.................... #separate
.................... int open_file(int fnbr,char *fname,int16 rec_length);
.................... #separate
.................... int file_read(int8 fnbr,char *buff);
.................... #separate
.................... int file_write(int8 fnbr,int *buff);
.................... #separate
.................... int file_set(int fnbr,int32 offset);
.................... #separate
.................... int file_new_cluster(int8 fnbr,int8 mode); /// mode 1=fat1 2=fat2
....................
.................... int32 atoint32 (char *s );
.................... signed int strncmp(char *s1, char *s2, int n);
.................... ///////////////////// MMC GLOBALS /////////////////////////////
.................... int16 cluster_size_bytes; // bytes in a cluster
.................... //int16 dir_cluster_chain_ptr; // link to the first cluster in the dir
....................
.................... int32 fat1_address; // physical address of fat1 cluster table assigned by INIT_MMC
.................... int32 fat2_address; // physical address of fat1 cluster table assigned by INIT_MMC
.................... int32 root_dir_address; // physical address of volume,file,folder tiles assigned by INIT_MMC
.................... int32 data_area_address; // physical address of data area assigned by INIT_MMC
.................... int32 winhex_adj; // Win hex hides the bytes in the reserved sectors
.................... // this means Fat1 is address 512
.................... // so adj is fat1-512
....................
.................... int32 block_size; // current MMC block size
....................
.................... int MMC_init=FALSE;
....................
.................... int MMC_dir_protected=TRUE;
....................
.................... ////////// open file specific globals ///////////////////////
.................... struct{
.................... char name[MMC_FILE_NAME_SIZE+1]; // fopen file name
.................... int32 dir_addr_ptr; // physical address of this files tile info
.................... int16 root_cluster_ptr; // location of first cluster in FAT
.................... int16 this_cluster_ptr; // location of current cluster in FAT
.................... int16 next_cluster_ptr; // location of the next cluster for a file or sub dir in FAT
.................... int32 addr_ptr; // physical address in the file the current
.................... // cluster points to
.................... // address=(this_chain_ptr-2)*cluster_size_bytes+data_area_address
.................... //
.................... // cluster_addr(THIS_CLUSTER) assigns it
.................... // cluster_addr(NEXT_CLUSTER) moves to the data the next
.................... // cluster points to
.................... int32 size; // size of open file in bytes
.................... int32 cluster_offset; // offset within the file representing the start of the current cluster
.................... // (0 is start and ends with the cluster contianing eof )
.................... // auto increased by cluster_size_bytes each time a new cluster is entered
....................
.................... int32 offset; // current offset into the open file ( 0 is start size(file size) is end)
.................... // auto increased by rec size each time a rec is read
.................... // addr_prt+offset-cluster_offset is physical address of
.................... // the current position within the file
.................... // the physical positions are not always contiguous since the
.................... // clusters of the file are not always adjacent to each other
.................... int16 rec_size; // fopen record_size
.................... // char buff[MMC_BUFF_SIZE+1]; // used for open and for read write
.................... // init MMC uses file 0 buff to fetch the globals
....................
.................... } file[MAX_FILES];
....................
....................
.................... #separate
.................... int mmc_cmd(int8 cmd,int32 address,int8 tries,int8 valid,int8 invalid){
.................... int i,r1;
.................... for( i=0;i<16;i++) SPI_READ(0xFF);// digest prior operation
0210: MOVLB 1
0212: CLRF x77
0214: MOVF x77,W
0216: SUBLW 0F
0218: BNC 0228
021A: MOVF FC9,W
021C: MOVLW FF
021E: MOVWF FC9
0220: BTFSS FC7.0
0222: BRA 0220
.................... // commands
.................... // 7 6 5 4 3 2 1 0
.................... // 0 1 b b b b b b bbbbbb=cmd
.................... // 16=0x50 set blocklength
.................... // 17=0x51 read block
.................... // 24=0x58 write block
.................... #if MMC_CMD_TRACE
0224: INCF x77,F
0226: BRA 0214
.................... printf("\n\r cmd=%2X \n\r",cmd);
.................... #endif
.................... SPI_READ(cmd);
0228: MOVF FC9,W
022A: MOVFF 16F,FC9
022E: BTFSS FC7.0
0230: BRA 022E
.................... SPI_READ(MAKE8(address,3));
0232: MOVFF 173,179
0236: MOVF FC9,W
0238: MOVFF 173,FC9
023C: BTFSS FC7.0
023E: BRA 023C
.................... SPI_READ(MAKE8(address,2));
0240: MOVFF 172,179
0244: MOVF FC9,W
0246: MOVFF 172,FC9
024A: BTFSS FC7.0
024C: BRA 024A
.................... SPI_READ(MAKE8(address,1));
024E: MOVFF 171,179
0252: MOVF FC9,W
0254: MOVFF 171,FC9
0258: BTFSS FC7.0
025A: BRA 0258
.................... SPI_READ(MAKE8(address,0));
025C: MOVFF 170,179
0260: MOVF FC9,W
0262: MOVFF 170,FC9
0266: BTFSS FC7.0
0268: BRA 0266
.................... SPI_READ(0x95); // valid crc for 0x40 only invalid for others but spi mode doesn't care
026A: MOVF FC9,W
026C: MOVLW 95
026E: MOVWF FC9
0270: BTFSS FC7.0
0272: BRA 0270
.................... for(i=0;i< tries;i++) {
0274: CLRF x77
0276: MOVF x74,W
0278: SUBWF x77,W
027A: BC 029E
.................... r1=SPI_READ(0xFF);
027C: MOVF FC9,W
027E: MOVLW FF
0280: MOVWF FC9
0282: BTFSS FC7.0
0284: BRA 0282
0286: MOVFF FC9,178
.................... #if MMC_CMD_TRACE
.................... printf(" %2X",r1);
.................... #endif
.................... if (r1==valid) break;
028A: MOVF x75,W
028C: SUBWF x78,W
028E: BNZ 0292
0290: BRA 029E
.................... if (r1==invalid) break;
0292: MOVF x76,W
0294: SUBWF x78,W
0296: BNZ 029A
0298: BRA 029E
.................... }
029A: INCF x77,F
029C: BRA 0276
.................... return(r1);
029E: MOVFF 178,01
.................... }
02A2: MOVLB 0
02A4: RETLW 00
....................
....................
.................... #separate
.................... int set_BLOCKLEN( int32 size){
.................... int r1;
....................
.................... r1=mmc_cmd(0x50,size,16,0x00,0x40); /// cmd.data,tries,valid code,invlaid code
02A6: MOVLW 50
02A8: MOVLB 1
02AA: MOVWF x6F
02AC: MOVFF 163,173
02B0: MOVFF 162,172
02B4: MOVFF 161,171
02B8: MOVFF 160,170
02BC: MOVLW 10
02BE: MOVWF x74
02C0: CLRF x75
02C2: MOVLW 40
02C4: MOVWF x76
02C6: MOVLB 0
02C8: RCALL 0210
02CA: MOVFF 01,164
.................... if (r1==0x00) goto done ;
02CE: MOVLB 1
02D0: MOVF x64,F
02D2: BNZ 02D6
02D4: BRA 02E4
.................... if (r1==0x40) goto invalid;
02D6: MOVF x64,W
02D8: SUBLW 40
02DA: BNZ 02DE
02DC: BRA 02E4
....................
....................
.................... return(false);
02DE: MOVLW 00
02E0: MOVWF 01
02E2: BRA 02F8
.................... invalid:
.................... #IF MMC_SET_BLOCK_LEN_TRACE
.................... printf("\n\r para err\n\r");
.................... #ENDIF
.................... done:
.................... block_size=size; //// assign global block size
02E4: MOVFF 163,1F
02E8: MOVFF 162,1E
02EC: MOVFF 161,1D
02F0: MOVFF 160,1C
.................... //printf("\n\r blk size=%lu",block_size);
.................... return(true);
02F4: MOVLW 01
02F6: MOVWF 01
.................... }
02F8: MOVLB 0
02FA: RETLW 00
....................
....................
.................... #separate
.................... int read_BLOCK( int32 address, char *buff){
.................... //// low level read ..requires block len to be called first to set global blocksize
.................... int r1;
.................... long i,iw; /// allows large gt 255 buff size addressing
.................... //int data[128];
.................... r1=mmc_cmd(0x51,address,16,0x00,0x40);
02FC: MOVLW 51
02FE: MOVLB 1
0300: MOVWF x6F
0302: MOVFF 167,173
0306: MOVFF 166,172
030A: MOVFF 165,171
030E: MOVFF 164,170
0312: MOVLW 10
0314: MOVWF x74
0316: CLRF x75
0318: MOVLW 40
031A: MOVWF x76
031C: MOVLB 0
031E: RCALL 0210
0320: MOVFF 01,16A
....................
.................... if (r1==0x00) goto get_token ; // we can read data payload
0324: MOVLB 1
0326: MOVF x6A,F
0328: BNZ 032C
032A: BRA 0340
.................... if (r1==0x40) goto invalid;
032C: MOVF x6A,W
032E: SUBLW 40
0330: BNZ 0334
0332: BRA 033A
....................
.................... #IF MMC_READ_BLOCK_TRACE
.................... printf("\n\r read block err 1 address=%lu \n\r",address);
.................... #ENDIF
.................... return(false);
0334: MOVLW 00
0336: MOVWF 01
0338: BRA 03C2
.................... invalid:
.................... #IF MMC_READ_BLOCK_TRACE
.................... printf("\n\r read block err 2 adress=%lu \n\r",address);
.................... #ENDIF
.................... return(false);
033A: MOVLW 00
033C: MOVWF 01
033E: BRA 03C2
.................... get_token:
.................... for(iw=0;iw<1024;iw++){
0340: CLRF x6E
0342: CLRF x6D
0344: MOVF x6E,W
0346: SUBLW 03
0348: BNC 0368
.................... r1=SPI_READ(0xFF);
034A: MOVF FC9,W
034C: MOVLW FF
034E: MOVWF FC9
0350: BTFSS FC7.0
0352: BRA 0350
0354: MOVFF FC9,16A
.................... //data[iw]=r1;
.................... if (r1==0xFE) goto read_data; // read token $FE
0358: MOVF x6A,W
035A: SUBLW FE
035C: BNZ 0360
035E: BRA 036E
.................... }
.................... #IF MMC_READ_BLOCK_TRACE
0360: INCF x6D,F
0362: BTFSC FD8.2
0364: INCF x6E,F
0366: BRA 0344
.................... printf("\n\r read block err 3 address=%lu \n\r",address);
.................... #ENDIF
.................... return(false);
0368: MOVLW 00
036A: MOVWF 01
036C: BRA 03C2
.................... read_data:
.................... #IF MMC_READ_BLOCK_TRACE
.................... printf("\n\r read block tries for FE =%lu \n\r",iw);
.................... #ENDIF
....................
.................... for (i=0;i<block_size;i++) buff[i]=SPI_READ(0xFF);
036E: CLRF x6C
0370: CLRF x6B
0372: MOVF 1F,F
0374: BNZ 0388
0376: MOVF 1E,F
0378: BNZ 0388
037A: MOVF x6C,W
037C: SUBWF 1D,W
037E: BNC 03AA
0380: BNZ 0388
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -