2025年7月25日金曜日

STM32 USART その後の問題について Slave→Master

4月にSTM32のUSARTでCPU間通信を実験しました. →こちら

こんな条件で無問題でした.
・別CPU間の伝送 Master→Slave
・USART clockは1MHzと2MHzで速度テスト
・1000BYTEのブロック転送

プリント基板もUSARTを使う前提で作り、火入れしているところです.

がっ、とある問題でボツリヌス菌になってしまいました~

問題とは、Slave→Master通信がうまくいきません! 参ったねこれは.

問題はUSARTのclkにあります.
USART busにclkを出力するのはmasterの役割です.slaveはmasterが出力したclkを使います.
STM32のUSART peripheralの場合、このどちらだと思いますか?
 1)clkは常時出ている
 2)clkはmasterが出力したときだけ出る
なんと2なんですねぇ・・・
したがって、Slaveが出力したいときに合わせてclkをMasterが供給してくれるという予知能力の問題にハマって脱出不能になる.こりゃヤバいですぞ.

USBみたく、MasterがSlaveの出力を完全に制御するようなやり取りならまだ脱出路があるとは思うんですけれど、USARTを使うからにはそういう作法に捉われたくないからUSARTを使うので、いつか判らないSlaveの出力を予測してMasterがclkを出力するなんてゆう仕組みは超能力です.

う~ん、かなりボツだなこりゃ.全2重とは言い難いぞUSART.

ーーーー
そもそも、なんでUSARTを使うのか? なんでUARTじゃないのか?
USARTはclkを使う同期伝送です.
UARTはclkを使わない非同期の調歩同期伝送です.UARTの方が簡単です.
でも、UARTの場合は2つのCPUのclk周波数のズレが甚だしいと調歩同期に失敗してエラーするリスクがあります.まして、baud rateを1Mbpsぐらいで使いたいのでかなりシビアではないかと危惧しました.それでUSARTにしました.

しかしUSARTにはSlave→Masterの向きの伝送がキモいという問題があると今日判りました.

なおUSARTを使うのは初めてです.

あとSPI使わないのという疑問ある?

SPIとI2Cもバスレベルでかるーくhandshakeっぽいじゃん。DMA中にコネクタ引っこ抜かれるとwatchdogのお世話になるレベルでhangupするのが嫌なんだわ。DMAにもtimeoutがあればいいんだけど。

ーーーー
対策案:

1)USARTをMaster→Slaveのみで使い、かつSlave→MaserはUARTを使う.Slave→Masterは9600bpsでも構わない.配線数は増える.

2)1つの源発振clkを全てのCPUに分配する.UARTを全二重で使う.USARTは使わない.clk配線は増える.

3)各CPU clkをXTALにする.UARTを全二重で使う.USARTは使わない.(最初にボツにした案)

3を最初にボツにした理由は、
・XTALを乗せるのが面倒くさい
・異clk間伝送なので完璧ではない
・XTALの精度がどれだけ?という問題を永久に引き摺るのが嫌

だけどこれから3を試します.
XTALは50ppmのものを用意しました.

ちなみにですね、、、STM32のUARTのbaudrate generatorは、整数分の1で割り切れないケースでは、1/(N-1)、1/N、1/(N+1)のバタバタ切替方式で小数分の1を実現するらしいです.registerでその機能をkillできるらしいです.また厄介な.

かしこ

32 件のコメント:

  1. 読者
    4 秋葉原で56Kbpsのモデムを2つ買ってきて対向させる(そんなわけない)

    返信削除
    返信
    1. 音響カプラという悲しいイロモノ

      削除
    2. 読者
      USARTは同期式なので
      送りと受けにおなじクロックを供給しないと
      うごかない気がします
      CPUクロックとは別の 伝送用クロック
      どうすんのかな?
      非同期のUARTは 送りと受けはクロック合ってなくてもうごきますね

      削除
    3. USARTは投了になりました あっけなし

      削除
  2. murasaki
    生まれてこのかたUSARTは使ったこと無いですね。結構いにしえの技術だとは思うのですが。
    精度保証のある水晶発振器を使ってUARTが個人的にオススメかもです。50ppmなら送受信の精度が最大幅で逆方向に偏っても大丈夫かと。

    返信削除
    返信
    1. USARTってマイナー感が漂います
      CPUにはたくさん載ってるのですが

      削除
    2. 通信方式としては調歩同期より原理的に素直な気がしますが、自分のまわりでも使っている人は見かけなかった気がします。USARTが普及せず、I2CとかSPIとかが普及しちゃったんですね。今回のような問題があるからですかね。というか、一方向の通信しか事実上できないような気がしますが気のせいでしょうか?

      削除
    3. USARTは片方向でしか使う気がしなくなりました
      さよならUSART

      削除
  3. murasaki
    UARTのいいところは1バイト受信毎に偏差の影響がキャンセルされることですね。

    返信削除
  4. 古(いにしえ)のプロトコルに、
    ・HDLC/SDLCプロトコル
    というのがありますが、コレは、
    ・データを送って無い時も、延々と「Sync Pattern」を送り続ける
    と言う仕様になっていて、これによって、
    ・Clock偏差の影響を減らす
    (HDLC/SDLCプロトコル 自体は、UART/USART のどちらでも使える)
    という仕組みになっています。

    という、古の知識(笑)を、思い出しました。
    HDLC/SDLCプロトコル は、Extensible なので、N対N通信も使えます。
    (多分、RS422/485 でも使うことを考えてたんだと思う。)
    ※探せば、STM32 のライブラリに無いのかな?知らんけど

    返信削除
    返信
    1. ソフトで実装するなら、
      ・スレッドか何かで「常に」何か(Sync patttern)を送出しておく。これは、ハード的なClock同期も兼ねる。
      ・サービスロジックを Call すると、その時だけ「実データを送出」するようにしておく
      みたいな感じですが。
      (言葉で説明するのが難しいな・・・でも、こういう一連の動作をするライブラリって、有りそうなんだけどな。)

      削除
    2. ちなみに昔は、こう言う「めんどくさいプロトコル」は、専用ICがあった。こんなの
      https://www.fsi-embedded.jp/product_detail/4165/
      (これは、FPGA の IPみたいですが・・・)

      削除
    3. DLCはSTM32界隈で見たことないけど、
      汎用シリアルっぽくしたいIF peripheralに類似品があるかもしんない

      削除
    4. 似たようなので、
      ・トークンリング(プロトコル)
      と言うのもあります。(説明めんどいので、自分でググって調べてください。。。)
      ※実は、これは「RS232C」でも使えるのは知られてない・・・
      「専用ハード」のほうが、有名だからかな?

      削除
    5. 名前は知ってる
      なんかカッコいい

      削除
  5. >2)clkはmasterが出力したときだけ出る
    まぁ、これは、
    ・消費電力対策
    (無駄な動作は、消費電力増や発熱の元だし)
    なんだろうけどな・・・
    ※常にクロック出すモード、って無いのかな?

    返信削除
    返信
    1. oh agree.
      だしっぱmode、cubeMXにはその選択肢無かったけど、registerにはあるかな
      あでも、同じ問題で困ってるエンジニアの死体はnetに何個か転がってた
      えぐー

      削除
  6. なんかもう、
    ・こういうめんどくさいこと考えたくない
    ので、「みんな IP通信でいいや」みたいな流れがあるような気がする・・・
    ※そのうち「廉価版」にも、Ethernet driver が付いたりして。

    返信削除
    返信
    1. etherでdebugはいいさ
      おあとがよろしいようで

      削除
  7. こんなの
    https://www.youtube.com/watch?v=6QRKpd28NEE
    Cheap Risc-V Supercluster for $2 (DIY, CH32V003)
    やってる人が、「チップ間の通信に苦労した」って記事見たことあるけど、確か結局「シリアル通信」使ってたんだよな・・・
    ※そういう意味では、今やってるのも結構「最先端技術」なのかも知れない・・・

    返信削除
    返信
    1. CHV003は秋月でも売ってるあれだろうか

      削除
    2. >秋月でも売ってるあれ
      はい、そうです。秋月でも売ってます(笑)

      削除
  8. 「HDLC」とか「トークンリング」とか、
    ・今の若い人は知らない
    のだろうなー。
    (ちなみに私は「Twinax」世代(笑)← 多分、殆どの人は何言ってるか分かんないと思います)
    ※この頃の技術って、それこそ、
    ・9600 baud とか その辺の時代
    なので、基本は結構シンプルな構造だから、分かりやすい。
    昔のIBMは、ホントに凄かったんだなー、と思った。

    返信削除
    返信
    1. この辺りの技術が開発されたのって、
      ・1950 ~ 60 年代
      で、やっとコンピュータが「ネットワーク化」し出した時代
      (コンピュータ同士をつないで、「自動化させる」という試みが始まった時代)
      なので、本質的に「やってることは同じ」なので、参考に成る事(考え方とか)が、結構ある。

      ※まぁ、イマドキは、
      ・ライブラリに無ければ「諦める」(笑)
      時代だからなー。
      ※「ライブラリが無いので、コレできません!」が、通用する(笑)時代です。

      なんか、やっぱり「人類は退化してる」のかも知れない・・・

      削除
    2. あるいは、盛大に、
      ・車輪の再発明
      を、やってんだろうな・・・

      ※やっぱり「人類は退化してる」(笑)

      削除
    3. >人類は退化しました
      ってアニメなかったっけ?と思ったら、
      ・『人類は衰退しました』
      だった・・・ちなみに、私は見たこと無い(笑)
      ※もはや、そんな事どーでもいいやって感じ

      削除
    4. あまり話題にならなかったアニメでした
      全部は観なかったかな

      削除