2009/02/12(木)[SOPC][IP] MMC/SPI FatFs
[SOPC][IP] MMC/SPI FatFs
MMC/SDカードのアクセスを行うためのIPです.\ オリジナルは長船さん作成のVHDLで記述されたものでした.\ Verilogに移植して,ソフトウェア部分もFatFs(R0.06, Apr 01, 2008)に 差し替え,BBSにあったLFN対応パッチもマージしました*1.\ それぞれNEEK向けに修正*2してあります.
収録ファイルと個々の概要説明
- avalonif_mmcdma.txt\ このファイル.IPの簡単な説明等を記載する
- avalonif_mmcdma_hw.tcl\ SOPC builderが食うファイル. Avalon-MM I/Fの仕様や追加すべきファイル,パラメータ初期値などの情報が入っている.
- avalonif_mmcdma.v\ Avalon I/Fを含む本モジュールのtopレベルモジュールを記述したファイル.
- SDIF.v\ SPIモードのビット転送モジュール.
- SDIF_MEM.v\ Mega Wizardで生成したSRAMモジュール.\ 8bit write, 32bit readの512bytesメモリ.\ 出力にはバッファを設けず,readaddressにしたがってq出力が出てくるようにしてある.
ダウンロード
- 制御ソフト\[file:zip:xoxyuxu:200902/:mmcdma_spi_12Feb2009.zip:mmcdma_spi_12Feb2009.zip]
- Verilog-HDL記述\[file:zip:xoxyuxu:200902/:_IP_MF_12Feb2009.zip:_IP_MF_12Feb2009.zip]
ハードウェア仕様
モジュールのアドレス空間
offset | symbol | description |
---|---|---|
0 | status | SPIステータス,送受信データ(8bit) |
1 | divide | SPI clockに用いるmodule入力クロックの分周比(FofSCK = 入力周波数/divide/2) |
2 | timer | タイムアウト検出用ダウンカウンタ(module input clockで動作).0で止まる |
3 | reserved0 | (予約/現実装ではstatusが見える) |
4 | dmastatus | DMAステータス |
5~ | reserved[123] | (予約) |
128~ | readbuff[128] | DMA転送バッファ(現状読み出しのみ) |
※offsetは,32bit word指定.CPUからのアドレスは x4して見える.※使用メモリ256Word = 1024Byte = 10bit
ビットフィールド
status(MMC IF status) レジスタ
bit | description | mmc_spi.hシンボル |
---|---|---|
31-16 | const zero | - |
15 | 割込み許可フラグ | 1:mmc_irq_enable |
14-13 | const zero | - |
12 | MMC I/F FRCゼロフラグ | 1:mmc_zf_bitmask |
11 | MMC-Write Protect | 1:mmc_wp_bitmask |
10 | MMC-Card Detection | 1:mmc_cd_bitmask |
9 | MMC I/F転送フラグ(0書き込みで転送開始要求) | 1:mmc_commexit / 0:mmc_commstart |
8 | MMC Chip Select(Active Low) | 1:mmc_selnegete / 0:mmc_selassert |
7-0 | MMC I/F受信データ | 8bitデータ.読み出し=RxData,書き込み=TxData(txdataのリードバック不可) |
dmastatus レジスタ
bit | description | mmc_spi.hシンボル |
---|---|---|
31-16 | const zero | - |
15 | DMA function IRQ enable bit(1:enable, 0:disable) | mmc_dmairq_enable |
14 | assert(0->1) when transfer-ends | mmc_dmadone_bitmask |
13 | 1:受信データエラー@SPI | mmc_dmade_bitmask |
12 | 1:受信タイムアウト@SPI | mmc_dmato_bitmask |
11 | const zero | - |
10 | w1:転送開始,r1:転送中/r0:転送終了 | mmc_dmastart |
9 | const zero | - |
8-0 | 転送バイト数 | - |
ハードウェアの動作イメージ
MMC/SDからのデータ読み出し
読み出し時,DMA機能を用いることで,本モジュールのアドレス空間に配置されているバッファメモリにSDからのデータを転送することができます.
MMC/SDからの転送は,byte単位で行われるため,CPUで転送するよりは高速な読み出しが可能でしょう.\ただし,転送できるメモリは本モジュール内の先頭からのみという制約もあります.
※ポートを読み出してのPIO転送も勿論可能です.
Avalon-MM Master portを増設し,Avalon-DMAを内包すれば,任意の空間への転送も可能となるでしょう.
MMC/SDへのデータ書き出し
書き込みについては,バッファからの転送は未サポートであり,PIO転送する必要があります.
注意事項
DMA転送を要求した際には,SDIF module(SDIF.v)のアクセスを本IPのtop level moduleが行うため,ユーザがCPU等からアクセスしてはいけません.\dmastatusの読み出し動作のみ許容します.(DMA転送の終了をポーリングで知るため)\SDIFのほかのレジスタへのアクセスを試みても,本IPのステートマシンがSDIFへのアクセスを占有し,statusレジスタの値しか参照できない状態となります.