Skip to content

Latest commit

 

History

History
303 lines (238 loc) · 30.9 KB

qspi_controller.org

File metadata and controls

303 lines (238 loc) · 30.9 KB

QSPI Controller

QSPI Controllerは、SC OBCモジュールに搭載するメモリとSPIプロトコルによる通信を行うためのモジュールです。 QSPI Controllerは、Single SPIモード, Dual SPIモード, Quad SPIモードに対応しており、メモリとの高速な通信を行う事ができます。

SC OBCモジュールには、FPGAの Configurationデータを格納するためのNOR Flashメモリ (Configuration Flash Memory)と、運用データを格納するための NOR Flashメモリ (Data Store Flash Memory)及び FRAMが搭載されています。 これに対し QSPI Controllerは 3個搭載されています。 また、各メモリは冗長化の目的で 2個ずつ搭載されています。

QSPI Controllerとメモリの構成を以下に示します。

./images/qspi_controller_structure.png

SC OBCモジュールに実装される メモリの型番は以下の通りです。 各メモリの仕様については、ベンダーからリリースされている Datasheetを参照してください。

Memory用途VendorPart NumberSC OBC搭載数
Configuration Flash MemoryFPGA Configurationデータの格納infineon (旧Cypress)S25FL256L2 個
Data Store Flash Memory運用データの格納infineon (旧Cypress)S25FL256L2 個
FRAM運用データの格納infineon (旧Cypress)CY15B104QSN2 個

レジスタ詳細

QSPI Controllerは、各メモリにアクセスするため 3個搭載されています。 各コアは以下のアドレスに配置されています。

TargetBase Address
Configuration Flash Memory0x4000_0000
Data Store Memory0x4010_0000
FRAM0x4020_0000

QSPI Controllerには以下のレジスタが実装されています。

OffsetSymbolRegisterInitial
0x0000QSPI_ACRQSPI Access Control Register0x00000000
0x0004QSPI_TDRQSPI TX Data Register0x00000000
0x0008QSPI_RDRQSPI RX Data Register0x00000000
0x000CQSPI_ASRQSPI Access Status Register0x00000000
0x0010QSPI_FIFOSRQSPI FIFO Status Register0x00000000
0x0014QSPI_FIFORRQSPI FIFO Reset Register0x00000000
0x0020QSPI_ISRQSPI Interrupt Status Register0x00000000
0x0024QSPI_IERQSPI Interrupt Enable Register0x00000000
0x0030QSPI_CCRQSPI Clock Control Register0x00000000
0x0034QSPI_DCMSRQSPI Data Capture Mode Setting Register0x00000000
0x0038QSPI_FTLSRQSPI FIFO Threshold Level Setting Register0x00000000
0xF000QSPI_VERQSPI Controller IP Version Register-

QSPI Access Control Register (Offset 0x0000)

QSPI Access Control Registerは、SPIアクセスにおける SS信号、I/Oモードを制御するためのレジスタです。

Data Store Memoryと FRAMの制御を行う QSPI Controllerは、2つのメモリへのアクセスの切り替えを SPISSCTLビットで行います。 メモリへのアクセスを開始するときは、SPISSCTLを 0b01または 0b10に設定し、アクセス対象の SS信号をアサートします。 SPISSCTLを 0b11に設定することは禁止です。

Configuration Flash Memoryを制御する QSPI Controllerは、SS信号が 1本しか接続されておらず、OBCモジュールの基板上でセレクトされています。 そのため、Configuration Flash Memoryへアクセスを行う場合は、アクセスするメモリに関わらず SPISSCTLを 0b01にセットします。 Configuration Flash Memoryのメモリ選択は、System Registerの Configuration Flash Memory Registerの設定により行うことができます。 詳細は、System Registerの「Configuration Flash Memory Register」の章を参照してください。

bitSymbolFieldDescriptionR/W
31:18-ReservedReserved-
17:16SPIIOMODESPI I/O ModeSPIアクセスにおけるI/Oモードを設定します。 2b00: Standard(Single)-IO SPIモード 2b01: Dual-IO SPIモード 2b10: Quad-IO SPIモード 2b11: 設定禁止R/W
15:2-ReservedReserved-
1:0SPISSCTLSPI SS ControlSS (Slave Select)信号の制御をするためのフィールドです。0b00: SS信号をネゲート 0b01: メモリ 1の SS信号をアサート 0b10: メモリ 2の SS信号をアサート 0b11: 禁止R/W

