[筆記]SD卡相關資料

 ESD靜電放電模塊php

  • 我知道的flash分爲兩種NOR flash和NAND flash,NOR falsh容量通常爲1~16M用於單片機代碼存儲,NAND flash最小的是8M最大的如今據說有90G還可能更大,通常用在大容量存儲方面。
  • VGA芯片AD8367是AD公司推出的
  • 鎂光(Micron)身爲世界第二大內存顆粒製造商,OWD22-D9LCQ  作DDR3用的。
  • 三星的FLASH芯片NAND 容量的K9F1G08U00,配置STM32 ARM芯片用。

 

來源:http://blog.sina.com.cn/s/blog_4ada01d8010006h7.htmlhtml

來源:DDR內存條比較http://wenku.baidu.com/link?url=WgIvJUndrCDTj9gvCHnFlJv2PtHEkefYFko8twldRiT7THj2e-t5pbCq8rZDwaWIWCwC50jYEiquIh2zGd00wcrnDOQ8QgeW6xCtM93U5Wujava

bandwidth - 硬件帶寬,單位爲Hz(赫茲)。單位時間中線路(傳輸系統)中電信號的最大振盪頻率,超過此頻率硬件將沒法保證信號傳輸的正確性。算法

data rate - 數據傳輸率,單位爲bps(bits per second),單位傳輸的二進制位的數目。編程

throughtput - 吞吐量,單位爲bps(bits per second),數據經過網絡的傳輸速率。緩存

 吞吐量是經過頻率和帶寬算出來的,帶寬和頻率。好比PCI,IDE,AGP,USB。網絡

計算公式:數據帶寬=時鐘頻率×數據總線位數/8(單位:byte/s)app

內存帶寬計算公式:帶寬=內存核心頻率×內存總線位數×倍增係數。函數

DDR3預讀取位數8bit須要4個時鐘週期完成,因此DDR3的I/O時鐘頻率是存儲單元核心頻率的4倍,因爲是上下沿都在傳輸數據,因此實際有效的數據傳輸頻率達到核心頻率的8倍。 工具

內存標準核心頻率,I/O 頻率,有效傳輸頻率,單通道帶寬,雙通道帶寬。。

內存條有三種不一樣的頻率指標,它們分別是核心頻率、時鐘頻率和有效數據傳輸頻率。核心頻率即爲內存Cell陣列(Memory Cell Array)的工做頻率,它是內存的真實運行頻率;時鐘頻率即I/O Buffer(輸入/輸出緩存)的傳輸頻率(預讀取位數8位);而有效數據傳輸頻率則是指數據傳送的頻率(時鐘的上升沿和降低沿都採集數據)。Cell和Bank。數據總線位寬一直是64bit。

DDR3-800內存有效數據傳輸頻率爲800MHz,其I/O頻率爲400MHz,核心頻率只有100MHz。

DDR3-1600有效數據傳輸頻率爲1600MHZ,I/O時鐘頻率800MHZ,核心頻率是200MHZ。

AGP總線帶寬:
AGP1x總線帶寬=66MHZ*32bit/8=264MB/s
AGP8x總線帶寬=66MHZ*32bit/8=2.1GB/s
PCI總線帶寬:PCI帶寬=33MH*32bit/8=133MB/S
32bit @ 33MHz 數據吞吐量爲33MHZ*32bit/8=132MB/S

USB 3.0 最大傳輸速率5Gbps, 向下兼容USB 1.0/1.1/2.0

Mbps和MBps的區別:數據在傳輸過程當中是以二進制位的形式,用bit來表示。在衡量儲存容量時,用byte來表示。
Mbps(Million bits per second) - 每秒xx百萬位
MBps(Million bytes per second) - 每秒xx百萬字節

低速USB的時鐘頻率是1.5MHz
全速USB的時鐘頻率是12MHz
高速USB的時鐘頻率是480MHz
USB傳輸又分四種:控制、中斷、成組和同步(Control,Interrupt,BulkandIsochronous)。
不一樣的傳輸速度下不一樣的傳輸方式有不一樣的理論傳輸速度,不能籠統地說。
無論哪一種傳輸速度,同步傳輸的理論傳輸速度最快,控制傳輸的理論傳輸速度最慢。
USB系統要保留10%的帶寬
usb1.1  12Mb/s(12Mbps/8=1.5MBps),極限速度是1MB/s,接口效率爲1MB/1.5MB*100%=66.7%
usb2.0  480Mb/s(480Mbps/8=60MBps),極限速度約40MB/s,接口效率爲40MB/60MB*100%=66.7%
移動硬盤USB2.0寫速度須要在20MB/s左右~.

