線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4145
推到 Plurk!
推到 Facebook!

SD卡的讀與寫

缺席
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-18 00:49:31 IP:140.116.xxx.xxx 未訂閱
hi all 我最近正在嘗試SD卡的讀寫 使用AT89C51ED2用SPI來控制SD卡的讀寫 目前已經可以讀取資料了 比對過WINHEX所讀資料都正確 不過我覺得懷疑的是在sd datasheet中 "CMD17 32-bit Block Address Read a single block." 他好像只有讀一個block的命令 (我將SD設 1block = 512Byte) 我覺得還蠻不合理的 如果我知道他的address...那我想讀出12bit的話 不就要找到他是在哪個block 再算他是這512Byte中的哪一個? 同理 寫入的話更慘 寫入12bit在某個address後面 不就要先讀512Byte 再更改掉我們要的address的資料 再將更改過的512Byte寫回去?? 不知道各位寫過SD的大大們 遇到這種情形該怎麼解決呢? 他的流程是怎樣? <問題> 假設讀取12bit於SD卡? <問題> 假設寫入12bit於SD卡?
ryuhuang
一般會員


發表:0
回覆:7
積分:1
註冊:2004-03-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-18 09:45:32 IP:220.130.xxx.xxx 未訂閱
SD/MMC卡的Address是以Byte為單位的, 而新的SD卡的規格則改成Block Address, 不過目前應該還沒有新格規的SD卡, 不過指定的Address必須是Block Length的倍數, 如果今天Block Length=512, 則Address只能是0, 0x200, 0x400, 0x600, 0x800...等等, 如果是Block Length=256, 則Address可以是0, 0x100, 0x200, 0x300, 0x400...等等, 而Block Length可以是1~512。 要支援Partial Read/Write的卡才能在非512倍數的Address做讀寫, 通常都會支援Partial Read, 而Partial Write通常是沒支援的。
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-28 23:29:03 IP:140.116.xxx.xxx 未訂閱
引言: SD/MMC卡的Address是以Byte為單位的, 而新的SD卡的規格則改成Block Address, 不過目前應該還沒有新格規的SD卡, 不過指定的Address必須是Block Length的倍數, 如果今天Block Length=512, 則Address只能是0, 0x200, 0x400, 0x600, 0x800...等等, 如果是Block Length=256, 則Address可以是0, 0x100, 0x200, 0x300, 0x400...等等, 而Block Length可以是1~512。 要支援Partial Read/Write的卡才能在非512倍數的Address做讀寫, 通常都會支援Partial Read, 而Partial Write通常是沒支援的。
hi ryuhuang DataSheet裡面有段話 READ_BL_LEN The Maximum read data block length for reading is computed as 2^READ_BL_LEN. READ_BL_LEN is always equal to WRITE_BL_LEN. READ_BL_LEN Block Length 0-8 Reserved 9 = 2^9 = 512Bytes 10 = 2^10 = 1024Bytes 11 = 2^11 = 2048Bytes 12-15 Reserved 依照上述說法 好像0~8是保留值 所以有作用的是9,10,11 ?? 我TEST的SD卡是16mb的 目前是用9 一次讀512Bytes 有時間會測試0~8能不能正確動作 只是DataSheet的說法讓我覺得很奇怪就是了
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-29 16:16:21 IP:140.116.xxx.xxx 未訂閱
引言: SD/MMC卡的Address是以Byte為單位的, 而新的SD卡的規格則改成Block Address, 不過目前應該還沒有新格規的SD卡, 不過指定的Address必須是Block Length的倍數, 如果今天Block Length=512, 則Address只能是0, 0x200, 0x400, 0x600, 0x800...等等, 如果是Block Length=256, 則Address可以是0, 0x100, 0x200, 0x300, 0x400...等等, 而Block Length可以是1~512。 要支援Partial Read/Write的卡才能在非512倍數的Address做讀寫, 通常都會支援Partial Read, 而Partial Write通常是沒支援的。
目前已經能在Address讀2Byte了 不過好像write部分不能這樣做 DataSheet裡寫 The default block length is as specified in the CSD (512 bytes). A set block length of less than 512 bytes will cause a write error. The only valid write set block length is 512 bytes. CMD16 is not mandatory if the default is accepted. 所以Write好像只能一次寫512Byte 不知道大大有沒有什麼方法可以讓他能在某位址後寫1~2個Byte~~? Regard. 發表人 - killop 於 2005/11/29 16:23:50
ssejack
高階會員


發表:87
回覆:143
積分:106
註冊:2005-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-30 11:53:16 IP:59.105.xxx.xxx 未訂閱
Hi killop: SD/CF card 的紀憶體是使用 nand type flash,而此flash 的 write (programming)方式是以 sector (or block)為單位(256/512/1024 byte...),所以無法只寫入單一定址;一般 drive 上看到的寫入單一 byte or 非 sector 整數倍資料係透過 讀取完整sector資料 -> 修改對應位置資料 -> (sector erase first)寫回整個sector 來達成的!
系統時間:2024-07-06 11:02:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!