QSPI TX Data Register (Offset 0x0004)

QSPI TX Data Registerは、SPIデバイスにデータを送信するためのレジスタです。

SPIデバイスへのデータ送信は TX FIFOを介し行います。

SPIデバイスにデータを送信する場合、QSPI TX Data Registerの SPITXDATAフィールドに書き込みを行います。 このレジスタにデータを書き込むと、書き込みデータは TX FIFOに格納されます。 TX FIFOは送信データを最大16 Byte格納できます。 TX FIFOに格納されたデータは、書き込まれた順番ですぐに SPIデバイスに送信されます。

SPIデバイスが要求するダミーサイクルは、このレジスタに書き込みを行うことによって、SPIクロックを出力させ生成します。

bitSymbolFieldDescriptionR/W
31:8-ReservedReserved-
7:0SPITXDATASPI Tx DataTX FIFOに格納する送信データを書き込みます。このレジスタに書き込んだデータはTX FIFOに格納され、書き込まれた順番ですぐに送信されます。WO

QSPI RX Data Register (Offset 0x0008)

QSPI RX Data Registerは、SPIデバイスからのデータ受信制御と、RX FIFOからの受信データの読み出しを行うためのレジスタです。

SPIデバイスからのデータ受信は RX FIFOを介して行います。

SPIデバイスからデータを受信する場合、QSPI RX Data Registerの SPIRXDATAフィールドに書き込みアクセスを行います。 このレジスタに書き込む値は何も影響しません。 SPIRXDATAビットの書き込みが行われると、SPIデバイスに対し SPIクロックが送信され、SPIデバイスはそのクロックに同期しデータを出力します。 SPIデバイスの出力データは、RX FIFOに格納されます。 RX FIFOは 最大 16 Byteのデータを格納する事ができます。

RX FIFOに格納されたデータを読み出す場合、QSPI RX Data Registerの SPIRXDATAフィールドに読み出しアクセスを行います。 データは SPIデバイスから出力された順に読み出されます。

QSPI Data Capture Mode Setting Registerの DTCAPTビットが”1” にセットされている時、SPIRXDATAフィールドの書き込み時だけではなく、QSPI TX Data Registerの書き込み時も、RX FIFOにデータが格納されます。 この時 RX FIFOに格納されているデータは SPITXDATAに書き込んだデータ (SPIに出力されているデータ)となります。

bitSymbolFieldDescriptionR/W
31:8-ReservedReserved-
7:0SPIRXDATASPI Rx Dataこのレジスタへの書き込み時は、SPIクロックを送信しデバイスからのデータ受信を行います。このレジスタの読み出し時は、RX FIFOに格納されたデータが古い順に読み出されます。R/W

QSPI Access Status Register (Offset 0x000C)

QSPI Access Status Registerは、QSPI Controllerの実行ステータスを確認するためのレジスタです。

QSPI Controllerは、QSPI TX Data Regsiterへの書き込み、QSPI Rx Data Registerへの書き込み、QSPI Access Control Registerの SPI SS Controlレジスタの書き込み時に Busy状態となり、SPIが未使用状態になると Idle状態に戻ります。

bitSymbolFieldDescriptionR/W
31:1-ReservedReserved-
0SPIBUSYSPI Status BusyQSPI Controllerの実行ステータスを表示します。 0: Idle状態 1: Busy状態RO

QSPI FIFO Status Register (Offset 0x0010)

QSPI FIFO Status Registerは、TX FIFO/RX FIFOの状態を示すレジスタです。

bitSymbolFieldDescriptionR/W
31:21-ReservedReserved-
20:16TXFIFOCAPTX FIFO CapacityTX FIFOに格納されているデータ量を示すフィールドです。RO
15:5-ReservedReserved-
4:0RXFIFOCAPRX FIFO CapacityRX FIFOに格納されているデータ量を示すフィールドです。RO

QSPI FIFO Reset Register (Offset 0x0014)

QSPI FIFO Reset Registerは、TX FIFO/RX FIFOのリセット制御(データ消去)を行うためのレジスタです。 何らかの理由によりFIFOのクリアを行いたい場合にこのレジスタを使用します。