PCI 總線位寬是 32位,總線頻率 33 MHz,每時鐘傳輸 1 組數據,它的帶寬爲 127.2 MB/s,即 1017.6 Mbps。
●PCI 2.1 總線位寬是 64位,總線頻率 66 MHz,每時鐘傳輸 1 組數據,它的帶寬爲 508.6 MB/s,即 4068.8 Mbps。
●AGP 總線位寬是 32位,總線頻率 66 MHz,每時鐘傳輸 1 組數據,它的帶寬爲 254.3 MB/s,即 2034.4 Mbps。
●AGP Pro 總線位寬是 32位,總線頻率 66 MHz,每時鐘傳輸 1 組數據,它的帶寬爲 254.3 MB/s,即 2034.4 Mbps。

AGP Pro 是 AGP 的改進型,它使工做站級主板也能利用 AGP 的加速性能,下降了 AGP 所需的電壓供應,並無什麼太大的改變。
●AGP 2X 總線位寬是 32位,總線頻率 66 MHz,每時鐘傳輸 2 組數據,它的帶寬爲 508.6 MB/s,即 4068.8 Mbps。
●AGP 4X 總線位寬是 32位,總線頻率 66 MHz,每時鐘傳輸 4 組數據,它的帶寬爲 1017.3 MB/s,即 8138.4 Mbps。
●AGP 8X 總線位寬是 32位,總線頻率 66 MHz,每時鐘傳輸 8 組數據,它的帶寬爲 2034.6 MB/s,即 16276.8 Mbps。

 

 

圖片存儲在帶文件系統的SD卡中如何解出RGB:http://www.blogjava.net/georgehill/articles/6549.html

BMP文件格式。

 

Altera固化到Flash的文件是JIC,而ISE固化到Flash的文件是MCS

來源:http://wenku.baidu.com/link?url=0Ju7D8JGRJpDBQN_z_FYAgx8aUq1HELen1GVJvzSL30iY2B5VmzQlDsrbOkI-FnbGw0-ZV6RjXhhZ2s5Mr2EKP2E1a_QSJ3EMcNuS1yG8KG SPI模式下,SD卡在時鐘上升沿讀數據。

來源:http://wenku.baidu.com/view/af0de2e74afe04a1b071de49.html?re=view

STM32學習筆記之SD卡V2.0協議初始化,解釋得很具體

http://blog.sina.com.cn/s/blog_4f09c0b50101636h.html 每一個命令的位介紹。

來源:http://wenku.baidu.com/link?url=w7enVFMgall62cMzaxEyPGq10gwdyZkE_UBZHyUim4kp_U5I97FhUSHob-bHHqqh44-0kHP3hf7W94S5ZyXnmQIQJfSSC0h6UgiSmNL7w7_

v2.0版SD卡協議中命令CMD8的使用詳解

 

SDHC是「High Capacity SD Memory Card」的縮寫,即「高容量SD存儲卡」,這裏的HC指的是High Capacity,高容量。2006年5月,SD協會發布了最新版的SD 2.0的系統規範,在其中規定SDHC是符合新的規範,且容量大於2GB小於等於32GB的SD卡。另外SDHC至少要符合Class 2的速度等級,而且在卡片上必須有SDHC標誌和速度等級標誌。

SD卡最大支持2GB容量,SDHC 最大支持32GB容量,SDXC 最大支持2TB(2048GB)容量

來源:http://bbs.ednchina.com/BLOG_ARTICLE_269804.HTM

 在單片機讀寫SD卡後,若是須要查看讀寫的效果,能夠利用winhex軟件在計算機端直接觀察到SD卡中的數據內容。

        今天用PIC單片機將SD卡的第一個扇區數據讀取出來後,經過串口發送到PC上觀察,發現讀取的數據與在PC上用winhex軟件查看的第一個扇區的數據不一致,總是覺得單片機端得讀取程序有問題,修改了不少次也沒有效果,後上網發現winhex軟件在打開磁盤的對話框時,有兩種打開方式,一種是邏輯驅動器,另外一種是物理驅動器,若是但願看到與單片機讀取扇區一致的數據,需以物理驅動器方式打開SD卡,此時看到的第一扇區就與單片機所選擇的扇區一致了,能夠很直觀的看到SD卡中的對應數據了,不過要注意,前面的扇區最好不要隨便經過單片機寫入數據,防止破壞了SD卡上的文件系統,致使沒法再次在PC機上打開SD卡了。

 

來源:http://wenku.baidu.com/link?url=oC1-1QghHU5_tfoBdnprae3_PFlfbz-ceJ5jGXoOh_irHmwg_0mEYkj37JFePpoHsLcWFrOvrPrdEYjaP3IDDPjPyMOiMgAX9rfNRK4qujW

SD卡命令解讀。

來源:http://dontium.blog.163.com/blog/static/342952722009419114113217/

sd卡分爲mmc卡,sd v1.0,sd v2.0三個版本

cmd0是{0x40,0x00,0x00,0x00,0x00,0x95}  --0x01
cmd1是{0x41,0x00,0x00,0x00,0x00,0xff}    --0x01
cmd24是{0x58,0x00,0x00,0x00,0x00,0xff}  --0x01
cmd16是{0x51,0x00,0x00,0x00,0x00,0xff}   --0x01

cmd17是{0x51,0x00,0x00,0x00,0x00,0xff}  --0x01

cmd8是{0x48,0x00,0x00,0x01,0xaa,0x87}   --0x01
cmd55是{0x77,0x00,0x00,0x00,0x00,0xff}   --0x01
acmd41是{0x69,0x40,0x00,0x00,0x00,0xff}  --0x00
若是是sd v1.0版本,直接發CMD55+ACMD41
若是是sd v2.0版本,先發cmd8再發CMD55+ACMD41
 
1 . 命令變量

大容量SD卡,存儲器訪問命令的32位變量是對塊尋址的存儲器訪問(是決定塊的塊變量)。塊的固定大小爲512字節。而標準容量的SD卡,32位變量是對字節尋址,塊長度由CMD16命令決定。

五、讀寫超時檢查

讀:對標準容量的SD卡,讀超時的時間設定爲大於典型讀出時間的100倍,或者設置爲100mS。卡參數的讀時間爲:CSD中的TAACT NSAC參數的兩倍。

寫:對標準容量的SD卡,寫超時的時間設定爲大於典型編程時間的100倍,或者設置爲250mS。卡參數的寫時間爲:CSD中的R2W_FACTOR

對於大容量卡,CSD中的參數爲因定值,所以最好使用>100mS做爲讀超時,>250mS做爲寫超時。

5、關於命令索引

「命令索引」在SD協議中並無明確指出,但綜合參考三星程序及網上文章,認爲這種說法是正確的:「命令索引」中的數字就是其「索引值」。對於ACMD類的命令,能夠看做爲「複合命令」,即在執行時,前面先執行CMD55,而後再執行「去掉ACMDn前的‘A’的命令」

 

來源:http://www.doc88.com/p-348627971214.html  單片機用SPI模式控制SD卡讀寫

4G以上的SD不能用SPI模式嗎?

容量與SPI總線無關,2G是個分水嶺,2G以上是SD2.0協議,與2G如下的卡驅動不兼容。不少老設備(俺家的佳能A530相機就是一例)用不了2G以上的卡,也就是這個緣由。

#define ACMD41  41      //命令41,應返回0x00
#define CMD55   55      //命令55,應返回0x01

看了2.0的協議,在網上查了sdhc的初始化方法,到目前已經把csd讀出來了,下一步該弄讀寫了。

SD卡2G及如下是按字節尋址的,更大的是SD2.0協議,但還要讀取OCR數據,判斷是SD2.0仍是SD2.0HC卡,只有SD2.0HC卡纔是按扇區尋址的,因此卡的初始化時先要讀取卡的類型,這點要特別注意。這個好像SD2.0卡也是按扇區尋址的吧?SD1.X纔是字節尋址吧。

