Nucleo STM32F401REでSPI DMAを利用してW5500の送受信性能改善

WIZnetのW5500は最大80MHzのSPI Clockまでサポートするため、高速SPI通信が可能なMCUを使用する使用者たちはEthernet通信性能を最大限利用したいと思う。

STMicroのCortex M3/M4系の32bitプロセッサーを使う場合、どういうSPI通信モードを使うかによってEthernet性能に大きな違いが出ることを確認できるが、このポストではSTMicroのSTM32F4xx系のMCUを使用するときSPI通信モードによるEthernet性能の差を比較して見よう。

  • システム構成

MCUボード :Nucleo STM32F401RE

Ethernet controller : WIZnet WIZ550io

  • Pin Connection

MCUボードとWIZnet WIZ550io間のピンの繋げ方は下の表を参考して構成します。まず、電源とSPI信号を繋げます。ただし、SCSピンはソフトウェア方式で処理するため、別途のGPIOピンであるGPIOA_Pin12番と繋げます。そして、WIZ550ioをハードウェアリセットするためのRSTnピンをGPIOA_Pin11と繋げ、WIZ550ioが初期化が終わったかを表示するRDYピンをGPIOA_Pin1と繋げます。RSTnピンとRDYピンは必ず繋げるべきというわけではないですが、安定的な動作のためには繋げておいたほうが良いです。

NUCLEO STM32F401RE WIZ550IO
3.3V J1_8 (3V3D) | | GND | J1_1(GND)
PA_7(MOSI) J1_3 (MOSI)
PA_6(MISO) J1_4 (MISO)
PA_5(SCLK) J1_5 (SCLK)
PA_12 J1_6 (SCSn)
PA_11 J2_3 (RSTn)
PA_1 J2_2 (RDY)

stm-1

  • SPI Protocol 具現

W5500の制御はSPI read/writeを通じて行われますが、Byte単位のSPI通信モードを使う場合であれ、SPI DMAモードを使う場合であれSPIプロトコルは同一です。標準SPI通信モードとSPI DMAモードの違いはSTM MCUとSPI Slave装置間にやりとりするSPIデータがアイドルタイム無しに連続的に発生するか否かにあると言えます。

W5500制御のためのSPIプロトコルはWIZnetで提供するioLibraryのW5500.cを見れば確認できますが、下の4つの関数が関連する関数です。

  • WIZCHIP_READ(uint32_t AddrSel)
  • WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb)
  • WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
  • WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)

各関数の内部ではSPI_DMAモードが使われない時に、下のWIZCHIP_READ_BUFの関数のように

標準SPI read/write関数を呼び出してSPI通信を遂行し、SPI_DMAモードが使われるときは下のコードのように

伝送する命令語バイトを準備して SPI_DMA_READ()関数を呼び出します。 SPI_DMA_READ()や SPI_DMA_WRITE()関数の内部構成は「STM32F2xxまたはSTM32F4xxでSPI DMAを通じて Full duplex通信を具現する」というポストで説明したようにSPI DMAモードを使うためのコードで構成されています。

  • 標準SPIモードとSPI DMAモード性能比較

下の関連資料にあるソースコードは ループバックテスト用のサンプルコードです。標準SPIモードの時とSPI DMAモードの時TCP送受信性能にどれだけ違いが出るか確認できます。

  • 標準SPIモードで

spi_handler.hで

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.