[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 Inmosiマスタからのデータ出力,スレーブへのデータ入力
Master In Slave Outmisoスレーブからのデータ出力,マスタへのデータ入力
Serial Clocksclkマスタに駆動される,スレーブへのクロック.データビットの同期に使う
Slave Selectss_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からデータを受け取ります.

  1. slaveの指定されたslave chipselect信号をアサートします.IDはゼロオリジンです.
  2. write_lengthバイトだけwdataから読み出して出力します.MISOからのデータは捨てます.
  3. read_lengthバイトだけ,read_dataへデータを格納します.MOSIにはゼロを吐き続けます.
  4. スレーブの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を拾ってこよう….