SD卡簡介:
SD卡的技術規範通過幾回升級,與最第一版本已有很大不一樣,本文基於Ver 3.01討論
從容量上分
 容量 命名  簡稱 
 0G<容量<2G Standard Capacity SD Memory Card   SDSC或SD
 2G<容量<32G High Capacity SD Memory Card  SDHC
 32G<容量<2T Extended Capacity SD Memory Card  SDXC

http://blog.sina.com.cn/s/blog_4f09c0b50101636h.html

 

來源:http://servers.pconline.com.cn/skills/0712/1193752.html

WinHex工具對FAT16磁盤進行分析,簇、扇區、容量關係。

 4G 及4G以上sd卡不能用SPI讀寫嗎?

數據塊長度515個字節,起始標誌字節爲0xFE,實際數據512字節,2字節CRC
CRC使用CRC-16算法,不計算時能夠設置爲0xFF
寫操做以後要等待非忙信號,忙信號使MISO爲低電位,接收數據一直爲0
 

來源:http://wenku.baidu.com/view/953298fcaef8941ea76e053c.html

單片機讀寫SD卡的代碼。。。

來源:http://wenku.baidu.com/link?url=8xXHUPr2ekFj6xzqfWI5Mu2q7iiszatEic-cikFaEOEnmd_8vg9oLtjhFk3qSCzDK2x-rTGjiFHc4QBeJ3RHIEg51nz4xBIVlN3rxpIR2E3  帶文件系統的專用SD卡 的讀寫操做。不須要了解FAT的複雜結構。

一旦咱們找到了咱們要寫入文件的起始位置(它通常表示爲一個扇區號),那咱們就能夠在這個起始扇區的下一個扇區寫入數據了。

 

CMD17的Address是32位的,最後9位是Block地址,前面的是Sector地址.若是Block=512 Byte的話,Block的值只能是0,Block!=0,Response會報錯.sector是物理地址.歡迎砸磚! 振南電子,那裏有SD的菜鳥教程。

來源:http://blog.163.com/zhaojun_xf/blog/static/30050580201151410635516/

winhex讀取的數據是邏輯0扇區,而SD卡讀取的數據是物理0扇區,確定不同。圖上的winhex讀取的數據應該是DBR,SD卡讀取的數據是MBR。

SD卡地址第一個數據物理地址初始值 用winhex怎麼查?

首先點「工具」點「打開磁盤」選擇你要看的磁盤,U盤也能看,點「位置」點「轉到偏移」而後再輸入「0」點「OK」就能夠了
告訴你快捷方式吧 打開軟件後按F9選擇你要看的磁盤,而後alt+g或者ctrl+g。而後再輸入「0」點「OK」就能夠了。

offset=扇區*512,扇區是512B。WINHEX顯示的就是實際的起始字節而不是扇區

在OpenCore上下載的SD SPI模式代碼是按照下面的流程來作的,能夠參考下哈。。。

代碼參考C語言:來源:http://wenku.baidu.com/link?url=kn2cP2vSMRlFaO3fwOi-xN188IQe47s6TO37qcqTjndipGSFSQT4akXb0_v2ZjZ51BkA6Jd14BI2G8OFt_NAmNoAUy41cQsN50ENcfheuCm

 

 

來源:http://www.cnblogs.com/zyqgold/archive/2012/01/02/2310340.html

對SD卡的控制流程

一、SD卡的SPI工做模式

SD 卡在上電初期自動進入SD 總線模式,在此模式下向 SD 卡發送復位命令CMD0 。若是SD卡在接收復位命令過程當中CS低電平有效,則進入SPI模式,不然工做在SD 總線模式。