bitSymbolFieldDescriptionR/W
31:17-ReservedReserved-
16TXFIFORSTTX FIFO Reset本ビットに1をセットすると、TX FIFOがクリアされデータが消去されます。WO
15:1-ReservedReserved-
0RXFIFORSTRX FIFO Reset本ビットに1をセットすると、RX FIFOがクリアされデータが消去されます。WO

QSPI Interrupt Status Register (Offset: 0x0020)

QSPI Interrupt Status Registerは、QSPI Controllerの割り込みステータスレジスタです。 全ての割り込みビットは ”1”をセットするとクリアする事ができます。

bitSymbolFieldDescriptionR/W
31:27-ReservedReserved-
26TXFIFOUTHTX FIFO Under ThresholdTX FIFOに格納されたデータが設定した閾値を下回った事を示すビットです。TX FIFOに格納されるデータ量が QSPI FIFO Threshold Level Setting Registerの TXFIFOUTHLフィールドよりも少なくなった場合に本ビットがセットされます。R/WC
25TXFIFOOVFTX FIFO OverflowTX FIFOの Overflowが発生したことを示すビットです。TX FIFOが Fullの状態で QSPI TX Data Registerに書き込みを行うと本ビットがセットされます。R/WC
24TXFIFOUDFTX FIFO UnderflowTX FIFOの Underflowが発生したことを示すビットです。この割り込みは通常の状態で発生する事はありません。この割り込みが発生した場合は、本モジュールをリセットしてください。R/WC
23:19-ReservedReserved-
18RXFIFOOTHRX FIFO Over ThresholdRX FIFOに格納されたデータが設定した閾値を上回った事を示すビットです。RX FIFOに格納されるデータ量が QSPI FIFO Threshold Level Setting Registerの RXFIFOOTHLフィールドよりも多くなった場合に本ビットがセットされます。R/WC
17RXFIFOOVFRX FIFO OverflowRX FIFOの Overflowが発生したことを示すビットです。RX FIFOが Fullの状態でデータ受信を行うと本ビットがセットされます。R/WC
16RXFIFOUDFRX FIFO UnderflowRX FIFOの Underflowが発生したことを示すビットです。RX FIFOが Emptyの状態で QSPI RX Data Registerの読み出しを行うと本ビットがセットされます。R/WC
15:1-ReservedReserved-
0SPICTRLDNSPI Control DoneSPI制御が完了した事を示すビットです。QSPI Controllerの実行ステータス(QSPI Access Status Register: SPI Status Busyビット)が BusyからIdleに変化した時、本ビットが 1にセットされます。R/WC

QSPI Interrupt Enable Register (Offset: 0x0024)

QSPI Interrupt Enable Registerは、QSPI Controllerの割り込みイベントを割り込み信号に通知する設定を行うためのレジスタです。

bitSymbolFieldDescriptionR/W
31:27-ReservedReserved-
26TXFIFOUTHEMBTX FIFO Under Threshold EnableTXFIFOUTHイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
25TXFIFOOVFEMBTX FIFO Overflow EnableTXFIFOOVFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
24TXFIFOUDFEMBTX FIFO Underflow EnableTXFIFOUDFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
23:19-ReservedReserved-
18RXFIFOOTHEMBRX FIFO Over Threshold EnableRXFIFOOTHイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
17RXFIFOOVFEMBRX FIFO Overflow EnableRXFIFOOVFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
16RXFIFOUDFEMBRX FIFO Underflow EnableRXFIFOUDFイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W
15:1-ReservedReserved-
0SPIBUSYDNEMBSPI Status Busy Done EnableSPIBUSYDNイベントが発生した時に割り込み信号を発生させるかどうかを設定します。R/W

QSPI Clock Control Register (Offset 0x0030)

QSPI Clock Control Registerは、SPIクロックの周波数、極性、位相設定を制御するためのレジスタです。

