[Q2HB] SPI Core
[Altera][Q2HB][IP] SPI Core
refer to:"Volume 5: Embedded Peripherals","Section I. Off-Chip Interface Peripherals","7. SPI Core"
Core Overview
(略)SPIインタフェースは,よう使われている.SPI core with Avalon-interfaceは,SPIプロトコルを実装し,バックエンドでAvalon-MMインタフェースを提供する.
SPI coreは,SPIマスタかSPIスレーブのどちらかを実装できる.マスタとして設定したときは,SPI coreは32個までの独立したSPIスレーブを制御できる.送受信のレジスタ幅は,1~32ビットの間で設定可能です.より長い転送長はソフトルーチンでサポートされます.SPI coreは,転送が完了するごとにフラグする割込み出力を提供します.
Functional Description
SPI coreは以下の信号で同期通信を行います(SPIプロトコル)
Signal | symbol | description |
---|---|---|
Master Out Slave In | mosi | マスタからのデータ出力,スレーブへのデータ入力 |
Master In Slave Out | miso | スレーブからのデータ出力,マスタへのデータ入力 |
Serial Clock | sclk | マスタに駆動される,スレーブへのクロック.データビットの同期に使う |
Slave Select | ss_n | マスタに駆動される,個別のスレーブへのSelect信号(active Low).対象となるスレーブを選択するのに使う |
このコアには,ユーザに見える柿のリソースがあります.
- MemoryMapped register\rxdata, txdata,status, control, slaveselect
- 4つのSPIインタフェースポート\sclk, ss_n, mosi, and miso
Instantiating the SPI Core in SOPC Builder
(なんともはやふつー過ぎて省略)
Software Programming Model
alt_avalon_spi_command()
int alt_avalon_spi_command( alt_u32 base, alt_u32 slave, alt_u32 write_length, const alt_u8* wdata, alt_u32 read_length, alt_u8* read_data, alt_u32 flags)
データ長8bit以下のSPIマスタ向けに設計されている.現状,データ長8bit以上のハードには対応していない.
この関数を一度呼ぶと,MOSIからデータを吐いて,MISOからデータを受け取ります.
- slaveの指定されたslave chipselect信号をアサートします.IDはゼロオリジンです.
- write_lengthバイトだけwdataから読み出して出力します.MISOからのデータは捨てます.
- read_lengthバイトだけ,read_dataへデータを格納します.MOSIにはゼロを吐き続けます.
- スレーブのselect信号をデアサートします.
コードは,以下のファイルを見ると把握できます.リード時の吐き捨てがマスタ出力ゼロで決めうちですね.
C:\altera\81\ip\altera\sopc_builder_ip\altera_avalon_spi\HAL\src\altera_avalon_spi.c
※SDカードへのアクセスの際には,1'b1での出力が必要と思う(ELMより...SD Spec.見たほうがいいか?)
問題点
SPIマスタのとき,動作クロックをWizardで定義することになるが,動的な変更が効かない
(ELM) MMCの使い方 より,
SPIモードの場合は、速度を制限する状態(OD駆動)が無いので、クロック切り替えなしで最初から20/25MHzでもOKです。
20MHz固定でもいいか...
SDカードをSPIモードで使うときの結論
IPコアは流用できるが,HAL・ドライバは使用できない.自前で制御レジスタをたたくべし.ソースコードの流用はできるだろう(あまりおいしく無いけれど)
→ よそのIPを拾ってこよう….