naito
2025年7月18日 18時32分
==========
製品型番:Armadillo-900
Debian/ABOSバージョン:ABOS 3.21.3-at.14
カーネルバージョン:5.10.238-at0
その他:ATDE9使用
==========
お世話になっております。
内藤です。
こちらで下記HowtoのSPI通信速度を計測すると、通信速度が最大でも140Kbpsほどになりました。
https://armadillo.atmark-techno.com/howto/a900-spi-adc-mcp3204
SPIクロックを確認したところ、連続でマスターから通信を送っても通信間隔が167usほど開いているのですが、
M33を経由するためオーバヘッドはこれぐらいかかっているということで認識合いますでしょうか。
それともこちらの環境の問題でしょうか。
また、M33を経由しないLPSPI4,5を使うとオーバーヘッドは小さくなると考えておりますが間違いありませんでしょうか。
重ねての質問となりますが、SPI通信以外に通信速度が2Mbps以上となる通信手段はありますでしょうか。
以上、よろしくお願いいたします。
at_dominique.m…
2025年7月23日 9時10分
内藤さん
お世話になっています、
マルティネです。
返事が遅くなってすみません。
詳細はまだ確認していませんが、ひとまず自分の認識上から回答させていただきます。
> こちらで下記HowtoのSPI通信速度を計測すると、通信速度が最大でも140Kbpsほどになりました。
> https://armadillo.atmark-techno.com/howto/a900-spi-adc-mcp3204
> SPIクロックを確認したところ、連続でマスターから通信を送っても通信間隔が167usほど開いているのですが、
> M33を経由するためオーバヘッドはこれぐらいかかっているということで認識合いますでしょうか。
なるほど、確かに pipelineっぽい仕組みはないので、通信中に linux が待っていて、通信完了した後に次のメッセージを m33 に送りますのでそういうギャップができますね…
上記の数字ですと、1メッセージあったりに32bytesぐらいを通信しているようにみえますが、その量を増やせばギャップの影響が薄くなるはずです。メッセージのサイズを大きくできますでしょうか?
(linux/m33 プロとコーロ上の最大サイズは 476 byte までです)
また、pipeline (メッセージ通信完了前に m33 に次のメッセージを送る)の様な実装ですが、Linux の SPI ドライバーとしての実装は厳しいと思います。
tx/rx が分けてるプロトコールでしたらエラー処理が難しいだけですが、SPI の場合は受信データも処理しないといけないので、バッファーを後でリターンできません。
> また、M33を経由しないLPSPI4,5を使うとオーバーヘッドは小さくなると考えておりますが間違いありませんでしょうか。
そうですね、こちらも実際に図ってみないとなんとも言えませんが、linux-m33 通信がない分にオーバーヘッドが少ないと考えて間違いないと思います。
ただし、別のオーバーヘッドとしては linux の irq 処理が間に合わないといけないので、受信の文字取りこぼしなどはあるかもしれません(
見たところ dma を利用していますので実装次第問題ないかもしれませんが、(rx buffer が半分の)lpuart の場合は 115200 baud でも取りこぼしてますので、評価が必要だと考えています)
また、遅くなっている原因は linux-m33 の通信ではなく linux のドライバでしたら差もそんなにない可能性は高いです。
スピードの変更しやすい UART で LPUART0 (A9E の /dev/ttyrmpsg1) と LPUART5 (A9E の /dev/ttyLP1) を比較したところ、やっぱりメッセージのサイズによって差を感じますが、大きいバッファーを利用できれば影響を抑えれますね。
(こちらは送信だけを試して、受信できるかどうかは見てません。前に確認したところ、rpmsg の場合は 1M で受信を取りこぼしせずにできてましたが、3M を受信するには m33 側の実装の改善が必要と記憶しています)
なので、小さいメッセージの場合は影響大きいですが、大きいメッセージを利用すれば linux との差が小さくなります。
> 重ねての質問となりますが、SPI通信以外に通信速度が2Mbps以上となる通信手段はありますでしょうか。
bit で間違いなければ、上記の uart + 3M の baud rate でしたらできそうですね。
それ以外に思いつけるのは SDIO, ethernet か wifi ぐらいですが、利用できない前提でしょうか。
よろしくお願いします