2020年4月30日木曜日

STM32でDCCを作る方向で (7) SPIの具合はどうかな?

STM32 DCCの開発を行っている.    INDEXページへ

PCからのaudio streamがSTM32内部FIFOへブタ積みされるのはわたしには高難易度だけどやればできるのだろう.

どうやったらできるのかがいまいち謎なのは、意外にも、FIFOに積まれたaudio streamを円満にCPU外部へ出力できるのか、なのだ.もちろんFPGAみたくロジックを全部自分で設計するのなら無問題である.しかしここでは、STM32のDMAでどうやって外部出力するんだい?という点が課題となる.

ちなみに、DMAのdestinationとしてGPIOを指定することは出来ないようだ.
DMA出来るのは、SPIやI2CのようなSTM32に内蔵されたperipheralだけである.
ゆえに、SPIやI2Cへaudio stream dataを不具合なく出力できるかどうかを実機で確認しなくてはならない.(I2Cは最初から捨てている)

今回は、STM32内蔵SPI1を使ってみて、その挙動をチェックしてみる.
targetはSTM32F207.SPIのSCKは最高設定の30MHzである.TX only masterである.
STM32CubeMXでSPI1を組み込む方法については割愛する.

main.cのwhile()にSPIを動かすcodeを追加する.txbuf1[]="123"とする.
このcodeは、CPUが介在してSPIへせっせとデータを運ぶ形式である.
  while (1)  {
while (HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY){}
HAL_SPI_Transmit(&hspi1, txbuf1, sizeof(txbuf1), 0xFFFF);
HAL_Delay(500);
  }
↓SPIバスのMISO(上)とSCK(下)を観測したらこうなった.
なんで送信が間歇的になっているんだ? CPUがせっせと働いている遅延時間なのだろう.こりゃ使えない.それともう一つ気になるのは、送信バイト数は3bytesなのに、4byte目に00Hが勝手に挿入されているんだが... この00H挿入は偶数bytes合わせのためかと思ったがそうではなく、4bytes送信には5byte目に00Hが挿入されるのを確認した.

次に、DMAで同じことをやってみると、、、、
  while (1)  {
while (HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY){}
HAL_SPI_Transmit_DMA(&hspi1, txbuf1, sizeof(txbuf1));
HAL_Delay(500);
  }
↓DMAは高速なので間歇じゃなくなった.全部一気に送信している.でも、末尾の00H送信は変わらず.こりゃ使えない.

結論: SPIはなんか嫌だなぁ.これじゃぁ後段のFPGAの処理がめんどくさくなってまう.

別のIFを試してみることにする.

解決追記 コメ欄にあるとおり、末尾の00Hはstringの末尾の00Hをsizeof()がカウントしているからでした.コメントさんに感謝.これならSPIでOKじゃね?

かしこ

6 件のコメント:

  1. 4 Bytes送信されるのはtxbuf1[]="123"で、終端文字分も配列が確保されたものに対してsizeofを使っているからです。txbuf1[3] = { '1', '2', '3' }とするか、strlenを使うかだけど、前のほうがいいかな。

    返信削除
    返信
    1. あそうかそうか、末尾の00もカウントしてsuzeof()=4になっとるんですね.
      ありがとうございます.たぶんその問題がクリアされればSPIで無問題になりそう.
      多謝、多謝、、、

      削除
    2. 鋭い指摘ですね!
      「組み込みで高級言語を使うと思わぬところにハマる」の、いい例ですね。
      ※自分は横から見てて、ずっと「そういうハードウエアの仕様」だと思ってた。
      ※昔、H8のCコンパイラで、999 と 999L の違いで挙動が違って、なかなか判らず
      ハマったことがありました・・・(ちなみにこれは、確保される領域長が変わる
      ので、配置アドレスがズレるという問題でした)

      削除
    3. わたしが仕事として組み込みやった経験はただ一つ.8085を1988年ごろにやったきりであります.あとは自己流.簡単に死亡します.

      削除
    4. Arduino の Scratch は、こういうのにハマらないように、
      ああいうアプローチを取ったんだろうな、と思います。
      ※言語と言うか、スクリプトですね。

      以前、
      >Nucleoという愛称で呼ばれています.Arduinoに対抗したネーミングっぽいです.
      と言う記事があったのですが、じゃぁ
      「Scratch に対抗した何か」
      って無いんですかね?

      削除
    5. scratchを初めて知りました.小中学生でも使える感じでしょうか.自分が小中学生の頃に在ったらハマったと思います.

      rustという言語が便利そうで興味があります.

      削除