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してあります.


*1 : ただし,7bit文字のみ対応.2バイト文字はUNICODEになるので,このままではうまく認識されません.

*2 : WP/CS信号を常時Lowに変更.tclを編集\ set_interface_property avalon_slave_0 addressSpan 1024

収録ファイルと個々の概要説明

  • 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出力が出てくるようにしてある.

ダウンロード


ハードウェア仕様

モジュールのアドレス空間

offset symbol description
0statusSPIステータス,送受信データ(8bit)
1divideSPI clockに用いるmodule入力クロックの分周比(FofSCK = 入力周波数/divide/2)
2timerタイムアウト検出用ダウンカウンタ(module input clockで動作).0で止まる
3reserved0(予約/現実装ではstatusが見える)
4dmastatusDMAステータス
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-16const zero-
15割込み許可フラグ1:mmc_irq_enable
14-13const zero-
12MMC I/F FRCゼロフラグ1:mmc_zf_bitmask
11MMC-Write Protect1:mmc_wp_bitmask
10MMC-Card Detection1:mmc_cd_bitmask
9MMC I/F転送フラグ(0書き込みで転送開始要求)1:mmc_commexit / 0:mmc_commstart
8MMC Chip Select(Active Low)1:mmc_selnegete / 0:mmc_selassert
7-0MMC I/F受信データ8bitデータ.読み出し=RxData,書き込み=TxData(txdataのリードバック不可)

dmastatus レジスタ
bit description mmc_spi.hシンボル
31-16const zero-
15DMA function IRQ enable bit(1:enable, 0:disable)mmc_dmairq_enable
14assert(0->1) when transfer-endsmmc_dmadone_bitmask
131:受信データエラー@SPImmc_dmade_bitmask
121:受信タイムアウト@SPImmc_dmato_bitmask
11const zero-
10w1:転送開始,r1:転送中/r0:転送終了mmc_dmastart
9const 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レジスタの値しか参照できない状態となります.