STM32 での SPI 制御

Analog3 モジュールに STM32 は使えるかどうかは、このコントローラで CAN の制御ができるかにかかっています。具体的には CAN コントローラである MCP2515 ゆくゆくは MCP2517 あるいは MCP2518 と SPI 通信できるかにかかっています。CAN 内蔵のコントローラを使う予定は今のところありません。

ということで、真っ先に MCP2515 CAN コントローラとの通信を試みているわけですが、難航しています。ここはいつも苦労するところです。すんなりいったのは Raspberry Pi だけだったなあ。

マイクロコントローラと MCP2515 をつなぐには CLK, MISO, MOSI, Enable と SPI の四本線全部いるのですが、これをコントローラの SPI ユニットを使って繋いでみた信号が下の絵です。3バイト送られています。SPI プロトコルとしてはエラーはないのですが、実は MCP2515 の仕様上ではこれは正しく動作しません。

何が問題かというと、この3バイトは一つの命令セットなのですが、命令セットの途中で SPI を disable すると命令がキャンセルされてしまうのです。SPI の設定で直らないかと試みましたが今のところうまくいっていません。仕方がないので、備え付けの Enable ピン (STM32 では NSS という呼び名) の代わりに GPIO で以下のように制御したら命令セットは認識されるようにはなりました。

inline void platform_write_spi(uint8_t *buffer, size_t length) {
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_RESET);
  HAL_SPI_TransmitReceive(hspi, buffer, buffer, length, 1000);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_SET);
}
C

しかしまだ問題が。以下は1バイトで1語の RESET 命令ですが、SPI 送信は非常に短時間で終わるのに Enable 信号を合わせると 24μS もかかっています。

以下は3バイト一命令のセット、2バイト目と3バイト目に大きな隙間が空きます。タイムアウトとかはないので動作はするのですが、せっかく速いプロセッサを使ってもこれでは意味がありません。これなら 8 bit コントローラの方が速いかも?

GPIO 制御の関数が遅いのかな?と思って、以下のように GPIO のオンオフを 6回繰り返して様子見しました。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(CAN_EN_GPIO_Port, CAN_EN_Pin, GPIO_PIN_RESET);
  can_init(&hspi1);
C

1μS 強ぐらいで実行するようです。システムクロックは 48 MHz もあるのでもう少し速くてもいいんですよ?とは思いますが今のところこれが問題なのではなさそうです。

どうも SPI の API 側が遅い模様。これは手こずりそうな予感がします。ちょっと弱気になって、廉価版の PSoC も並行して検討しようかな?などと考えつつ、まだもう少し粘ってみます。つまづくと時間がかかるなあ。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください