SPIを断念して、UARTを使おうとしたけどNGで、USARTに逃げたというstoryを以下に書きます.
CPUはSTM32H743です.
【UART】
UARTの最大bit rateはどのくらいか?
→UARTの回路としては10Mbpsぐらいまで可能らしい(伝送線による劣化はさておく)
というわけでUARTで通信しようと思う.
logic直結でもいいけど、、、RS485でも使うかね.transceiver ICを探してみよう.
→秋月で5MbpsのIC売ってる
伝送路はOKOK
CPU間をUARTで繋ぎ1Mbpsで伝送実験をやったら、ポコポコbit errorする.ASCIIキャラクタを送受信する実験なのだが、ランダムエラーではなくて、明らかに周期性がある.加えて、単一CPUでloopbackするとこのerrorは出なくなる.
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmTTTTTtuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnTTTTTTvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>TTTTDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} !"#$%&'()*+,-./
推定原因は、、、
CPUの内蔵RC発振器の周波数偏差だと思われる.
RC発振器の周波数偏差を測定したところ0.05%だった.たった0.05%で馬脚とはシブい.
ref. manualによれば数%の周波数偏差までOKなはず.
UARTの調歩同期回路ダサくね?
ともあれ、USBのようにPLLでclock再生する上位構成に比べるとUARTの調歩同期の限界だ.
CPUの発振器をXTALに変更すれば治るだろうが、そこまでしても根っこの信頼性がイマイチで、禍根を残すのは避けたい.
【USART】
同期の問題なのだからUSARTなら治るはず.clk伝送するのは嫌だがね.
STM32CubeMXのUSART設定で悩んだ.clock last bitをenableにするの必須.defaultでdisableなのはどうゆうこった? これは、8bit伝送するのにclkが7発(disable)か8発(enable)かの設定で、7発では動かなかった.要注意でーす
それでいまUSARTを2Mbpsで実験中だが、安定して動いている.
ただ、若干の問題があった.
この伝送systemの動作条件は、
・CPU1とCPU2が別個体
・いつどちらかが電源断するか判らない
・いつどちらかが起動するかも判らない
・それでも正常に通信が復旧すること
SPIは↑これがめっぽう弱い.
UARTは送りっぱなしなので強い.
USARTも送りっぱなしなので強い.
だからこそUART/USARTへ逃げてきたわけなのだが、とある場面で電源断/再起動させるとUART/USARTでも動かなくなった.
それは受信側のDMA.
DMAの転送中か待ち受け中かは知らないが、master送信が途切れると受信DMAがhangupする.
そこで、DMAのstatusが変だったら一旦DMA stopすることにした.これで復旧する.
r = HAL_USART_Receive_DMA(&husart2, uart2RXbuf, 2);
if(r!=HAL_OK) HAL_USART_DMAStop(&husart2);
USARTを初めて動かしました.以上でーす.
かしこ
スズキです。「謎の彼女X」コミックスをKindleで全巻通して読みました。やはり名作。卜部ちゃんがしゃべるたび、吉谷さんのアテレコが聞こえます。
返信削除ビズリーチ!
削除murasaki
返信削除FAでUART使っていた時には必ず水晶発振子使ってました。調歩同期の場合、偏差は結構シビアだったかと思います。パリティとか使う場合は11ビット位使うのでその間偏差が累積します。送信側と受信の両方で偏差が逆になったときとかも考えると100ppm位の偏差が安全だった気がしますー。
100ppm→0.01%
削除たしかに今回の実験でもそんなオーダーへ引き籠りたい気分ですなぁ(笑)
水晶使えば安物水晶でも鉄板で10ppmとか行けるのかというとそうでもないが、でも100ppmはイケそうちっくな風景
murasaki
削除もう30年くらい前ですが(おそろしい)、当時はふつーの安い水晶が100ppmで高精度が50ppmだったような・・。
水晶ならシャキッとせい
削除ppmみたいな性能物を過信しちゃいかんですな (逃げ腰)
削除読者
削除水晶って arduinoについているものは
安そう 時計用の水晶も激安だった
10円とか?
安物は精度悪いと疑ってかかりましょう!
削除お薬のジェネリックみたいなものか? しらんけど
読者 こんな感じでした お値段
削除ジャンクだったのでバッタもので 当初は定価で売られていた水晶がバッタ品のジャンクだったのかな?
古い部品もあり スイッチなんか金属が黒色に変色
した端子だったりした
お店の雰囲気としては国際ラジオの昭和から在庫の
部品がそのままあったかんじ
場所は ドンキの裏を上野に向かい むかしの
Eイヤホンをすぎて50mくらい
5年くらい前にはなくなっていた
もしかすると10年経った?
https://www.aitendo.com/product/5028
円筒形クリスタル(10個入) [XTAL32.768K]
販売価格: 150円(税別)
(税込: 165円)
あaitendoだ
削除中学生のとき初めて行った秋葉原で初めてパーツ買ったのが国際ラジオでした
murasaki
返信削除なるほどー、DMAとかもノイズとか中断的なものへの備えが薄そうですねー、、
UARTでも相手が落ちると不正にスタートビットが来てノイズ的なデータを受信しそうですねー。
STM32のライブラリだけなのかもしれませんが、DMAは脆弱です
削除タノム、もどって来てくれ!DMA!
UARTで不正データ監視して、いつまでも不正だったら切り離しちゃるわ
読者
削除UARTって ラズパイにGPSをつなぐときに
使ったような 9800bps 19200bps
とだいぶ おそい
キーボードの入力くらい遅い
USARTは使ったことないんです
そんなものがあったとは・・
話は電源別の基板のデータ線を
つなぐのに使っているみたいですね
電話モデムの56kbpsくらいなら
安定しそうですが
2Mbpsもでるなんてびっくり
LSIの回路的には2MHzなんてドロドロの低速域ですから、
削除短距離通信ならイケても不思議じゃないみたいです
読者
削除Z80の回路を作った人の記事をみていたら
ロジックのICのクロックのタイミングを
みているんですね
クロックは4MHzくらいでした
ペンティアムCPUの当初は
33MHzとかだったから
バス速度
PC98 16MHzで 高速だったのでは
5MHz8MHz10Mz
もあったようだ
Z8000はぜんぜん流行しませんでした
削除