下邊是插入SD卡,並初始化爲SPI模式的流程圖:(至於CMD××到底是什麼樣的命令,以下所示

  1 /* 命令響應定義 define command's response */
  2 #define R1 1
  3 #define R1B 2
  4 #define R2 3
  5 #define R3 4
  6 
  7 /**********************************************
  8 
  9      SD卡SPI模式下命令集
 10 
 11 **********************************************/
 12 
 13 /******************************** 基本命令集 Basic command set **************************/
 14 /* 復位SD 卡 Reset cards to idle state */
 15 #define CMD0 0
 16 #define CMD0_R R1
 17 
 18 /* 讀OCR寄存器 Read the OCR (MMC mode, do not use for SD cards) */
 19 #define CMD1 1
 20 #define CMD1_R R1
 21 
 22 /* 讀CSD寄存器 Card sends the CSD */
 23 #define CMD9 9
 24 #define CMD9_R R1
 25 
 26 /* 讀CID寄存器 Card sends CID */
 27 #define CMD10 10
 28 #define CMD10_R R1
 29 
 30 /* 中止讀多塊時的數據傳輸 Stop a multiple block (stream) read/write operation */
 31 #define CMD12 12
 32 #define CMD12_R R1B
 33 
 34 /* 讀 Card_Status 寄存器 Get the addressed card's status register */
 35 #define CMD13 13
 36 #define CMD13_R R2
 37 
 38 /***************************** 塊讀命令集 Block read commands **************************/
 39 
 40 /* 設置塊的長度 Set the block length */
 41 #define CMD16 16
 42 #define CMD16_R R1
 43 
 44 /* 讀單塊 Read a single block */
 45 #define CMD17 17
 46 #define CMD17_R R1
 47 
 48 /* 讀多塊,直至主機發送CMD12爲止 Read multiple blocks until a CMD12 */
 49 #define CMD18 18
 50 #define CMD18_R R1
 51 
 52 /***************************** 塊寫命令集 Block write commands *************************/
 53 /* 寫單塊 Write a block of the size selected with CMD16 */
 54 #define CMD24 24
 55 #define CMD24_R R1
 56 
 57 /* 寫多塊 Multiple block write until a CMD12 */
 58 #define CMD25 25
 59 #define CMD25_R R1
 60 
 61 /* 寫CSD寄存器 Program the programmable bits of the CSD */
 62 #define CMD27 27
 63 #define CMD27_R R1
 64 
 65 /***************************** 寫保護 Write protection *****************************/
 66 /* Set the write protection bit of the addressed group */
 67 #define CMD28 28
 68 #define CMD28_R R1B
 69 
 70 /* Clear the write protection bit of the addressed group */
 71 #define CMD29 29
 72 #define CMD29_R R1B
 73 
 74 /* Ask the card for the status of the write protection bits */
 75 #define CMD30 30
 76 #define CMD30_R R1
 77 
 78 /***************************** 擦除命令 Erase commands *******************************/
 79 /* 設置擦除塊的起始地址(只用於SD卡) Set the address of the first write block to be erased(only for SD) */
 80 #define CMD32 32
 81 #define CMD32_R R1
 82 
 83 /* 設置擦除塊的終止地址(只用於SD卡) Set the address of the last write block to be erased(only for SD) */
 84 #define CMD33 33
 85 #define CMD33_R R1
 86 
 87 /* 設置擦除塊的起始地址(只用於MMC卡) Set the address of the first write block to be erased(only for MMC) */
 88 #define CMD35 35
 89 #define CMD35_R R1
 90 
 91 /* 設置擦除塊的終止地址(只用於MMC卡) Set the address of the last write block to be erased(only for MMC) */
 92 #define CMD36 36
 93 #define CMD36_R R1
 94 
 95 /* 擦除所選擇的塊 Erase the selected write blocks */
 96 #define CMD38 38
 97 #define CMD38_R R1B
 98 
 99 /***************************** 鎖卡命令 Lock Card commands ***************************/
100 /* 設置/復位密碼或上鎖/解鎖卡 Set/reset the password or lock/unlock the card */
101 #define CMD42 42
102 #define CMD42_R    R1B
103 /* Commands from 42 to 54, not defined here */
104 
105 /***************************** 應用命令 Application-specific commands ****************/
106 /* 禁止下一個命令爲應用命令  Flag that the next command is application-specific */
107 #define CMD55 55
108 #define CMD55_R R1
109 
110 /* 應用命令的通用I/O  General purpose I/O for application-specific commands */
111 #define CMD56 56
112 #define CMD56_R R1
113 
114 /* 讀OCR寄存器  Read the OCR (SPI mode only) */
115 #define CMD58 58
116 #define CMD58_R R3
117 
118 /* 使能或禁止 CRC Turn CRC on or off */
119 #define CMD59 59
120 #define CMD59_R R1
121 
122 /***************************** 應用命令 Application-specific commands ***************/
123 /* 獲取 SD Status寄存器 Get the SD card's status */
124 #define ACMD13 13
125 #define ACMD13_R R2
126 
127 /* 獲得已寫入卡中的塊的個數 Get the number of written write blocks (Minus errors ) */
128 #define ACMD22 22
129 #define ACMD22_R R1
130 
131 /* 在寫以前,設置預先擦除的塊的個數 Set the number of write blocks to be pre-erased before writing */
132 #define ACMD23 23
133 #define ACMD23_R R1
134 
135 /* 讀取OCR寄存器 Get the card's OCR (SD mode) */
136 #define ACMD41 41
137 #define ACMD41_R R1
138 
139 /* 鏈接/斷開CD/DATA[3]引腳上的上拉電阻 Connect or disconnect the 50kOhm internal pull-up on CD/DAT[3] */
140 #define ACMD42 42
141 #define ACMD42_R R1
142 
143 /* 讀取SCR寄存器 Get the SD configuration register */
144 #define ACMD51 51
145 #define ACMD51_R R1

 

張亞峯 SD卡的C語言實現:http://www.cnblogs.com/yuphone/archive/2011/04/19/2021549.html

 

如今我急需利用SD卡做爲一個數據存儲設備, 僅用於 數據寫入和讀取。可是並不知道SD卡的扇區地址的範圍是什麼,也就是說我想利用SD卡指令的COM17((單塊讀指令)和COM24(多塊讀指令)對SD卡進行純讀寫,由於要讀寫多個扇區,而指令後面加地址參數的取值範圍和格式我並不太清楚。但願各位高手幫我解答這個問題。

另外,SD卡只用來存取數值的話,有必要上系統嗎?個人想法是隻要知道扇區的地址,逐個讀寫就好了,不知道這個想法對不對。

單片機型號:AVR mega16 單片機
SD卡型號:1G TF卡(已利用卡套轉爲SD卡)

 CMD17的Address是32位的,最後9位是Block地址,前面的是Sector地址.若是Block=512 Byte的話,Block的值只能是0,Block!=0,Response會報錯.

MMC_write_Blocks:
1,初始化,進入SPI模式,
2,發CMD25命令,
3,連讀2字節,好象讀1字節也能夠,
4,發start(發一字節0xfc到sd卡),
5,發一個數據塊到sd卡,
6,發2字節0xff到sd卡,看成CRC16,
7,讀忙信息,直到不忙,
8,若是全部數據沒有發完,跳到4,
9,結束,發end(發一字節0xfb到sd卡),
10,發CMD12命令。

SMMC_read_Blocks:
1,初始化,進入SPI模式,
2,發CMD18命令,
3,循環讀到0xfe字節,
4,讀1個數據塊到sd卡,
5,讀2字節CRC16,
6,若是全部數據沒有讀完,跳到3,
7,結束,發CMD12命令。

SD百科資料:http://baike.baidu.com/link?url=tz_JG2S6yNTDWR701WxF4sv7BPXEzy5RtwO-Z2Nc4mcC-OdEK8RV_l16DFY1EBFJ

MiniSD卡的設計初始是爲逐漸開始普及的拍照手機而做,經過附贈的SD轉接卡還可當作通常SD卡使用。

支持傳輸模式

SD卡共支持三種傳輸模式:SPI模式(獨立序列輸入和序列輸出),1位SD模式 (獨立指令和數據通道,獨有的傳輸格式), 4位SD模式 (使用額外的針腳以及某些從新設置的針腳。支持四位寬的並行傳輸)。
低速卡一般支持 0~400 千比特/秒 數據傳輸率,採用SPI 和1位SD傳輸模式。 高速卡支持 0 ~ 100 兆比特/秒數據傳輸率,採用4位SD傳輸模式; 支持0–25 兆比特/秒 ,採用SPI和 1位SD模式。
因應SD卡的標準容量上限只有4GB,不足以應付日益上升的容量需求,聯盟制定了新的SDHC標準。SDHC卡的外型跟普通的SD卡徹底相同,而容量的下限爲4GB,預料年內可推出高達32GB的SDHC卡。

技術論壇:http://www.amobbs.com/forum-1029-1.html

拜託你寫這跟沒寫沒多大區別,搞硬件的這些不理解就不叫搞硬件的。關鍵是這些器件如何操做,如何控制,怎樣寫時序,這纔是重點。

http://www.amobbs.com/thread-4676153-1-1.html

 首先SD通常有兩種接口協議,SPI和SDIO 若是你單片機沒有SDIO那就用SPI好了,SPI用硬件的或者軟件模擬均可以,而後調用SPI發送和接收函數寫SD的驅動,寫完以後SD卡就能夠相似於EEPROM來用了,可是注意,這時候的SD卡是沒有「文件」這個概念的,EEPROM也沒有嘛,若是想讀取SD中的文件那還須要移植文件系統,好比fatfs,移植成功後你就能夠用相似於fopen之類的函數啦~驅動方面能夠參考原子哥 《STM32不徹底》手冊的SD卡操做的相關內容,文件系統移植嘛,單片機強一點推薦用fatfs,弱一點的用Petit FAT,曾經在STC 1T的51單片機上使用Petit FAT文件系統讀取bmp圖像並在彩屏上顯示,一分鐘刷了一幅圖,罪孽啊!!實在無聊

來源:SD卡的SPI模式的初始化順序http://jinyong314.blog.163.com/blog/static/301657422010530112349686/

來源:基於FPGA的SD卡硬件控制器開發(SPI模式)

 http://zsl666.blog.163.com/blog/static/17626761520114308512108/

 

  

來源:http://forum.eepw.com.cn/thread/91070/1 我也有一樣的問題。。。

http://www.amobbs.com/forum.php?mod=viewthread&action=printable&tid=4676153  用FPGA直接讀取SD卡扇區數據

能不能把SD卡做爲一個「大容量的能夠按字節讀寫的數據存儲器」。就是沒有任何文件系統,直接像eeprom那樣,按地址進行讀寫數據?謝謝!

SD卡規範和FAT文件格式規範是很是複雜,若是在項目中要單獨來寫這兩個規範的很是費時和費力,而其很是佔用系統資源;如今的便攜儀採集的數據種類愈來愈多,數據量愈來愈大,而其大部分要求在計算機上備份數據或者後期用計算機處理數據;而SD卡以其容量大,速度快,接口簡單,加之配套的讀卡器便宜而發展迅速;

首先SD通常有兩種接口協議,SPI和SDIO 若是你單片機沒有SDIO那就用SPI好了,SPI用硬件的或者軟件模擬均可以,而後調用SPI發送和接收函數寫SD的驅動,寫完以後SD卡就能夠相似於EEPROM來用了,可是注意,這時候的SD卡是沒有「文件」這個概念的,EEPROM也沒有嘛,若是想讀取SD中的文件那還須要移植文件系統,好比fatfs,移植成功後你就能夠用相似於fopen之類的函數啦~驅動方面能夠參考原子哥 《STM32不徹底》手冊的SD卡操做的相關內容,文件系統移植嘛,單片機強一點推薦用fatfs,弱一點的用Petit FAT,曾經在STC 1T的51單片機上使用Petit FAT文件系統讀取bmp圖像並在彩屏上顯示,一分鐘刷了一幅圖,罪孽啊!!實在無聊

你要了解SD卡資料,文件系統,SPI通訊的相關內容。

 

http://bbs.ednchina.com/BLOG_ARTICLE_2059372.HTM基於FPGA的bmp圖片顯示

一、最近編寫了幾個工廠須要的test pattern,用於UHD120和UHD60的pannel上,其中UHD120須要作半分屏處理,存儲一行。

二、最近寫了UHD120/60/30縮放到FHD120/60/30的算法,採用的算法是雙線性算法,相鄰4點取平均獲得的。須要進行行的存儲。注意DPRAM的使用技巧,讀寫控制邏輯的實現。

三、FHD120/60/30通過FRC處理後 VbyOne的實現是個技術難點。

I2C去拉動的方法,值得學習。。。

 1 // local wires and regs
 2 reg sdaDeb;
 3 reg sclDeb;
 4 reg [`DEB_I2C_LEN-1:0] sdaPipe;
 5 reg [`DEB_I2C_LEN-1:0] sclPipe;
 6 
 7 reg [`SCL_DEL_LEN-1:0] sclDelayed;
 8 reg [`SDA_DEL_LEN-1:0] sdaDelayed;
 9 reg [1:0] startStopDetState;
10 wire clearStartStopDet;
11 wire sdaOut;
12 wire sdaIn;
13 wire [7:0] regAddr;
14 wire [7:0] dataToRegIF;
15 wire writeEn;
16 wire [7:0] dataFromRegIF;
17 reg [1:0] rstPipe;
18 wire rstSyncToClk;
19 reg startEdgeDet;
20 
21 assign sdaEn = sdaOut;
22 assign sda = (sdaOut == 1'b0) ? 1'b0 : 1'bz;
23 assign sdaIn = sda;
24 
25 // sync rst rsing edge to clk
26 always @(posedge clk) begin
27   if (rst == 1'b1)
28     rstPipe <= 2'b11;
29   else
30     rstPipe <= {rstPipe[0], 1'b0};
31 end
32 
33 assign rstSyncToClk = rstPipe[1];
34 
35 // debounce sda and scl
36 always @(posedge clk) begin
37   if (rstSyncToClk == 1'b1) begin
38     sdaPipe <= {`DEB_I2C_LEN{1'b1}};
39     sdaDeb <= 1'b1;
40     sclPipe <= {`DEB_I2C_LEN{1'b1}};
41     sclDeb <= 1'b1;
42   end
43   else begin
44     sdaPipe <= {sdaPipe[`DEB_I2C_LEN-2:0], sdaIn};
45     sclPipe <= {sclPipe[`DEB_I2C_LEN-2:0], scl};
46     if (&sclPipe[`DEB_I2C_LEN-1:1] == 1'b1)
47       sclDeb <= 1'b1;
48     else if (|sclPipe[`DEB_I2C_LEN-1:1] == 1'b0)
49       sclDeb <= 1'b0;
50     if (&sdaPipe[`DEB_I2C_LEN-1:1] == 1'b1)
51       sdaDeb <= 1'b1;
52     else if (|sdaPipe[`DEB_I2C_LEN-1:1] == 1'b0)
53       sdaDeb <= 1'b0;
54   end
55 end
56 
57 
58 // delay scl and sda
59 // sclDelayed is used as a delayed sampling clock
60 // sdaDelayed is only used for start stop detection
61 // Because sda hold time from scl falling is 0nS
62 // sda must be delayed with respect to scl to avoid incorrect
63 // detection of start/stop at scl falling edge. 
64 always @(posedge clk) begin
65   if (rstSyncToClk == 1'b1) begin
66     sclDelayed <= {`SCL_DEL_LEN{1'b1}};
67     sdaDelayed <= {`SDA_DEL_LEN{1'b1}};
68   end
69   else begin
70     sclDelayed <= {sclDelayed[`SCL_DEL_LEN-2:0], sclDeb};
71     sdaDelayed <= {sdaDelayed[`SDA_DEL_LEN-2:0], sdaDeb};
72   end
73 end
74 
75 // start stop detection
76 always @(posedge clk) begin
77   if (rstSyncToClk == 1'b1) begin
78     startStopDetState <= `NULL_DET;
79     startEdgeDet <= 1'b0;
80   end
81   else begin
82     if (&sclDelayed == 1'b1 && sdaDelayed[`SDA_DEL_LEN-2] == 1'b0 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b1)
83       startEdgeDet <= 1'b1;
84     else
85       startEdgeDet <= 1'b0;
86     if (clearStartStopDet == 1'b1)
87       startStopDetState <= `NULL_DET;
88     else if (&sclDelayed == 1'b1) begin
89       if (sdaDelayed[`SDA_DEL_LEN-2] == 1'b1 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b0) 
90         startStopDetState <= `STOP_DET;
91       else if (sdaDelayed[`SDA_DEL_LEN-2] == 1'b0 && sdaDelayed[`SDA_DEL_LEN-1] == 1'b1)
92         startStopDetState <= `START_DET;
93     end
94   end
95 end
相關文章
相關標籤/搜索