2020年11月10日火曜日

STM32で廉価4chオシロを作ろう(2)MSP3520、ILI9488

STM32で4chオシロを作ろう!

えさて、何から手を付けたらいいかしら?

Sample code
githubのこちらがやろうとしている事が似ているので参考になりました。sourceをチラ見した印象では、triggerやscalingについてはさほど凄い作業はしてないみたい。
また、triggerの実装は、ADCのhardwareが実行する閾値検出器による割込みです。filteringの面で性能に不安感ありかもな。わたしはsoftでtriggerするつもりですけれど、filteringなんかしてたら処理速度に阻まれてボツるかもしれません。

LCD仕様
制御相手の仕様が不明なのはADCとLCDです。

ADCはSTM32cubeIDEに雛形的libraryがあるのでそれをパクりゃぁ何とかなるだろう。

でもLCDは自力記述かgithubを参考にさして貰う事になると思われます。

先日Aliexpressに発注したLCD基板名称はMSP3520です。ILI9488というLCD driver ICが載ってます。

ILI9488の外部IFは何種類も用意されている中で、プリント基板としてのMSP3520はSPIに固定されています。

ILI9488のPixelは24/18/16/3bitとがあります。しかしながら、SPIで許されるのは、18bitと3bitだけです。
SPIは基本的にbyte単位なので、3bitでは1byteに2 pixelの情報が入り、18bitでは1 pixelに3bytesを要します。
ILI9488のSPI clk最高周波数は15MHzです。18bit/pixelだと1frame転送に250msも掛かる計算。チトのろい。write時20MHzみたいです.

GRAMへのグラフィックデータ転送は、書き換えたい矩形領域のpixel addressをsetした後に、burst的にデータを送信します。余分に送信しても捨てられます。(lineを描く等の小細工はILI9488の仕事では無いという事ですね)

表示期間と、GRAM書き期間の衝突防止方法は今のところ不明。ILI9488には垂直ブランク期間を示すTE信号出力が在り、本来は衝突防止可能な仕様だけど、MSP3520にはTE端子が無いんです。
冒頭のsample codeにもその様な衝突防止は無く見えます。task queに積む構造だけど、空き時間に順繰りに処理してるのみかな。
この点については謎のままです。

MSP3520/STM32間のSPI結線は?
pixel address setの様な設定をするのがコマンドです。コマンドは沢山の種類があります。SPIには、コマンド伝送/データ伝送を識別する仕組みが必要です。

MSP3520は4-wire SPI。
STM32 SPIにも4-wire SPIがある。
ところが両者の意味・思惑は違うようです。

MSP3520はコマンド/データ識別信号線を1本追加する意味で4-wireと称しています。

しかしSTM32の4-wireの意味はそうではなく、1本追加はCS的な意味ですから、コマンド/データ識別信号線としては使えそうにないです。
回避策として、STM32 4-wire SPI DMAを使いはするが、コマンド/データ識別信号線の操作はsoftでGPIOを直叩きする事になりそうです。
すなわち、SCL/MOSI/MISO/NSSはSTM32 SPI hardware信号線を配線し、それに追加でGPIOによるCMDDATAを配線するという構成になるのではないかと思います。

やってみないと判らない。


かしこ

追記: LCD driver IC ST7796Sのdatasheetをチェックしたところ、ILI9488ととても似ていました。同じ人が設計したのって思うくらいです。もしかしたらコマンドも同じかもなー

4 件のコメント:

  1. 私も github のソースを、ざっと見てみたのですが、
    ・主要なところは、STM32IDEのライブラリ使用
    ・"µOS++"という、リアルタイムOSを使っている
    ・使ってるボードは「bluepill」(有名な、小型STM32開発ボード)
    ※以前紹介した「Longan Nano」は、このボードのパクリ(プラグコンパチではないが)
    とも言われてるので、回路は「ほとんどそのまま」使えるかもしれません。
    "µOS++"は、そもそも「CMSIS-RTOS」(ARM用のRTOSとして作ったもの)なので、
    RISC-V用はないのですが、「FreeRTOSがRISC-Vをサポート」しているようなので、
    これを使えば何とかなるかも知れませんね(移植は結構大変かもしれないけど)
    (FreeRTOSはESP32用があって、ちょっとかじった。)

    ・しかし、メインルーチンって、案外短いですね。(main.cpp で、250行。)
    (「真の」メインループは、たったの 3行!)

    返信削除
    返信
    1. CMSISはIDEに登場するので名前だけ知ってたけどRTOSでしたか。

      Longanサン、ヨクニテマス。

      削除
    2. 「CMSIS」は、本家ARMの策定したインタフェース規格の名称(総称)
      https://www.arm.com/ja/why-arm/technologies/cmsis
      のことで、それに則って作ったRTOSが「CMSIS-RTOS」と言われていたのですが、
      どうも「ライセンスの問題?」で、"µOS++"という名称に変えたらしい。
      ↑のリンクにもありますが、本家ARMがこれとは別に「CMSIS-RTOS2」というのを
      作っているみたいです。

      ※なんか色々ややこしい。理解が間違ってるかもしれません・・・

      削除
    3. CMSISよかuOSがかっこいいです。

      削除