2024年10月17日木曜日

STM32 SPI 受信送信ライブラリ関数3種

こんばんは、よろず設計中のヒラサカです.メカ設計が終わったので、STM32をやってるとこ.(あとで奥さんとノムネンに飲みに行く予定)

設計リスクにはランクがあります.超リスクと弱リスクみたいな差です.

「平易な回路を作るのだが、時間が足りない」 ←こうゆうのは弱リスクです.リスクの度合いを見積もれます.たとえしくじってもリカバリする大変さを見積もれます.

「原理的に成立するのかどうか未検証」 ←これは超ハードなリスクです.見積もり不能なリスクです.敵がどこから鉄砲撃ってくるかわからないという危険極まりない、万歳突撃にも等しい状況.(笑)

わたしは後者のケースを仕事のスケジュールに織り込んだことはありません.あまりにもヤバいから.
会社では、事前に少人数の時間を少し借りた程度の作業で原理検証を行って、確証を得てから正式な業務に昇格させます.ヤレと言われる前に先回りして原理検証しとく.
自営業では、「上手くいくかどうかわからんので約束なんかできないけどやってみましょう」というスタンスであることを念押しして原理検証に入ります.失敗しても知らん.

ところがいま、万歳突撃状態で、考えるだに大笑いしちゃう境遇なんです.年末年始の休みあるのかな? (笑)

ーーーー
それではSTM32の話題です.

今火入れしている基板で、SPI DACを動かすのためSPI 送信ばかりやっていました.

次にSPI ADCを動かします.SPI受信が必要です.STM32でSPI受信は初体験です.

仕様は、SPIデバイスに、コマンド2BYTEを送信すると、デバイスは1BYTEを返してきます.絵的にはこんなです.
↓これをMISOとMOSIに分けて描くと、こうなります.
ここでSTM32は、SPI Master、Full Duplex だとします.

↓これにclockを追記すると、、、SCKがtotal 24発のclockとして観測されます.SCKを発生させるのはSTM32です.

SPI送受信について、ArduinoのSPIライブラリの記憶では、
 SPI_Transfer(buffer, 3);
みたいな関数があって、3BYTEを廻すと、buffer[0:2]が破壊され、buffer[2]に返信データが入ってくるんだったかなと.つまりこの関数は、MOSIへ送信すると同時に、MISOを受信してもいるわけですね.Full Duplexなら合理的です.

それでSTM32のライブラリへ移るのですが、それっぽい関数が3つあるんですよ.
1)HAL_SPI_Receive             ( hSPI, spibuf, 3, 100 );
2)HAL_SPI_Transmit           ( hSPI, spibuf, 3, 100 );
3)HAL_SPI_TransmitReceive( hSPI, spiTxbuf, spiRxbuf, 3, 100 );
今日はこれで半日ぐらいハマったです.

なにせ受信する目的なのですから、迷わずHAL_SPI_Receive()を使ってみました.
しかし、MOSIが沈黙してるんです.
0.5mm pitchですからハンダ不良かなとか、、、デバイスが焼けてるとか、、、pill-upとかいろんな原因を探りましたがMOSI沈黙からリカバリできません.

夜になりいい加減に窮して、Arduinoに倣ってHAL_SPI_Transmit()を使ったらMOSIが出る!!! でも、3BYTE目を受信できない.この関数は送信しかしないらしい.

Arduinoみたいに送受信する関数があるんじゃないのか?とlibrary sourceを探したら、HAL_SPI_TransmitReceive()というのがある.すごくこれっぽい.これならちゃんと送信も受信もできました.

なにげに想定外な気がしちゃったにょ

かしこ

2 件のコメント:

  1. >HAL_SPI_TransmitReceive()
    関数名って、「名前から動作が想像できない」モノが結構多くて、
    ・気まぐれで決めたんじゃね?
    みたいなのが沢山ありますよね・・・
    ※(関数じゃないケド)unix のコマンドとか、特にひどいのは有名ですが。
    mv (MoVe の略。せめて「mov」にしろや。アセンブラとかだと「MOV x,y」みたいなのが多いですが。)
    cat (CATenate の略。英語で「連結」と言う意味だが、何故か「ファイルの中身表示」によく使われる・・・)
    (しかも、この辺って、「posix」辺りで「標準化」されてたような・・・)
    ※もっと困るのは、「API の名前」で、システムによって、名前が同じなのに「使用法とか引数に、互換性が無いモノ」ですね。
    まぁ、よくある「read()」とかは、流石に「名前が重複すると困る」ので、大概は、
    ・SYSTEM名_read() (「ESP32_read()」とか)
    になってて、「個別仕様」であることを意識したものが多いですが。

    いい加減、この辺の技術も「枯れて来てる」と思うので、
    ・標準 API
    とかを、どこか(IEEE 辺り?)で規定してくんないかな。
    いつまでも「デファクトスタンダード」に、依存してると、「x86」「Windows API」みたいなのが「世界標準」に、なっちゃうし。何も良いことが無い。
    ※もう、RISC-V 辺りでいいから「世界標準」作ってくんないかな・・・?

    返信削除
    返信
    1. おはよーございます

      unix:ls win:dir ってのもありました
      powershellではどちらも動くみたいですけども

      いまpowershellでcatと打ったらなにか知らない動作しました

      rm -rf / はサタンの呪文

      library関数を初めて使う時は面喰って時間が無駄になります

      削除