bitSymbolFieldDescriptionR/W
31:21-ReservedReserved-
20SCKPOLSPI Clock PolaritySPIクロックのクロック極性(CPOL)を設定します。0: Idle時のクロックを Low Levelとする 1: Idle時のクロックを High LevelとするR/W
19:17-ReservedReserved-
16SCKPHASPI Clock PhaseSPIクロックのクロック位相(CPHA)を設定します。0: Data sampling: Rise Edge / Data Shift: Fall Edge 1: Data sampling: Fall Edge / Data Shift: Rise EdgeR/W
15:12-ReservedReserved-
11:0SCKDIVSPI Clock Divideシステムクロックに対するSPIクロックの分周数を設定します。本フィールドに0(最小値)をセットした場合、SPI Clockはシステムクロックを2分周した周波数で動作します。R/W

SPIクロックの周波数(fSCLK)は、システムクロック(fSYS)と SCKDIVの設定により以下のように計算されます。

$fSCLK[MHz] = \frac{fSYS[MHz]}{2(SCKDIV+1)}$

QSPI Data Capture Mode Setting Register (Offset 0x0034)

QSPI Data Capture Mode Setting Registerは、RX FIFOにデータを取り込む条件を設定するためのレジスタです。 このレジスタをセットすることで、QSPI RX Data Registerへの書き込みアクセスを行った時だけではなく、QSPI TX Data Registerへの書き込みを行った時もデータの取り込みを行う事ができます。 これにより SPIデバイスへの「送信フェーズ」「ダミーフェーズ」を含めた全てのフェーズのデータを取り込むことができます。

bitSymbolFieldDescriptionR/W
31:1-ReservedReserved-
0DTCAPTData CaptureRX FIFOにデータを取り込む条件を設定します。0: QSPI RX Data Registerの書き込み時のみ 1: QSPI TX Data Registerと QSPI RX Data Registerの両方の書き込み時R/W

QSPI FIFO Threshold Level Setting Register (Offset 0x0038)

QSPI FIFO Threshold Level Setting Registerは、TX FIFO/RX FIFOのデータ量に応じた割り込み出力を行うための設定レジスタです。

bitSymbolFieldDescriptionR/W
31:21-ReservedReserved-
20:16TXFIFOUTHLTX FIFO Under Threshold LevelTXFIFOUTH割り込みを発生させる TX FIFOのデータ格納量の閾値を設定するためのフィールドです。本フィールドに 0または最大値を設定した場合 TXFIFOUTHは無効となり、割り込みは発生しません。R/W
15:5-ReservedReserved-
4:0RXFIFOOTHLRX FIFO Over Threshold LevelRXFIFOOTH割り込みを発生させる RX FIFOのデータ格納料の閾値を設定するためのフィールドです。本フィールドに 0または最大値を設定した場合 RXFIFOOTHは無効となり、割り込みは発生しません。R/W

QSPI Controller IP Version Register (Offset: 0xF000)

QSPI Controller IPコアバージョンの管理レジスタです。

bitSymbolFieldDescriptionR/W
31:24MAJVERQSPI Controller IP Major VersionQSPI ControllerコアのMajor Versionです。RO
23:16MINVERQSPI Controller IP Minor VersionQSPI ControllerコアのMinor Versionです。RO
15:0PATVERQSPI Controller IP Patch VersionQSPI ControllerコアのPatch Versionです。RO

QSPIアクセス手順

この章では、Infineon製Flash Memory 「S25FL256L」を例に、QSPI Controllerによる Flashメモリの書き込み, 読み出しを行うための手順を説明します。

データ書き込み操作手順例

本章では、Quad Page ProgramコマンドによるFlash Memoryへのデータ書き込みの手順を説明します。 CPOL=0、CPHA=0に設定した時のSPI Interface波形と手順を以下に示します。

./images/quad_page_program_acc_seq.png

以下の手順は、メモリ 1にアクセスする場合のレジスタ設定例を示しています。 Configuration Flash Memoryを除き、メモリ 2にアクセスする場合は、QSPI Access Control Registerの SPISSCTLを 0x01から 0x02に置き換えて下さい。

A: QSPI Access Control Registerを設定します。 SPI I/O Modeは Standard(Single)-IO SPIモード、SPI SS Controlは”1”とするため、0x00000001を書き込みます。 書き込み後、SPI_CS信号がアクティブ状態(Low level)に変化します。

B: QSPI TX Data Registerに 1 ByteのInstruction(Quad Page Program: 0x32)と 3 Byteの Addressを書き込みます。 QSPI TX Data Registerに書き込まれたデータからSPIデバイスに順次送信されます。

