📄 sd.lst
字号:
C51 COMPILER V7.02b SD 03/24/2008 15:52:29 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\Output\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c LARGE OPTIMIZE(9,SIZE) BROWSE ORDER DEBUG OBJECTEXTEND PRINT(.\Output\
-Sd.lst) OBJECT(.\Output\Sd.obj)
stmt level source
1 /*
2 **********************************************************************************************
3 * Project: FS7805 SD CARD READER
4 * File: main.c
5 * Contents:
6 * The main function is SD and MMC card reader.
7 *
8 * $Date: 12/15/06 Derek V1.0
9 *
10 * Coments: This is the SD/MMC card reader firmware.
11 * When read sector,the 512 pingpong FIFO mechanism
12 * is used to improve performance.But when write sector,
13 * only single FIFO is used.
14 *
15 * $Date: 12/27/06 Derek V1.1
16 *
17 * The 512 pingpong FIFO mechanism is also used when
18 * writting sectors.
19 *
20 * $Date: 01/09/07 Derek V1.11
21 *
22 * Fix read sector error bug .
23 * Don't set FIFO_FULL bit in SetBulkInFull() function.
24 * Setting it in BulkSetDmaIn() function.
25 *
26 * $Date: 01/18/07 Derek V1.11
27 *
28 * Ignor the OUT_OF_RANGE error in SdSendCmd() when
29 * multi read the last block.
30 *
31 * Copyright (c) 2006 Fameg, Inc. All rights reserved
32 *
33 *
34 ***********************************************************************************************
35 */
36 #include "include\Include.h"
37
38 #define MAX_CMD_LEN 6
39 #define MAX_RESP_LEN 17 // Max response length = 136 bits
40 #define RSP_LEN 6
41 #define LONG_RSP_LEN 17
42 #define CARD_CMD_START 0x40
43 #define CARD_PWRUP_FINISH 0x80
44 #define OPERATION_VOL_RANGE 0x00FF0000
45 #define GOOD_CRC16_STS 0x02
46
47 /* SD_COMMAND */
48 #define SD_CMD_ONLY 1
49 #define SD_CMD_SHORT_RSP 2
50 #define SD_CMD_LONG_RSP 3
51 #define SD_CMD_TX_DATA 4
52 #define SD_CMD_TX_DATA_ONLY 5
53 #define SD_CMD_RX_DATA 6
54 #define SD_CMD_RX_DATA_ONLY 7
C51 COMPILER V7.02b SD 03/24/2008 15:52:29 PAGE 2
55
56 #define IDLE_STATE 0
57 #define READY_STATE 1
58 #define IDENTIFY_STATE 2
59 #define STANDBY_STATE 3
60 #define TRANSFER_STATE 4
61 #define DATA_STATE 5
62 #define RECEIVE_STATE 6
63 #define PRGROGAM_STATE 7
64 #define DISCONNECT_STATE 8
65
66 #define BUS_WIDTH_1BIT 0x00
67 #define BUS_WIDTH_4BIT 0x02
68
69 // Command Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
70 #define GO_IDLE_STATE 0 // V V V -
71 #define SEND_OP_COND 1 // V V R3 (OCR)
72 #define ALL_SEND_CID 2 // V V V R2
73 #define SEND_RELATIVE_ADDR 3 // R1 R1 R6 See SdGetRespType()
74 #define SET_DSR 4 // V V V -
75 #define SWITCH 6 // V R1b
76 #define CMD6 6 // R1(SD 1.10,2.0)
77 #define SELECT_CARD 7 // V V V R1
78 #define SEND_EXT_CSD 8 // V R1
79 #define SEND_IF_COND 8 // R7(SD2.0)
80 #define SEND_CSD 9 // V V V R2
81 #define SEND_CID 10 // V V V R2
82 #define READ_DAT_UNTIL_STOP 11 // V V R1
83 #define STOP_TRANS 12 // V V V R1
84 #define SEND_STATUS 13 // V V V R1
85 #define GO_INACTIVE_STATE 15 // V V V -
86 #define SET_BLOCKLEN 16 // V V V R1
87 #define READ_BLOCK 17 // V V V R1
88 #define READ_MUL_BLOCK 18 // V V V R1
89 #define WRITE_DAT_UNTIL_STOP 20 // V V R1
90 #define SET_BLOCK_COUNT 23 // V V R1
91 #define WRITE_BLOCK 24 // V V V R1
92 #define WRITE_MUL_BLOCK 25 // V V V R1
93 #define PROGRAM_CID 26 // V V R1
94 #define PROGRAM_CSD 27 // V V V R1
95 #define SET_WRITE_PROT 28 // V V V R1
96 #define CLR_WRITE_PROT 29 // V V V R1
97 #define SEND_WRITE_PROT 30 // V V V R1
98 #define ERASE_WR_BLK_START 32 // V R1
99 #define ERASE_WR_BLK_END 33 // V R1
100 #define ERASE_GROUP_START 35 // V V R1
101 #define ERASE_GROUP_END 36 // V V R1
102 #define ERASE 38 // V V V R1
103 #define FAST_IO 39 // V V R4
104 #define GO_IRQ_STATE 40 // V V R5
105 #define LOCK_UNLOCK 42 // V V V R1
106 #define APP_CMD 55 // V V V R1
107 #define GEN_CMD 56 // V V V R1
108
109 // ACMD Name Index MMC-3.1 MMC-4.0 SD-1.01 Resp
110 #define SET_BUS_WIDTH 6 // V R1
111 #define SEND_SD_STATUS 13 // V R1
112 #define SEND_NUM_WR_BLOCKS 22 // V R1
113 #define SET_WR_BLK_ERASE_CNT 23 // V R1
114 #define SD_SEND_OP_COND 41 // V R3 (OCR)
115 #define SET_CLR_CARD_DETECT 42 // V R1
116 #define SEND_SCR 51 // V R1
C51 COMPILER V7.02b SD 03/24/2008 15:52:29 PAGE 3
117
118 // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
119 // type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01
120 // page 23, MultiMediaCard will not respond to APP_CMD - CMD55.
121 // Is this a confliction ?
122
123
124 #define SdHiClk() SDMI_CTL=(SDMI_CTL|bmSD_CLK_SEL)|bmSD_CLK_EN;
125 #define SdLoClk() SDMI_CTL=(SDMI_CTL&~bmSD_CLK_SEL)|bmSD_CLK_EN;
126 #define SdStopClk() SDMI_CTL=SDMI_CTL&~bmSD_CLK_EN & ~bmSD_AUTO_CLK_EN; //06.08.22
127 #define IsCardBusy() (SDMI_ST&bmSD_BUSY)
128 #define SdWriteProtect() ((SDMI_ST & bmSD_WR_PROTECT))
129
130
131 #define SdWaitCard()\
132 {\
133 CmdTimer = SD_CMD_TIMEOUT;\
134 while (IsCardBusy() && CmdTimer);\
135 }
136
137 #define SdPowerOn()
138 #define SdPowerOff()
139
140
141 typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
142
143 /*************************************************
144 Global Variables
145 *************************************************/
146 xdata BYTE SdGetFlashInfoTimer = 0;
147 //BYTE xdata SdRespBufForProgCsd[17];
148 /*************************************************
149 Local Variables
150 *************************************************/
151 static xdata UINT32 SdAvailableBlocks = 0;
152 static xdata TCARD_TYPE CardType = CARD_SD;
153 static xdata BYTE SdCmdBuf[MAX_CMD_LEN];
154 xdata BYTE SdRespBuf[MAX_RESP_LEN];
155 static xdata UINT32 RCA = 0;
156 static BOOL MmcProtol;//控制是3.1的卡还是4.0的卡。
157 xdata BYTE SdHcFlag = 0;//Derek 2007.06.29
158 xdata BYTE SdVer2Flag = 0;//是否2.00的SD卡
159 #define TYPE_RESP_NO 0
160 #define TYPE_RESP_R1 1
161 #define TYPE_RESP_R2 2
162 #define TYPE_RESP_R3 3
163 #define TYPE_RESP_R4 4
164 #define TYPE_RESP_R5 5
165 #define TYPE_RESP_R6 6
166 #define TYPE_RESP_R7 7
167
168 /*
169 *********************************************************************************************************
170 * SdGetRespType()
171 *
172 * Description: Return response type of every command.
173 *
174 * Arguments : CmdIndex
175 *
176 * Returns : none
177 *********************************************************************************************************
178 */
C51 COMPILER V7.02b SD 03/24/2008 15:52:29 PAGE 4
179 BYTE SdGetRespType(BYTE CmdIndex)
180 {
181 1 if(CmdIndex == SEND_RELATIVE_ADDR)
182 1 {
183 2 ////if(CardType == CARD_SD)
184 2 return TYPE_RESP_R6;
185 2 ////else
186 2 //// return TYPE_RESP_R1;//对MMC,若返回R1会出现illegal command 错误标志
187 2 }
188 1 switch(CmdIndex)
189 1 {
190 2 case GO_IDLE_STATE : return TYPE_RESP_NO; break;
191 2 case SEND_OP_COND : return TYPE_RESP_R3; break;
192 2 case ALL_SEND_CID : return TYPE_RESP_R2; break;
193 2 case SET_DSR : return TYPE_RESP_NO; break;
194 2 // case SWITCH : return TYPE_RESP_R1; break;
195 2 case CMD6 : return TYPE_RESP_R1; break; //Derek 2007.07.02
196 2 case SELECT_CARD : return TYPE_RESP_R1; break;
197 2 // case SEND_EXT_CSD : return TYPE_RESP_R1; break;
198 2 case SEND_IF_COND : return TYPE_RESP_R7; break;//2007.06.29
199 2 case SEND_CSD : return TYPE_RESP_R2; break;
200 2 case SEND_CID : return TYPE_RESP_R2; break;
201 2 case READ_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
202 2 case STOP_TRANS : return TYPE_RESP_R1; break;
203 2 case SEND_STATUS : return TYPE_RESP_R1; break;
204 2 case GO_INACTIVE_STATE : return TYPE_RESP_NO; break;
205 2 case SET_BLOCKLEN : return TYPE_RESP_R1; break;
206 2 case READ_BLOCK : return TYPE_RESP_R1; break;
207 2 case READ_MUL_BLOCK : return TYPE_RESP_R1; break;
208 2 case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
209 2 case SET_BLOCK_COUNT : return TYPE_RESP_R1; break;
210 2 case WRITE_BLOCK : return TYPE_RESP_R1; break;
211 2 case WRITE_MUL_BLOCK : return TYPE_RESP_R1; break;
212 2 case PROGRAM_CID : return TYPE_RESP_R1; break;
213 2 case PROGRAM_CSD : return TYPE_RESP_R1; break;
214 2 case SET_WRITE_PROT : return TYPE_RESP_R1; break;
215 2 case CLR_WRITE_PROT : return TYPE_RESP_R1; break;
216 2 case SEND_WRITE_PROT : return TYPE_RESP_R1; break;
217 2 case ERASE_WR_BLK_START : return TYPE_RESP_R1; break;
218 2 case ERASE_WR_BLK_END : return TYPE_RESP_R1; break;
219 2 case ERASE_GROUP_START : return TYPE_RESP_R1; break;
220 2 case ERASE_GROUP_END : return TYPE_RESP_R1; break;
221 2 case ERASE : return TYPE_RESP_R1; break;
222 2 case FAST_IO : return TYPE_RESP_R4; break;
223 2 case GO_IRQ_STATE : return TYPE_RESP_R5; break;
224 2 case LOCK_UNLOCK : return TYPE_RESP_R1; break;
225 2 case APP_CMD : return TYPE_RESP_R1; break;
226 2 case GEN_CMD : return TYPE_RESP_R1; break;
227 2
228 2 // APP_CMDs
229 2 case SEND_NUM_WR_BLOCKS : return TYPE_RESP_R1; break;
230 2 case SD_SEND_OP_COND : return TYPE_RESP_R3; break;
231 2 case SEND_SCR : return TYPE_RESP_R1; break;
232 2 default : return TYPE_RESP_NO; break;
233 2 }
234 1 // Following commands are with identical index and response type:
235 1 // 1. SET_BUS_WIDTH (ACMD6) Response R1
236 1 // SWITCH (CMD6) Response R1
237 1 // 2. SEND_SD_STATUS (ACMD13) Response R1
238 1 // SEND_STATUS (CMD13) Response R1
239 1 // 3. SET_WR_BLK_ERASE_CNT (ACMD23) Response R1
240 1 // SET_BLOCK_COUNT (CMD23) Response R1
C51 COMPILER V7.02b SD 03/24/2008 15:52:29 PAGE 5
241 1 // 4. SET_CLR_CARD_DETECT (ACMD42) Response R1
242 1 // LOCK_UNLOCK (CMD42) Response R1
243 1 }
244 /*
245 *********************************************************************************************************
246 * SdSendCmd()
247 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -