例用MMC寫資料進入SD card |
缺席
|
dominicx
一般會員 發表:6 回覆:10 積分:13 註冊:2007-05-07 發送簡訊給我 |
各位大大好
小弟我在利用at89c51snd1在設計mass storage 功能是透過8051利用SC card當儲存煤體 然後透過USB進出 不過最近在寫MMC write入SD card的時候遇到問題了 小弟我研究了幾份spec, 依照上面的作法都會出現bug 不知道是不是spec內容不完整的關係還是怎樣 因此想請教有經驗的高手們, 看看我有沒有露了那個步驟? [code cpp] bit mmc_write_open (Uint32 pos) { gl_ptr_mem = pos << 9; /* gl_ptr_mem = pos * 512 */ if (mmc_mem_busy) { mmc_mem_busy = FALSE; while (Mmc_card_busy()); /* wait end of programming */ } Mmc_enable_flow_ctrl(); /* stop clock when FIFO 1&2 full*/ Mmc_set_write(); /* dir from uc to card */ Mmc_write_block_cmd(gl_ptr_mem); /* send write block */ return OK; } bit mmc_write() { int i; for(i=0;i<16;i ){ MMDAT = 't'; //initialization: put 16 bytes into MMDAT } Mmc_enable_send(); //set transmission register gl_mem_tick = MMC_RESP_TIME; while (mmc_check_response() == MMC_ERR_RESP){ printf("MMC ERR\n"); } //waiting for correct response if ((mmc_read_response() & MMC_TRAN_STATE_MSK) == MMC_TRAN_STATE){ printf("MMC transfer state\n"); //SD card is now in transmit state }else{ } for(i = 0;i<62;i ){ gl_mem_tick = MMC_DATA_TIME; //waiting for any 8 bytes buff in MMDAT getting empty while (MMINT&0x03 == 0x00){ printf("FIEI is full\n");} MMDAT = 's'; //put data into MMDAT MMDAT = 's'; //put data into MMDAT MMDAT = 's'; //put data into MMDAT MMDAT = 's'; //put data into MMDAT MMDAT = 'a'; //put data into MMDAT MMDAT = 'b'; //put data into MMDAT MMDAT = 'c'; //put data into MMDAT MMDAT = 'd'; //put data into MMDAT } return OK; /* write done */ } [/code] 裡面會呼叫到的function實做如下 [code cpp] #define Mmc_card_busy() ((MMSTA & MSK_CBUSY) == MSK_CBUSY) #define Mmc_enable_flow_ctrl() (MMCON2 |= MSK_FLOWC) #define Mmc_write_block_cmd(a) mmc_send_cmd(MMC_WRITE_SINGLE_BLOCK, a, MMC_RESP_R1) bit mmc_check_response (void) { if (Mmc_response_received()) { /* response received */ if ((MMCON0 & MSK_CRCDIS) != 0) { /* CRC7 not computed */ if ((MMSTA & MSK_RESPFS) != 0) { return (MMC_RESP_OK); } else { return (MMC_ERR_RESP); /* format error */ } } else { /* CRC7 computed */ if ((MMSTA & (MSK_RESPFS | MSK_CRC7S)) == (MSK_RESPFS | MSK_CRC7S)) { return (MMC_RESP_OK); } else { return (MMC_ERR_RESP); /* format or CRC7 error */ } } } else { /* no response received */ return (MMC_ERR_RESP); } } [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |