⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc.lst

📁 MMC/SD on Olimex Sam7-EX256
💻 LST
📖 第 1 页 / 共 4 页
字号:
   1              		.code	16   2              		.file	"mmc.c"  10              	.Ltext0:  11              		.global	mmc_buffer  12              		.bss  15              	mmc_buffer:  16 0000 00000000 		.space	512  16      00000000   16      00000000   16      00000000   16      00000000   17              		.global	s_pPDC  18              		.data  19              		.align	2  22              	s_pPDC:  23 0000 0001FEFF 		.word	-130816  24              		.global	s_pPMC  25              		.align	2  28              	s_pPMC:  29 0004 00FCFFFF 		.word	-1024  30              		.global	s_pPio  31              		.align	2  34              	s_pPio:  35 0008 00F4FFFF 		.word	-3072  36              		.global	s_pSpi  37              		.align	2  40              	s_pSpi:  41 000c 0000FEFF 		.word	-131072  42              		.text  43              		.align	2  44              		.global	Delays  45              		.code 16  46              		.thumb_func  48              	Delays:  49              	.LFB2:  50              		.file 1 "mmc.c"   1:mmc.c         **** // mmc.c : MultiMediaCard functions: init, read, write ...
   2:mmc.c         **** //
   3:mmc.c         **** // Rolf Freitag 5/2003
   4:mmc.c         **** //
   5:mmc.c         **** 
   6:mmc.c         **** 
   7:mmc.c         **** 
   8:mmc.c         **** // MMC Lib
   9:mmc.c         **** #ifndef _MMCLIB_C
  10:mmc.c         **** #define _MMCLIB_C
  11:mmc.c         **** //---------------------------------------------------------------------
  12:mmc.c         **** #include "include/include.h"
  13:mmc.c         **** 
  14:mmc.c         **** 
  15:mmc.c         **** #include  "math.h"
  16:mmc.c         **** #include  "string.h"
  17:mmc.c         **** 
  18:mmc.c         **** 
  19:mmc.c         **** AT91PS_SPI s_pSpi = AT91C_BASE_SPI0;
  20:mmc.c         **** AT91PS_PIO s_pPio = AT91C_BASE_PIOA;
  21:mmc.c         **** AT91PS_PMC s_pPMC = AT91C_BASE_PMC;
  22:mmc.c         **** AT91PS_PDC s_pPDC = AT91C_BASE_PDC_SPI0;
  23:mmc.c         **** 
  24:mmc.c         **** 
  25:mmc.c         **** char mmcGetResponse(void);
  26:mmc.c         **** char mmcGetXXResponse(const char resp);
  27:mmc.c         **** char mmcCheckBusy(void);
  28:mmc.c         **** 
  29:mmc.c         **** void initSSP (void);
  30:mmc.c         **** 
  31:mmc.c         **** char mmc_buffer[512] = { 0 };	// Buffer for mmc i/o for data and registers
  32:mmc.c         **** extern char card_state;		// 0 for no card found, 1 for card found (init successfull)
  33:mmc.c         **** 
  34:mmc.c         **** 
  35:mmc.c         **** //---------------------------------------------------------------------
  36:mmc.c         **** void Delays (unsigned long a) { while (--a!=0); }
  51              		.loc 1 36 0  52              	.LVL0:  53              		@ lr needed for prologue  54              		.loc 1 36 0  55 0000 0023     		mov	r3, #0  56              	.L3:  57 0002 0133     		add	r3, r3, #1  58 0004 8342     		cmp	r3, r0  59 0006 FCD1     		bne	.L3  60              		@ sp needed for prologue  61 0008 7047     		bx	lr  62              	.LFE2:  64 000a 0000     		.align	2  65              		.global	initSPI_port  66              		.code 16  67              		.thumb_func  69              	initSPI_port:  70              	.LFB3:  37:mmc.c         **** 
  38:mmc.c         **** 
  39:mmc.c         **** void initSPI_port (void) {
  71              		.loc 1 39 0  72              	.LVL1:  40:mmc.c         **** 
  41:mmc.c         ****   //Card present -> CP - PA15
  42:mmc.c         ****   s_pPio->PIO_ODR = BIT15; //Configure in Input
  73              		.loc 1 42 0  74 000c 054B     		ldr	r3, .L10  75 000e 1A68     		ldr	r2, [r3]  76 0010 8023     		mov	r3, #128  77 0012 1B02     		lsl	r3, r3, #8  78 0014 5361     		str	r3, [r2, #20]  43:mmc.c         ****   s_pPio->PIO_PER = BIT15; //Enable PA15
  79              		.loc 1 43 0  80 0016 1360     		str	r3, [r2]  44:mmc.c         **** 
  45:mmc.c         ****   //Write protect -> WP - PA16
  46:mmc.c         ****   s_pPio->PIO_ODR = BIT16; //Configure in Input
  81              		.loc 1 46 0  82 0018 8023     		mov	r3, #128  83 001a 5B02     		lsl	r3, r3, #9  84 001c 5361     		str	r3, [r2, #20]  85              		.loc 1 39 0  86              		@ lr needed for prologue  47:mmc.c         ****   s_pPio->PIO_PER = BIT16; //Enable PA16
  87              		.loc 1 47 0  88 001e 1360     		str	r3, [r2]  48:mmc.c         **** 
  49:mmc.c         **** }
  89              		.loc 1 49 0  90              		@ sp needed for prologue  91 0020 7047     		bx	lr  92              	.L11:  93 0022 0000     		.align	2  94              	.L10:  95 0024 00000000 		.word	s_pPio  96              	.LFE3:  98              		.align	2  99              		.global	initSPI 100              		.code 16 101              		.thumb_func 103              	initSPI: 104              	.LFB4:  50:mmc.c         **** 
  51:mmc.c         **** // setup usart1 in spi mode
  52:mmc.c         **** void initSPI (void)
  53:mmc.c         **** {
 105              		.loc 1 53 0 106              	.LVL2:  54:mmc.c         **** 
  55:mmc.c         ****   // Init SPI0
  56:mmc.c         ****   //set functionality to pins:
  57:mmc.c         ****   //port0.12 -> NPCS0
  58:mmc.c         ****   //port0.16 -> MISO
  59:mmc.c         ****   //port0.17 -> MOSI
  60:mmc.c         ****   //port0.18 -> SPCK
  61:mmc.c         ****   s_pPio->PIO_PDR = BIT13 | BIT16 | BIT17 | BIT18;
 107              		.loc 1 61 0 108 0028 0E4B     		ldr	r3, .L14 109 002a 1A68     		ldr	r2, [r3] 110 002c E423     		mov	r3, #228 111 002e DB02     		lsl	r3, r3, #11 112 0030 5360     		str	r3, [r2, #4]  62:mmc.c         ****   s_pPio->PIO_ASR = BIT13 | BIT16 | BIT17 | BIT18;
 113              		.loc 1 62 0 114 0032 1367     		str	r3, [r2, #112]  63:mmc.c         ****   s_pPio->PIO_BSR = 0;
 115              		.loc 1 63 0 116 0034 0023     		mov	r3, #0 117 0036 5367     		str	r3, [r2, #116]  64:mmc.c         **** 
  65:mmc.c         **** 
  66:mmc.c         ****   //enable the clock of SPI
  67:mmc.c         ****   s_pPMC->PMC_PCER = 1 << AT91C_ID_SPI0;
 118              		.loc 1 67 0 119 0038 0B4B     		ldr	r3, .L14+4 120 003a 1A68     		ldr	r2, [r3] 121 003c 1023     		mov	r3, #16 122 003e 1361     		str	r3, [r2, #16]  68:mmc.c         ****   //l_pPMC->PMC_PCER = 1 << 5;
  69:mmc.c         **** 
  70:mmc.c         ****   // Fixed mode
  71:mmc.c         ****   s_pSpi->SPI_CR      = 0x81;               //SPI Enable, Sowtware reset
 123              		.loc 1 71 0 124 0040 0A4B     		ldr	r3, .L14+8 125 0042 1A68     		ldr	r2, [r3] 126 0044 8123     		mov	r3, #129 127 0046 1360     		str	r3, [r2]  72:mmc.c         ****   s_pSpi->SPI_CR      = 0x01;               //SPI Enable
 128              		.loc 1 72 0 129 0048 0123     		mov	r3, #1 130 004a 1360     		str	r3, [r2]  73:mmc.c         **** 
  74:mmc.c         ****   s_pSpi->SPI_MR      = 0xD0019;            //Master mode, fixed select, disable decoder, FDIV=1 (M 131              		.loc 1 74 0 132 004c 084B     		ldr	r3, .L14+12 133 004e 5360     		str	r3, [r2, #4]  75:mmc.c         **** 
  76:mmc.c         ****   //s_pSpi->SPI_CSR[1]  = 0x4A02;             //8bit, CPOL=0, ClockPhase=1, SCLK = 200kHz 
  77:mmc.c         ****   s_pSpi->SPI_CSR[1]  = 0x00001F02;           //8bit, CPOL=0, ClockPhase=1, SCLK = 48Mhz/32*31 = 48 134              		.loc 1 77 0 135 0050 084B     		ldr	r3, .L14+16 136 0052 5363     		str	r3, [r2, #52]  78:mmc.c         **** 
  79:mmc.c         ****   s_pPDC->PDC_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
 137              		.loc 1 79 0 138 0054 084B     		ldr	r3, .L14+20 139 0056 0949     		ldr	r1, .L14+24 140 0058 1B68     		ldr	r3, [r3]  80:mmc.c         ****   s_pSpi->SPI_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;
 141              		.loc 1 80 0 142 005a FC32     		add	r2, r2, #252 143              		.loc 1 79 0 144 005c 1962     		str	r1, [r3, #32] 145              		.loc 1 53 0 146              		@ lr needed for prologue 147              		.loc 1 80 0 148 005e 5162     		str	r1, [r2, #36]  81:mmc.c         **** 
  82:mmc.c         **** }
 149              		.loc 1 82 0 150              		@ sp needed for prologue 151 0060 7047     		bx	lr 152              	.L15: 153 0062 0000     		.align	2 154              	.L14: 155 0064 00000000 		.word	s_pPio 156 0068 00000000 		.word	s_pPMC 157 006c 00000000 		.word	s_pSpi 158 0070 19000D00 		.word	851993 159 0074 021F0000 		.word	7938 160 0078 00000000 		.word	s_pPDC 161 007c 01010000 		.word	257 162              	.LFE4: 164              		.align	2 165              		.global	spiSendByte 166              		.code 16 167              		.thumb_func 169              	spiSendByte: 170              	.LFB13:  83:mmc.c         **** 
  84:mmc.c         **** 
  85:mmc.c         **** // Initialisieren
  86:mmc.c         **** char initMMC (void)
  87:mmc.c         **** {
  88:mmc.c         **** 
  89:mmc.c         ****   //raise SS and MOSI for 80 clock cycles
  90:mmc.c         ****   //SendByte(0xff) 10 times with SS high
  91:mmc.c         ****   //RAISE SS
  92:mmc.c         ****   int i;
  93:mmc.c         ****   char response=0x01;
  94:mmc.c         **** 
  95:mmc.c         **** 
  96:mmc.c         ****  // debug_printf("Start iniMMC......");
  97:mmc.c         ****   initSPI();
  98:mmc.c         ****   //initialization sequence on PowerUp
  99:mmc.c         ****   ///CS_HIGH();
 100:mmc.c         ****   for(i=0;i<=9;i++)
 101:mmc.c         ****     spiSendByte(0xff);
 102:mmc.c         ****   ///CS_LOW();
 103:mmc.c         ****   //Send Command 0 to put MMC in SPI mode
 104:mmc.c         ****   mmcSendCmd(0x00,0,0x95);
 105:mmc.c         ****   //Now wait for READY RESPONSE
 106:mmc.c         ****   if(mmcGetResponse()!=0x01);
 107:mmc.c         **** //       debug_printf("no responce");
 108:mmc.c         **** 
 109:mmc.c         ****   while(response==0x01)
 110:mmc.c         ****   {
 111:mmc.c         ****  //  debug_printf("Sending Command 1");
 112:mmc.c         ****    //CS_HIGH();
 113:mmc.c         ****    spiSendByte(0xff);
 114:mmc.c         ****    //CS_LOW();
 115:mmc.c         ****    mmcSendCmd(0x01,0x00,0xff);
 116:mmc.c         ****    response=mmcGetResponse();
 117:mmc.c         ****   }
 118:mmc.c         ****   //CS_HIGH();
 119:mmc.c         ****   spiSendByte(0xff);
 120:mmc.c         ****  // debug_printf("MMC INITIALIZED AND SET TO SPI MODE PROPERLY.");
 121:mmc.c         ****   return MMC_SUCCESS;
 122:mmc.c         **** }
 123:mmc.c         **** 
 124:mmc.c         **** 
 125:mmc.c         **** 
 126:mmc.c         **** // Ti added mmc Get Responce
 127:mmc.c         **** char mmcGetResponse(void)
 128:mmc.c         **** {
 129:mmc.c         ****   //Response comes 1-8bytes after command
 130:mmc.c         ****   //the first bit will be a 0
 131:mmc.c         ****   //followed by an error code
 132:mmc.c         ****   //data will be 0xff until response
 133:mmc.c         ****   int i=0;
 134:mmc.c         **** 
 135:mmc.c         ****   char response;
 136:mmc.c         **** 
 137:mmc.c         ****   while(i<=64)
 138:mmc.c         ****   {
 139:mmc.c         ****    response=spiSendByte(0xff);
 140:mmc.c         ****    if(response==0x00)break;
 141:mmc.c         ****    if(response==0x01)break;
 142:mmc.c         ****    i++;
 143:mmc.c         ****   }
 144:mmc.c         ****   return response;
 145:mmc.c         **** }
 146:mmc.c         **** 
 147:mmc.c         **** char mmcGetXXResponse(const char resp)
 148:mmc.c         **** {
 149:mmc.c         ****   //Response comes 1-8bytes after command
 150:mmc.c         ****   //the first bit will be a 0
 151:mmc.c         ****   //followed by an error code
 152:mmc.c         ****   //data will be 0xff until response
 153:mmc.c         ****   int i=0;
 154:mmc.c         **** 
 155:mmc.c         ****   char response;
 156:mmc.c         **** 
 157:mmc.c         ****   while(i<=500)
 158:mmc.c         ****   {
 159:mmc.c         ****    response=spiSendByte(0xff);
 160:mmc.c         ****    if(response==resp)break;
 161:mmc.c         ****    i++;
 162:mmc.c         ****   }
 163:mmc.c         ****   return response;
 164:mmc.c         **** }
 165:mmc.c         **** char mmcCheckBusy(void)
 166:mmc.c         **** {
 167:mmc.c         ****   //Response comes 1-8bytes after command
 168:mmc.c         ****   //the first bit will be a 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -