RSPIは8bit単位のDMAC/DTCでの転送は不可能?

RSPIのデータレジスタ(SPDR)は、16bit/32bitでのアクセスしか許可されていません。

8bitのデータを送信する時でも、SPDRへは16bitでライトする必要があります。

これは、DMAC/DTCでは8bit単位でのデータ転送は使えないという事でしょうか?

実際に送信をDMACの転送サイズ8bitで試してみましたが、DMACは確かに転送はしていますがRSPIからデータは送信されません。

DMACの転送サイズを16bitにすればRSPIから送信されますが、送信元データを上位8bitを無駄にした16bit単位で用意する必要があります。

バイト単位の転送が出来ないなんて、とても信じ難いのですがこれが正しい仕様という事でしょうか?

ハードウェアマニュアルからはこれ以上の情報は見つけられないのですが、どなたか8bit単位でRSPIにDMAC/DTCで転送出来た方いませんか?

  • わわいです
    これはここでもたびたび話題になってたりしますが、どーも、そういうもんだ、ということであきらめないとしゃーないよーです。

    まあしかし、データ作成を最初から16ビットバッファに作っておく、とか、送信時に16ビットバッファに展開する、とかすれば済む話なのでそんなに問題にはならないかと思われます

    単純なSPIの通信なら、SCIの同期通信モードを使う、という手もありますが、RSPIとはビミョーに動作が違ったりするので検討が必要ですねー
  • Windyponさん
    わわいさんのコメントどおりで8bit転送はあきらめて16bit転送するしかないと思います。
    メモリを節約する方法としては、
    8bit DMAで準備してあるデータ配列から、ワークのメモリ(16bitの下位アドレス)にいったんコピーして、
    DMA完了割り込みでDTC(ワード転送)を起動して、2バイトのワークメモリからSPDRにライトという2段階にすることで対応かと思います。

    と思いましたけれども、DMA完了割り込みを1バイトずつ発生させると転送元のアドレスがインクリメントできないので、
    DMAをあきらめて、DTCのチェーン機能でデータ配列→2バイトのワークメモリ→SPDRにしないといけなさそうですね。

  • お二方ありがとうございます。既に知られた話題だったんですね。

    RX62NでRSPI0での送信にDMAC0を使いたいが起動しない という全く同じ内容の書込もありました。

    是非FAQに載せて欲しいですね。載らないでしょうけど。

    RSPI+DMAの組合せは以前から使っていたのですが、16bit/32bit単位でキリの良いデータだったので気付きませんでした。

    出来ない物はどうしようも無いので、Kirinさんも書いてるDTCチェイン転送の2段階で8bit→16bitで転送しました。

    RX631を使っているのですが、最新のRX71Mでもこの仕様は変わってないですね。

    RSPIは今ひとつ有効な使い所が分からないシーケンスの機能といい、どこを目指して作ったのか分からない仕様だと思います。

  • windyponさん
    私が参照したRX65NのマニュアルではRSPIにSPBYT ビット(RSPI バイトアクセス設定ビット)と言うものがあり、
    バイトアクセス可能と記載されています。
    使用しているRXはどのグループですか?
  • 回答ありがとうございます。
    最新のRX65ではSPIはRSPIcになっていて、バイトアクセス出来るように改善されているんですね。
    私が実際に使用しているのはRX631のRSPIaです。
    割と新しいRX64M,71MもRSPIaでした。
    ちょっと調べてみたのですが、RX24U,24TではRSPIbになっていますがバイトアクセスが出来るようにはなっていませんね。
    RSPIcで改善されて、以降の品種ではバイトアクセス出来るようになるようですね。
  • わわいです
    手もとにあるRX630のマニュアルには、そーゆービットはなく、SPDCRにSPLWビット( RSPI ロングワードアクセス / ワードアクセス設定ビット)があるだけですねー