100MHz超のパルスオシレータが必要になったのでなんかないかなと探したら、秋月電子で売ってるSi5351Aというのが便利そう.
↓この写真の紫のやつが中華通販のSi5351Aであって、秋月のものとは異なる.上の基板は自作のSTM32G030F6P6の基板だ.同CPUはTSSOP20で小さな用途には便利で多用している.お値段も中華通販で最安@¥90ぐらいかな.
↓紫基板の回路図はこれみたいよ.Adafruitsがオリジナルみたいよ.(クリックで拡大)
↓STM32G030周辺回路.UART1とI2C2をアサインしとるかんじ~
だが動かない.
原因は、Si5351Aの初期化関数でhang-upしてたのが原因だった.I2Cって軽くhand shakeしているのでなにも繋がってないと停まってしまう.
Si5351Aの回路構成は簡単には「PLL→分周」だけと言える.だがAIに何度頼んでも100kHzの発振すらできない.
AIがてこずる理由は、Si5351Aのレジスタ構造が複雑だから.これって本当にプロが設計したものなのかなと疑いたくなるレベル.
どういうことかというと、
1)8bitレジスタが鬼のように多い(アドレス空間が256 BYTESもある)
2)DIV[19:0]のような分周設定レジスタが多くあるが、8bit busなので3つのアドレスに分裂しDIV[19:0]={DIV[19:16]DIV[15:8]DIV[7:0]}形式になってしまっている.まぁこれはI2Cだから仕方ないかも
3)DIV[19:16]と他のレジスタbitがひとつのアドレスで混ざっている (最凶)
4)レジスタ値と実際の分周比に謎の補正が必要 (分周比=レジスタ値ー512)
5)分周比に0~2048のような範囲制限がある (AIが間違える原因)
6)分周比=偶数制限がある?
7)AIの言い訳によると、モードによってなにか制限があるらしい (AIが間違える原因)
あとこれは性能面なんだけど、
Si5351Aは分数の分周比を設定できる. (分周比=a+b/c)
分数分周は整数分周よりも細かな周波数設定をできるので便利なんだが、分数にするとPLLにノイズが増える.PLLにノイズが増えるとジッタが増える.とりあえず分数分周は避けておく.
というわけで、本件はヤバすぎるのでここまでで一旦おしまい.githubでも徘徊してヒントを探すわ.
ーーーー
翌日.
えげつない事実が発覚した.基板不良を含んでいる.
写真左のようにジッタが多い.ジッタというかどこか死んでるレベル.
ところが、Si5351A~XTALの付近を指で触ったり押したりするとジッタが消える.(写真右)
続報をお楽しみに....
ーーーー
まず疑うのはハンダ不良ということで、、、
1)虫眼鏡で観察 →なんともいえない
2)ヒートガンで炙る →変化なし
3)手ハンダやりなおし(Si5351+XTAL) →変化なし
というわけでハンダ不良説は行き詰まり.
次にレジスタをいじってみる.
Si5351はレジスタで「XTALのキャパシタを10,8,6pFから選択できる」ようになっている.
これでジッタの出方が変わる.
XTAL付近を指で触ったらジッタが治ったことと符号する.
XTALが死にかかっているのではないだろうか?
邪推であるが20pFなら安定して発振するような独特なXTALなのかもしれない.
↓originalのXTAL発振子を撤去し、25MHzの発振器を取り付け、Si5351のXA端子に0.01uFを介して注入する.ジッタが治った.発振周波数がレジスタ操作と異なる問題も治ったっぽい.
CPUに発振子は使わないで発振器を使うようにしている.
ただしSi5351Aはclock発生ICなので、ジッタ性能が不明瞭な発振器を源発振にしたら用途本来の意義に反するので発振子を使うのが正解であるという事情は承知するところだ.
ハナシは逸れるが、MEMS発振器というのがある.MEMS発振器は水晶でなくシリコン音叉で発振する物だそうだが、安定性信頼性がXTALよりも良いと訴求している.XTALにはなんとなく不良があるものなのだろう.ppmのレアケースかもしれぬがの.
ーーーー
エピローグ
動いたので、STM32CUBEIDEのproject詰め合わせをupしておくなり
あ、忘れてた.こちらのgithubを参考にさせてもらいました.サンクス
AIにさんざ文句を言ってしまったが、AIのcodeでもちゃんと動いたのかもしれない.
かしこ
