📄 halsd.lst
字号:
240 2 SPI_WRITE(0xFF);
241 2 UartOutText("-I-: CMD8 SD2.0 \r\n");
242 2
243 2 //halSDSPIACMD41(SD_CARD, 250);
244 2 halSDSPIACMD41(SDHC_CARD, 250);
245 2
246 2 if(sdmmc == SDHC_CARD){
247 3 //Distinguish SDHC/SD
248 3 halSDSPICmdResp(CMD58_READ_OCR, 0x95); // Response R3
249 3 while(!(SPI_STA0&SPI_RRDY));
250 3 resp = SPI_DATA;
251 3
252 3 SPI_WRITE(0xFF);
253 3 SPI_WRITE(0xFF);
254 3 SPI_WRITE(0xFF);
255 3 SPI_WRITE(0xFF);
256 3
257 3 if(0X00 == (resp&0x40)){
258 4 sdmmc = SD_CARD;
259 4 }
260 3 }
261 2 //}else if(SDMMC_RESPONSE_ILLEGAL== resp){
262 2 }else{
263 2 //SD1.0: CMD8 Not Supported
264 2 UartOutText("-I-: CMD8 SD1.0 \r\n");
265 2
266 2 WDT = 0X1F;
267 2 while(SDMMC_RESPONSE_IDLE != halSDSPICmdResp(CMD0_GO_IDLE_STATE, 0x95));
268 2 //Distinguish SD/MMC Card
269 2 halSDSPIACMD41(SD_CARD, 250);//How many retry times?
270 2
271 2 }
272 1 // else{
273 1 // UartOutText("-E-: CMD8 unknown response \r\n");
274 1 //while(1);
275 1 // }
276 1
277 1 //It's MMC card, or no SD card is attached.
278 1 rept = 0;
279 1 if(sdmmc == UNKW_CARD){
280 2 //MMC card init should be added here!!!!
281 2 *((DWORD *)cmdarg) = 0;
282 2
283 2 WDT = 0X1F;
284 2 while(SDMMC_RESPONSE_IDLE != halSDSPICmdResp(CMD0_GO_IDLE_STATE, 0x95 ));
285 2
286 2 WDT = 0X1F;
287 2 //while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD1_SEND_OP_COND, cmdarg, 0x95));
288 2 while(1){
289 3 if(SDMMC_RESPONSE_READY ==
290 3 halSDSPICmdResp(CMD1_SEND_OP_COND, 0x95)){
291 4 sdmmc = MMC_CARD;
292 4 UartOutText("MMC CMD1 done \r\n");
293 4 break;
294 4 }
295 3
296 3 rept ++;
297 3 if(rept > 250){
298 4 break;
299 4 }
300 3 }
301 2 }
C51 COMPILER V8.01 HALSD 04/17/2008 09:46:24 PAGE 6
302 1
303 1 while(sdmmc == UNKW_CARD); //Killed by watchdog
304 1
305 1 //Set block length
306 1 *((DWORD *)cmdarg) = 512;
307 1 while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD16_SET_BLOCKLEN, 0xff));
308 1 UartOutText("CMD16_SET_BLOCKLEN done \r\n");
309 1
310 1 UartOutText("-I-: sd init done \r\n\r\n");
311 1 WDT = 0X00; //Disable watchdog
312 1
313 1 #ifdef SDENUM_RETRY_ENABLE
Write_One_Byte(SDENUM_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP,SD_ENUMDONE_FLAG);
#endif
316 1
317 1 SysTicks = 0;
318 1 while(SysTicks < 10);
319 1
320 1 return TRUE;
321 1 }
322
323 BYTE halSDRead(BYTE* buffer, UDWORD lba)
324 //######################################################
325 {
326 1 BYTE bRet;
327 1 WORD j;
328 1 UDWORD startadr;
329 1
330 1 // SPI_CTL1 = SPI_750K; // set high speed
331 1 SPI_CTL1 = SD_SPI_CLK; // set speed
332 1
333 1 //calculate startadress of the sector
334 1 //startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
335 1 if(sdmmc == SDHC_CARD)
336 1 startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
337 1 else
338 1 startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
339 1
340 1 // halT1Reset();
341 1 //UartOutText("-I-: CMD17_READ_SINGLE_BLOCK \r\n");
342 1 //Command and response
343 1 *((DWORD *)cmdarg) = startadr;
344 1 //while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD17_READ_SINGLE_BLOCK, 0xff));
345 1 WDT = 0X1F;
346 1 do{
347 2 bRet = halSDSPICmdResp(CMD17_READ_SINGLE_BLOCK, 0xff);
348 2 #if 0
if (halSDCheck() == FALSE){ //SD Card is disattached
WDT = 0X00;
return FALSE;
}
#endif
354 2 }while(SDMMC_RESPONSE_READY != bRet);
355 1
356 1 WDT = 0X1F;
357 1 //what's this??????????
358 1 SDSS_ENABLE();
359 1 //Error token should be checked here.??????
360 1 do{
361 2 SPI_WRITE(0xFF);
362 2
363 2 }while (SPI_DATA & 0x1); // waitting for Data Start Token and Consuming the NAC
C51 COMPILER V8.01 HALSD 04/17/2008 09:46:24 PAGE 7
364 1 //Data block
365 1 for(j=0; j<BYTE_PER_SEC; j++){
366 2 SPI_WRITE(0xFF); // shift out a byte into SPI_DATA
367 2 buffer[j]=SPI_DATA; // store byte in buffer
368 2 } //One more SPI_WRITE(0XFF) will be used to shift bus data into SPI_DATA, and at the same time write a C
-RC byte
369 1 //CRC16
370 1 SPI_WRITE(0xFF); // 16 bit crc follows data
371 1 SPI_WRITE(0xFF); //This is not CRC byte
372 1
373 1 SDSS_DISABLE();
374 1
375 1 //UartOutText("halSDReadSector() \r\n");
376 1 WDT = 0X00;
377 1 return TRUE;
378 1 }
379
380 #ifdef WRITE_ENABLE_FLAG
BYTE halSDWriteSector(BYTE* buffer, UDWORD lba)
//######################################################
{
WORD i;
DWORD startadr;
if (halSDCheck() == FALSE){ //SD Card is disattached
return FALSE;
}
// SPI_CTL1 = SPI_750K; // set high speed
SPI_CTL1 = SD_SPI_CLK; // set speed
if(sdmmc == SDHC_CARD)
startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
else
startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
*((DWORD *)cmdarg) = startadr;
while(SDMMC_RESPONSE_READY != halSDSPICmdResp(SD_WRITE_BLOCK, 0xff));
SPI_WRITE(0xFE); // start block token
for(i=0; i<BYTE_PER_SEC; i++){
SPI_WRITE(*buffer++);
}
SPI_WRITE(0xFF); // 16 bit crc follows data
SPI_WRITE(0xFF);
WDT = 0X1F;
SPI_WRITE(0xFF); // read data response
SPI_WRITE(0xFF); //Now the data response will be in register SPI_DATA
//UartOutText("-I-: SPI_DATA 0x"); UartOutValue(SPI_DATA, 2);
if((SPI_DATA&0x1F) != 0x05){ // data block rejected
UartOutText("-E-: SD Write data Resp. Error 0x"); UartOutValue(SPI_DATA, 2);
//return 1;
}else{ // data block accepted
UartOutText("-I-: SD Write data Resp. OK 0x"); UartOutValue(SPI_DATA, 2);
}
do {
SPI_WRITE(0xFF);
}while(SPI_DATA == 0x00); //A zero value of R1b is busy, a non-zero value is ready
//}while(SPI_DATA !=0xFF); // wait til busy is gone
C51 COMPILER V8.01 HALSD 04/17/2008 09:46:24 PAGE 8
UartOutText("-I-: halSDWriteSector() \r\n");
WDT = 0X00;
return TRUE;
}
#endif
431
432 //This function will send size sectors from lba to mp3 dec
433 BYTE halSDReadMp3(DWORD lba)
434 {
435 1 DWORD startadr;
436 1
437 1 SPI_CTL1 = SPI_3M; // set high speed
438 1 if(sdmmc == SDHC_CARD)
439 1 startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
440 1 else
441 1 startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
442 1
443 1 SD_CMD = SD_READ_BLOCK;
444 1 SD_DATA0 = ((BYTE *)(&startadr))[0];
445 1 SD_DATA1 = ((BYTE *)(&startadr))[1];
446 1 SD_DATA2 = ((BYTE *)(&startadr))[2];
447 1 SD_DATA3 = ((BYTE *)(&startadr))[3];
448 1 SD_CKSUM = 0xFF;
449 1 SD_CTL0 = 0x83; // enable SD transfer
450 1
451 1 WDT = 0X1F;
452 1 while(1){
453 2 if(SD_STA1 & 0x2){
454 3 SD_STA1 = 0x2;
455 3 break;
456 3 }
457 2 #if 0
if (halSDCheck() == FALSE){ //SD Card is disattached
UartOutText("-W-: SD DisAttach! \r\n");
return FALSE;
}
#endif
463 2 }
464 1 //UartOutText("halSDReadMp3() done\r\n");
465 1 //UartOutText("-A-");
466 1
467 1 WDT = 0X00;
468 1 return TRUE;
469 1 }
470 #endif
471
472
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 776 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 4 24
PDATA SIZE = ---- ----
DATA SIZE = 1 6
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -