全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1525
推到 Plurk!
推到 Facebook!

例用MMC寫資料進入SD card

缺席
dominicx
一般會員


發表:6
回覆:10
積分:13
註冊:2007-05-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-15 20:34:53 IP:220.132.xxx.xxx 訂閱
各位大大好
小弟我在利用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]
編輯記錄
dominicx 重新編輯於 2009-05-15 20:35:33, 註解 無‧
dominicx 重新編輯於 2009-05-15 20:36:16, 註解 無‧
dominicx 重新編輯於 2009-05-15 20:38:00, 註解 無‧
系統時間:2024-05-06 4:36:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!