C: Bで書き込んだ全てのデータの送信完了後に、QSPI Access Control Registerに0x00020001を書き込み、SPI I/O ModeをQuad-IO SPIモードに変更します。

D: Flash MemoryへのWriteデータをQSPI TX Data Registerに書き込み、データ送信を行います。TX FIFOは送信するデータを最大16Byteまで格納することができます。 TX FIFOの容量を超えるサイズのデータを送信する場合は、TX FIFOが OverflowしないようQSPI TX Data Registerへの書き込み間隔を調整する必要があります。 TX_FIFOのデータ格納量のステータスは、QSPI FIFO Status RegisterやTX_FIFO関連の割り込み要因により確認することができます。

E: Dで書き込んだ全てのデータの送信完了後に、QSPI Access Control Registerに0x0000_0000を書き込みSPI_CS信号をインアクティブ状態(High level)に変化させ、SPIアクセスを終了します。

CからD時の遷移を除いた全てのフェーズの切り替わりには、QSPI Controllerの実行ステータスを確認し、必ずIdle状態となってから次の操作を実行する必要があります。 実行ステータスの確認方法は以下の2通りがあります。

  • QSPI Access Status Registerの監視
  • SPICTRLDN割り込みの検出

QSPI Controllerの実行ステータスがBusyの状態で次の操作が実行された場合、SPIアクセスは不適切なフォーマットで転送される可能性があります。

データ読み出し操作手順例

本章では、Quad I/O ReadコマンドによるFlash Memoryからのデータ読み出しの手順を説明します。 CPOL=0、CPHA=0に設定した時のSPI Interfaceの波形と手順を以下に示します。

./images/quad_io_read_acc_seq.png

以下の手順は、メモリ 1にアクセスする場合のレジスタ設定例を示しています。 Configuration Flash Memoryを除き、メモリ 2にアクセスする場合は、QSPI Access Control Registerの SPISSCTLを 0x01から 0x02に置き換えて下さい。

A: QSPI Access Control Registerを設定します。 SPI I/O ModeはStandard(Single)-IO SPIモード、SPI SS Controlは1とするため、0x00000001を書き込みます。 書き込み後、SPI_CS信号がアクティブ状態(Low level)に変化します。

B: QSPI TX Data Registerに 1 ByteのInstruction(Quad I/O Read:0xEB)を書き込みます。

C: Bで書き込んだデータの送信完了後に、QSPI Access Control Registerに0x00020001を書き込み、SPI I/O ModeをQuad-IO SPIモードに変更します。

D: QSPI TX Data Registerに 3 Byteの Address、1 Byteの Modeを 1 Byte単位で書き込み、TX FIFOに格納します。 QSPI TX Data Registerに書き込まれたデータからSPIデバイスに順次送信されます。 続けて、QSPI RX Data Registerに 4 Byte分の書き込みを行います。 この操作を行うことで、8 Cycleのダミーサイクル区間で IO信号を入力モードにして SPIクロックを駆動します。

E: QSPI RX Data Registerの読み出しを 4 Byte分行い、ダミーサイクル区間に RX FIFOに格納されたデータの読み出しを行います。 ダミーサイクル区間に格納されたデータは全て無効なデータであるため破棄してください。 4 Byte分全ての無効データの読み出しを行った後に、 QSPI RX Data Registerに書き込みを行い Flash Memoryからの Readデータを RX FIFOに格納します。 受信データはQSPI RX Data Registerを読み出すことにより受信順に取得されます。 RX FIFOは受信したデータを最大16Byteまで格納できます。 RX FIFOの容量を超えるサイズのデータを受信する場合は、RX FIFOが OverflowしないようQSPI TX Data Registerの書き込みと読み出しの順序を考慮する必要があります。 RX_FIFOのデータ格納量のステータスは、QSPI FIFO Status RegisterやRX_FIFO関連の割り込み要因により確認することができます。

F: Eで受信した全てのデータ読み出しの完了後に、QSPI Access Control Registerに0x00000000を書き込みSPI_CS信号をインアクティブ状態(High level)に変化させ、SPIアクセスを終了します。

Data Write Operation時と同様、CからD時を除いた全てのフェーズの切り替わり時には、QSPI Controllerの実行ステータスを確認し、必ずIdle状態となってから次の操作を実行する必要があります。