📄 sd.lst
字号:
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN sd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sd.c OMF2 OPTIMIZE(6,SPEED) BROWSE VARBANKING DEBUG
line level source
1 #include "dp8051.h"
2 #include "config.h"
3 #include "absacc.h"
4 #include "constant.h"
5 #include "variable.h"
6 #include "function.h"
7 #include "sdhost.h"
8 #include "sssmp3_regs.h"
9 #include "fat.h"
10 #include "mp3_appl.h"
11 //***********************************************
12 idata Uint32 sd_mem_size; /* memory disk size in pages */
13
14 #define Sd_disk_size() ((Uint32)(sd_mem_size))
15
16 /************************************************
17 函 数 名: SYSDelay()
18 功 能:系统延时
19 说 明:
20 调 用:
21 全局变量:i
22 入口参数:无
23 出口参数:无
24 返 回 值:无
25 ************************************************/
26 void SYSDelay(void)
27 {
28 1 for(varAl.i = 0; varAl.i < 0x1fff; varAl.i++);
29 1 }
30 /************************************************
31 函 数 名: SDCIF_Init()
32 功 能:SD Host初始化
33 说 明:
34 调 用:
35 全局变量:
36 入口参数:无
37 出口参数:无
38 返 回 值:无
39 ************************************************/
40 void SDCIF_Init(void)
41 {
42 1 SDH_CLOCK = 0x03;//32分频
43 1 SDH_DMA_CS = 0x05;//SRAM5
44 1 SDIFCON0 = CLK_EN;//clock enable
45 1 BLKCNT11_08 = 0;
46 1 BLKCNT07_00 = 0;
47 1 BLKLEN11_08 = 0x02;
48 1 BLKLEN07_00 = 0x00;
49 1 DATACON = 0x00;
50 1 DTIMER15_08 = 0xFF;
51 1 DTIMER07_00 = 0xFF;
52 1 }
53 /************************************************
54 函 数 名: GetSDMemoryOCR()
55 功 能:获得SD卡Operating Conditions Register
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 2
56 说 明:SDCIF_IF: 0 -> SD Memory,1 -> SDIO,2 --> MMC
57 调 用:
58 全局变量:RCA, OCR, SDCIF_IF
59 入口参数:无
60 出口参数:无
61 返 回 值:OK or KO
62 ************************************************/
63 bit GetSDMemoryOCR(void)
64 {
65 1 bit flag = 0;
66 1 SDCIF_CMD0();
67 1
68 1 SDVar.RCA[1] = 0;
69 1 SDVar.RCA[0] = 0;
70 1
71 1 SDVar.OCR[3] = 0;
72 1 SDVar.OCR[2] = 0;
73 1 SDVar.OCR[1] = 0;
74 1 SDVar.OCR[0] = 0;
75 1 do
76 1 {
77 2 if(SDCIF_CMD55())
78 2 {
79 3 if(SDCIF_ACMD41())
80 3 {
81 4 SDVar.OCR[3] = RESP119_112 & 0x7F;
82 4 SDVar.OCR[2] = RREP111_104;
83 4 SDVar.OCR[1] = RREP103_096;
84 4 SDVar.OCR[0] = RREP095_088;
85 4 }
86 3 else
87 3 {
88 4 flag = 1;
89 4 break;
90 4 }
91 3 }
92 2 else
93 2 {
94 3 flag = 1;
95 3 break;
96 3 }
97 2 }while(!(RESP119_112 & 0x80));
98 1 SDVar.SDCIF_IF = 0;//0 -> SD Memory
99 1
100 1 //MMC
101 1 if(!flag)
102 1 return OK;
103 1 else
104 1 {
105 2 SDCIF_CMD0();
106 2 SDVar.OCR[3] = 0;
107 2 SDVar.OCR[2] = 0;
108 2 SDVar.OCR[1] = 0;
109 2 SDVar.OCR[0] = 0;
110 2 do
111 2 {
112 3 if(SDCIF_CMD1())
113 3 {
114 4 SDVar.OCR[3] = RESP119_112 & 0x7F;
115 4 SDVar.OCR[2] = RREP111_104;
116 4 SDVar.OCR[1] = RREP103_096;
117 4 SDVar.OCR[0] = RREP095_088;
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 3
118 4 }
119 3 else
120 3 return KO;
121 3 }while(!(RESP119_112 & 0x80));
122 2 SDVar.SDCIF_IF = 2;//2 --> MMC
123 2 return OK;
124 2 }
125 1 }
126 /************************************************
127 函 数 名: SDMemoryCardInit()
128 功 能:SD卡初始化
129 说 明:
130 调 用:
131 全局变量:BusBits
132 入口参数:无
133 出口参数:无
134 返 回 值:无
135 ************************************************/
136 void SDMemoryCardInit(void)
137 {
138 1 if(!SDCIF_CMD2())
139 1 {
140 2 if(SDVar.SDCIF_IF == 2)
141 2 {
142 3 SDH_CLOCK = 0x19;
143 3 SYSDelay();
144 3 GetSDMemoryOCR();
145 3 if(!SDCIF_CMD2())
146 3 {
147 4 SDH_CLOCK = 0x7F;
148 4 SYSDelay();
149 4 GetSDMemoryOCR();
150 4 SDCIF_CMD2();
151 4 }
152 3 }
153 2 }
154 1
155 1 SDCIF_CMD3();
156 1
157 1 SDCIF_CMD09();
158 1 SDCIF_SDIOCMD7();
159 1
160 1 if(!SDVar.SDCIF_IF)
161 1 {
162 2 SDCIF_CMD55();
163 2 SDVar.BusBits = 2;//2 -> 4-bit bus
164 2 SDCIF_ACMD06();//set bus wide
165 2 /*if(SDVar.ErrVal)
166 2 {
167 2 //while(P1_6);
168 2 SDIFCON0 = 0x00;
169 2 SYSDelay();
170 2 (*(void(*)())0)();
171 2 }*/
172 2 }
173 1 SDH_CLOCK = CLK_SEL;//system clock
174 1
175 1 DTIMER15_08 = 0x00;
176 1 DTIMER07_00 = 0x2E;
177 1 }
178 /************************************************
179 函 数 名: SDCIF_CMD0()
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 4
180 功 能:Resets all cards to Idle State
181 说 明:
182 调 用:
183 全局变量:
184 入口参数:无
185 出口参数:无
186 返 回 值:无
187 ************************************************/
188 //复位SD卡,进入空闲状态
189 void SDCIF_CMD0(void)
190 {
191 1 //ARG31_24 = 0;//argument dont't care
192 1 //ARG23_16 = 0;
193 1 //ARG15_08 = 0;
194 1 //ARG07_00 = 0;
195 1 CMDCON = 0;
196 1 CMDINDEX = GO_IDLE_STATE;
197 1 while(!(STATUS07_00 & CMDSEND));
198 1 STATUS07_00 = 0xFF;
199 1 }
200 /************************************************
201 函 数 名: SDCIF_CMD1()
202 功 能:ask MMC to send their Operation Conditions
203 说 明:
204 调 用:
205 全局变量:OCR
206 入口参数:无
207 出口参数:无
208 返 回 值:OK or KO
209 ************************************************/
210 bit SDCIF_CMD1(void)// MMC card used
211 {
212 1 ARG31_24 = SDVar.OCR[3];//argument = OCR
213 1 ARG23_16 = SDVar.OCR[2];
214 1 ARG15_08 = SDVar.OCR[1];
215 1 ARG07_00 = SDVar.OCR[0];
216 1 CMDCON = WAITRSP;
217 1 CMDINDEX = SEND_OP_COND;
218 1 while(!(STATUS07_00 & CMDSEND));
219 1 while(!(STATUS07_00 & RSPRXVP))
220 1 {
221 2 if((STATUS07_00 & RSPTIMEOUT))
222 2 {
223 3 STATUS07_00 = 0xFF;
224 3 return KO;
225 3 }
226 2 }
227 1 STATUS07_00 = 0xFF;
228 1 return OK;
229 1 }
230 /************************************************
231 函 数 名: SDCIF_CMD2()
232 功 能:Asks any card to send their CID numbers on the CMD line
233 说 明:
234 调 用:
235 全局变量:
236 入口参数:无
237 出口参数:无
238 返 回 值:OK or KO
239 ************************************************/
240 //获得CID(card identification) 进入识别状态
241 bit SDCIF_CMD2(void)
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 5
242 {
243 1 //argument dont't care
244 1
245 1 CMDCON = (LONGRSP | WAITRSP);
246 1 CMDINDEX = ALL_SEND_CID;
247 1 while(!(STATUS07_00 & CMDSEND));
248 1 while(!(STATUS07_00 & RSPRXVP))
249 1 {
250 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
251 2 {
252 3 STATUS07_00 = 0xFF;
253 3 return KO;
254 3 break;
255 3 }
256 2 }
257 1 STATUS07_00 = 0xFF;
258 1 return OK;
259 1 }
260 /************************************************
261 函 数 名: SDCIF_CMD3()
262 功 能:Asks the card to publish a new relative address
263 说 明:get RCA
264 调 用:
265 全局变量:RCA
266 入口参数:无
267 出口参数:无
268 返 回 值:OK or KO
269 ************************************************/
270 //获得RCA(relative card address)
271 bit SDCIF_CMD3(void)
272 {
273 1 //argument dont't care if SD
274 1 if(SDVar.SDCIF_IF)//MMC or SDIO
275 1 {
276 2 SDVar.RCA[1] = 0;
277 2 SDVar.RCA[0] = 1;
278 2 ARG31_24 = SDVar.RCA[1];
279 2 ARG23_16 = SDVar.RCA[0];
280 2 ARG15_08 = 0;
281 2 ARG07_00 = 0;
282 2 }
283 1 CMDCON = WAITRSP;
284 1 CMDINDEX = SEND_RCA;
285 1 while(!(STATUS07_00 & CMDSEND));
286 1 while(!(STATUS07_00 & RSPRXVP))
287 1 {
288 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
289 2 {
290 3 STATUS07_00 = 0xFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -