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できるらしいです.また厄介な.
かしこ
読者
返信削除4 秋葉原で56Kbpsのモデムを2つ買ってきて対向させる(そんなわけない)
音響カプラという悲しいイロモノ
削除読者
削除USARTは同期式なので
送りと受けにおなじクロックを供給しないと
うごかない気がします
CPUクロックとは別の 伝送用クロック
どうすんのかな?
非同期のUARTは 送りと受けはクロック合ってなくてもうごきますね
USARTは投了になりました あっけなし
削除murasaki
返信削除生まれてこのかたUSARTは使ったこと無いですね。結構いにしえの技術だとは思うのですが。
精度保証のある水晶発振器を使ってUARTが個人的にオススメかもです。50ppmなら送受信の精度が最大幅で逆方向に偏っても大丈夫かと。
USARTってマイナー感が漂います
削除CPUにはたくさん載ってるのですが
通信方式としては調歩同期より原理的に素直な気がしますが、自分のまわりでも使っている人は見かけなかった気がします。USARTが普及せず、I2CとかSPIとかが普及しちゃったんですね。今回のような問題があるからですかね。というか、一方向の通信しか事実上できないような気がしますが気のせいでしょうか?
削除USARTは片方向でしか使う気がしなくなりました
削除さよならUSART
murasaki
返信削除UARTのいいところは1バイト受信毎に偏差の影響がキャンセルされることですね。
調歩同期は重宝します
削除おあとがよろしいようで
座布団10枚進呈。
削除座布団楽勝GET
削除古(いにしえ)のプロトコルに、
返信削除・HDLC/SDLCプロトコル
というのがありますが、コレは、
・データを送って無い時も、延々と「Sync Pattern」を送り続ける
と言う仕様になっていて、これによって、
・Clock偏差の影響を減らす
(HDLC/SDLCプロトコル 自体は、UART/USART のどちらでも使える)
という仕組みになっています。
という、古の知識(笑)を、思い出しました。
HDLC/SDLCプロトコル は、Extensible なので、N対N通信も使えます。
(多分、RS422/485 でも使うことを考えてたんだと思う。)
※探せば、STM32 のライブラリに無いのかな?知らんけど
ソフトで実装するなら、
削除・スレッドか何かで「常に」何か(Sync patttern)を送出しておく。これは、ハード的なClock同期も兼ねる。
・サービスロジックを Call すると、その時だけ「実データを送出」するようにしておく
みたいな感じですが。
(言葉で説明するのが難しいな・・・でも、こういう一連の動作をするライブラリって、有りそうなんだけどな。)
ちなみに昔は、こう言う「めんどくさいプロトコル」は、専用ICがあった。こんなの
削除https://www.fsi-embedded.jp/product_detail/4165/
(これは、FPGA の IPみたいですが・・・)
DLCはSTM32界隈で見たことないけど、
削除汎用シリアルっぽくしたいIF peripheralに類似品があるかもしんない
似たようなので、
削除・トークンリング(プロトコル)
と言うのもあります。(説明めんどいので、自分でググって調べてください。。。)
※実は、これは「RS232C」でも使えるのは知られてない・・・
「専用ハード」のほうが、有名だからかな?
名前は知ってる
削除なんかカッコいい
>2)clkはmasterが出力したときだけ出る
返信削除まぁ、これは、
・消費電力対策
(無駄な動作は、消費電力増や発熱の元だし)
なんだろうけどな・・・
※常にクロック出すモード、って無いのかな?
oh agree.
削除だしっぱmode、cubeMXにはその選択肢無かったけど、registerにはあるかな
あでも、同じ問題で困ってるエンジニアの死体はnetに何個か転がってた
えぐー
なんかもう、
返信削除・こういうめんどくさいこと考えたくない
ので、「みんな IP通信でいいや」みたいな流れがあるような気がする・・・
※そのうち「廉価版」にも、Ethernet driver が付いたりして。
etherでdebugはいいさ
削除おあとがよろしいようで
こんなの
返信削除https://www.youtube.com/watch?v=6QRKpd28NEE
Cheap Risc-V Supercluster for $2 (DIY, CH32V003)
やってる人が、「チップ間の通信に苦労した」って記事見たことあるけど、確か結局「シリアル通信」使ってたんだよな・・・
※そういう意味では、今やってるのも結構「最先端技術」なのかも知れない・・・
CHV003は秋月でも売ってるあれだろうか
削除>秋月でも売ってるあれ
削除はい、そうです。秋月でも売ってます(笑)
秋月終了
削除「HDLC」とか「トークンリング」とか、
返信削除・今の若い人は知らない
のだろうなー。
(ちなみに私は「Twinax」世代(笑)← 多分、殆どの人は何言ってるか分かんないと思います)
※この頃の技術って、それこそ、
・9600 baud とか その辺の時代
なので、基本は結構シンプルな構造だから、分かりやすい。
昔のIBMは、ホントに凄かったんだなー、と思った。
この辺りの技術が開発されたのって、
削除・1950 ~ 60 年代
で、やっとコンピュータが「ネットワーク化」し出した時代
(コンピュータ同士をつないで、「自動化させる」という試みが始まった時代)
なので、本質的に「やってることは同じ」なので、参考に成る事(考え方とか)が、結構ある。
※まぁ、イマドキは、
・ライブラリに無ければ「諦める」(笑)
時代だからなー。
※「ライブラリが無いので、コレできません!」が、通用する(笑)時代です。
なんか、やっぱり「人類は退化してる」のかも知れない・・・
あるいは、盛大に、
削除・車輪の再発明
を、やってんだろうな・・・
※やっぱり「人類は退化してる」(笑)
Twinax?知らんちゃ
削除>人類は退化しました
削除ってアニメなかったっけ?と思ったら、
・『人類は衰退しました』
だった・・・ちなみに、私は見たこと無い(笑)
※もはや、そんな事どーでもいいやって感じ
あまり話題にならなかったアニメでした
削除全部は観なかったかな