Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RX621マイコンで、割り込みを使用して、MCP3208とspi通信をさせたい

こんにちは。

現在秋月のRX621マイコンの勉強をしております。表題の通り、AD変換のMCP3208をマイコンの機能を使用して、通信させたいと思っております。

この場合、全二重通信で、24ビット長での通信をさせればよいのでしょうか?送信データが半端なため、何バイトなのか、よくわからず、色々なサイトを参考にしているのですが、IOやメモリなど、1バイトずつ区切れるものが多く、実際どうなのかな?と思い、質問させて頂きます。よろしくお願いいたします。(モノは近日中にてに入れるつもりです)

  • えるん さん、こんにちは。NoMaYです。

    ソースに入っていたコメントの件、了解しました。e2studioに畳まれてしまっていて、気が付かなかった、というのは、なるほど、そういうことでしたか、と思いました。

    それで、ソースを見てみて、問題箇所を特定する為にまず確認しておきたいな、と思ったのが、Tranceive_SPI0()で送受信完了を待っている間ですが、INT_Excep_RSPI0_SPTI0()に来てSPDRへのライトが行われていますでしょうか?

    (1) 行われているのにクロックが出ない ⇒ ポート周りを重点的に見た方が良さそう
    (2) 来ていない ⇒ 割り込み周りを重点的に見た方が良さそう(INT_Excep_RSPI0_SPEI0()に来ている可能性も含め)
    (3) 来ているけれどライトしていない st_swSendPtrとst_dwSendSizeの設定に問題無いか見てみる

    こういう切り分けをしたいな、と思いました。

  • In reply to NoMaY:

    Tranceive_SPI0()で送信割り込み発生を期待しているようですが、HWマニュアルによると、
    「送信開始時の送信割り込み要求は、SPTIE ビットと同時または後に、SPE ビットを“1” にすることで発生
    します。」
    となっているので、このあたりが問題と思われます。
  • えるんさん、NoMaYさん、
    かふぇルネ管理人です。

    別スレッドでも記載させて頂きましたが、
    今回のプログラムはJMCR実行委員会殿が公開を了承しているものであることが確認できました。
    Web上に公開しても問題ありません。
    JMCR実行委員会殿にプログラムの内容に関する責任はなく、質問等には対応できませんので、よろしくお願いします。
    japan.renesasrulz.com/.../32371
  • In reply to Higetaka:

    えるん さん、Higetakaさん、こんにちは。NoMaYです。

    Higetakaさん、情報ありがとうございます。以下の画面コピー(ハードウェアマニュアル)の部分ですね。(あと、「RSPI ディスエーブル(SPE ビットが“0”)に遷移しても、SPTIEビットを“1”にしていると、RSPI送信割り込みが発生することに注意してください。」(つまり、SPTIE=1 かつ SPE=0 でSPDRをダミーライトなりダミーリードなりすると、その時点でもう発生してしまっているのかな?)も気になります。)

    私の方は、もう少し考察してみました。

    > (2) 来ていない ⇒ 割り込み周りを重点的に見た方が良さそう(INT_Excep_RSPI0_SPEI0()に来ている可能性も含め)

    (2-1) IRフラグは立っているか
    (2-1-1) 立っている ⇒ CPU周りの割り込み設定を再確認してみる
    (2-1-2) 立っていない ⇒ 下へ続く

    (2-2) RSPIモジュールのSPTEFは立っているか(CPUリセットでも立つフラグ)
    (2-2-1) 立っている ⇒ ?(SPTEF=1 かつ IRフラグ=0 というのはどういう状況なのだろう)
    (2-2-2) 立っていない ⇒ RSPIモジュールの設定を再確認してみる

    > (1) 行われているのにクロックが出ない ⇒ ポート周りを重点的に見た方が良さそう

    加えて、RSPIの送受信バッファビット数(最大128ビット)がハーフワード以下に設定されているか確認する(なお、転送ビット長は最大32ビットまで、その設定とは異なるもの)

    それから、ものは試しということで、以下の待ち時間設定後と送受信完了待ちの間でSPDRをダミーリードして[訂正]SPDRのダミーリードでは無くて何かしらをSPDRにライトして、クロックが出るか見てみるのも、ありかもしれないと思いました。(クロックが出ればポート周りはOKそう、だと思われますので。出なければ、地道にデバッグを続ける、ということで。)

        /* 送受信完了を待つ */
        wTmrTxRxWait = SPI_TXTIME;
        while(st_byRecvComple == 0){

    以下、画面コピーです。

    RX62Nグループ、RX621グループ ユーザーズマニュアル ハードウェア編の抜粋
    www.renesas.com/jp/ja/doc/products/mpumcu/doc/rx_family/r01uh0033jj0140_rx62n.pdf

  • In reply to NoMaY:

    NoMaYさん、Higetakaさん、ご回答ありがとうございます。
    昨日は帰宅後に熱が出てしまい、ご指摘の部分を試せなかったので、
    本日帰宅後に修正してみようと思います。
  • In reply to えるん:

    NoMaYさん、Higetakaさん、実機での確認ができました。

    NoMaYさんのパターン分けをして頂いた部分ですが、(1)でクロックが発生していませんでした。

    配線類も、改めて見直しをしました。

    しかしながら、クロックの発生は確認できずでした。

    画像は黄色がクロックで、緑がMOSIA-Aです。

    何秒かに一度、画像のようなパルスがでるのですが、それ以外は1V以下のノイズです。

  • In reply to えるん:

    ダミーリードの部分ですが、

    /* ダミーリード */
    //RSPI0.SPDR.WORD.H;
    RSPI0.SPDR.WORD.H = 0x01; /* クロック確認仮送信 */
    としてみましたが、それでもクロックは動きませんでした。
  • In reply to えるん:

    SPBのbit長は8bitになっています。
  • えるん さん、こんにちは。NoMaYです。

    オシロの写真で水平軸の設定が50μs/divになってます。プログラムでは、以下の通り、ビットレートが8Mbpsの設定になっていますので、クロック8発分の合計でも1μsにしかなりません。ですので、水平軸の分解能を上げるか、ビットレートを下げるか、の何れかで充分に観測可能な設定にしないと、うまくクロック出力を捕らえられないですよ、、、

    static void Init_RSPI0(void)
    {
        …途中省略…

        RSPI0.SPBR = 0x02; /* RSPIビットレートレジスタ(SPCMDn.BRDV=0で 8.00Mbps) */

        …途中省略…

        RSPI0.SPCMD0.WORD = 0xE7B3; /* RSPIコマンドレジスタ0(データ長12bit,MSBファースト,バースト転送,SSL0選択) */
        /* CPHA=1,CPOL=1,BRDV=0,SSLA=0,SSLKP=1,SPB=7,LSBF=0,SPNDEN=1,SLNDEN=1,SCKDEN=1 */

        …途中省略…
    }

     

  • In reply to NoMaY:

    NoMaYさん

    ご回答ありがとうございます!その前に撮った5us/divの画像なのですが、これももしかしたら8発に分かれているかもですか?

    宜しくお願いいたします。

  • えるん さん、こんにちは。NoMaYです。

    これはクロック8発では無いですね。6.5μs幅で何かパルスが1つ出てますね。何だろう、、、ソースをステップ実行してみて、どの行をステップ実行した時に、これが出ますか?

  • えるん さん、こんにちは。NoMaYです。

    朝から4時間ソースを見てますが分からないです。途中、動く(筈の)ソースと比較してみようと、ルネサスさんのサンプルプログラムを探したのですが、FITライブラリとかRPDLライブラリとかを前提としているコードしか見つからず、これらのライブラリのソースを見てみたものの当然ながら汎用的に書かれていて複雑であり容易には比較することが出来なかったですね。

    デバッグ方法を考えようにも、十数個レジスタを叩いた後にSPDRレジスタにライトしてクロックが出るか出ないか、というところなので、状況を小分けにすることが出来ず、妙案浮かばずです。(ポート周りを重点的に見るとは言ったものの、クロック出力に関してはPFGSPIレジスタの設定値ぐらいしか無かったですね、、、)

    あとやるとしたら、Init_RSPI0()する前の時点で、RSPCKA-AであるPC5を単なる出力ポートにして0や1が出力されるか確認する、ということぐらいしか今は思い浮かびません、、、 困った、、、

    6.5μs幅の謎のパルスが突破口になるとよいのですが、、、

  • えるん さん、こんにちは。NoMaYです。

    SCKCRの値は何になっていますか?ソースを見る限り、0x02020100になっているように思いますが、その設定ですと、ICK=24MHz、PCK=48MHz、となり、ハードウェアマニュアル(以下の画面コピー)の記載によれば、PCK=24MHzとして動作するようです。(動作しなくなる訳ではなさそうですが、、、)

    あと、6.5μs幅の謎のパルスとの関連性は無さそうですが、AKI-RX62のディップスイッチの設定はリトルエンディアンになっているでしょうか?(もっとも、ここが違っていたら全く動かないように思ってはいますが、、、)

    RX62Nグループ、RX621グループ ユーザーズマニュアル ハードウェア編の抜粋

  • In reply to NoMaY:

    NoMaYさん
    こんばんは!長時間考えて頂いて、本当にありがとうございます。
    所用で出張に出ているため、帰宅したら確認してみます!
    スイッチも再確認してみます!
  • えるん さん、こんにちは。NoMaYです。

    本日は以下の3つをやって、プロジェクトのファイル一式(MOTファイル込み)を投稿しようかと思います。

    (1) RSPCKやMOSIが出力されるかを調べるだけのような、以下のような感じに簡素化したソースで、GNURX用のプロジェクトを作ってみます。ソースの内容は、えるんさんのものと殆ど同じですので、これで出力されるようになる予感はしないのですが、以下の(2)との比較対象として作ろうと思っています。

    (2) 上の(1)と同等なCC-RX用のプロジェクトを作ってみます。えるんさんのところにCC-RXが無いかもしれませんので、MOTファイルも一緒に付けようと思っています。単に可能性の話でしかありませんが、それで出力されるようになってしまう可能性も無くは無いかも知れないです。

    (3) 以前にCC-RXとPDG2でRX631向けに別エントリ『RX63N RSPIの転送ができない(PDG2.09.000)』で作ったRSPIループバックテストプロジェクトがあるのですが、それの(RSPIループバック動作ではない通常動作の)RX621版を作ってみます。自分としては、とにかく何でもいいから動く(筈の)ものが無いものだろうかと考えてみて、CC-RXとPDG2で作ったものが確度が高くて手近ではないかと思ったからです。(ただ、それで動いたとしても、昨日気付いたように容易には比較することが出来ずに、マイコンは壊れていないようだ、程度のことが分かっただけの話で終わるかも知れませんが、、、)

    以下、先ほどの(1)や(2)に書いた簡素なソースです。(★は設定を変えた箇所です。)

    main.c

    #include "iodefine.h"

    void main(void);
    void main(void)
    {
        /* クロックの設定 */
        SYSTEM.SCKCR.LONG = 0x00C20100;/*★0x02020100*/
    /* PCLK=12MHz*4,BCLK=12MHz*2,PSTOP0=1★,PSTOP1=1★,ICLK=12MHz*8★ */
        /* 周波数変更完了待ち(今回は念の為) */
        while (SYSTEM.SCKCR.LONG != 0x00C20100)
        {
            /* 待つ */
        }

        /* RSPI0のモジュールストップ解除 */
        MSTP(RSPI0) = 0; /* SYSTEM.MSTPCRB.BIT.MSTPB17 = 0; */

        /* RSPI0の動作停止 */
        RSPI0.SPCR.BYTE = 0; /* SPCR.SPE=0で動作停止 */

        /* RSPI0のイニシャライズ */
        RSPI0.SSLP.BYTE = 0x00; /* シングルマスタシングルスレーブ SSL0P=0 ローアクティブ*/
        RSPI0.SPPCR.BYTE = 0x20; /* SPLP=0,SPLP2=0,SPOM=0,MOIFV=1,MOIFE=0 */
        RSPI0.SPSR.BYTE = 0xA0; /* OVRF=0,IDLNF=0,MODF=0,PERF=0,SPTEF=1,SPRF=1 */
        RSPI0.SPSCR.BYTE = 0x00; /* SPSLN=0: シーケンス長1(0→0→0…) */
        RSPI0.SPBR = 0x02; /* RSPIビットレートレジスタ(SPCMDn.BRDV=0で 8.00Mbps) */
        RSPI0.SPDCR.BYTE = 0x04; /* SPFC=0,SLSEL=1,SPRDTD=0,SPLW=0 */
        RSPI0.SPCKD.BYTE = 0x00; /* SCKDL=0 */
        RSPI0.SSLND.BYTE = 0x00; /* SLNDL=0 */
        RSPI0.SPND.BYTE = 0x00; /* SPNDL=0 */
        RSPI0.SPCR2.BYTE = 0x00; /* SPPE=0,SPOE=0,SPIIE=0,PTE=0 */
        RSPI0.SPCMD0.WORD = 0xE783;/*★0xE7B3*/ /* RSPIコマンドレジスタ0
    (データ長8bit,MSBファースト,バースト転送,SSL0選択) */
        /* CPHA=1,CPOL=1,BRDV=0,SSLA=0,SSLKP=1,SPB=7,LSBF=0,SPNDEN=1,SLNDEN=1,SCKDEN=1 */
        RSPI0.SPCMD1.WORD = 0x070D; /* RSPIコマンドレジスタ1 */
        RSPI0.SPCMD2.WORD = 0x070D; /* RSPIコマンドレジスタ2 */
        RSPI0.SPCMD3.WORD = 0x070D; /* RSPIコマンドレジスタ3 */
        RSPI0.SPCMD4.WORD = 0x070D; /* RSPIコマンドレジスタ4 */
        RSPI0.SPCMD5.WORD = 0x070D; /* RSPIコマンドレジスタ5 */
        RSPI0.SPCMD6.WORD = 0x070D; /* RSPIコマンドレジスタ6 */
        RSPI0.SPCMD7.WORD = 0x070D; /* RSPIコマンドレジスタ7 */

        /* RSPI0のポート設定 */
        IOPORT.PFGSPI.BYTE = 0x1E; /*ポートファンクションレジスタ PC4~7を使用*/

        /* RSPI0制御レジスタ設定&動作開始 */
        RSPI0.SPCR.BYTE = 0x48;/*★0xB8*/ /* SPMS=0,TXMD=0,MODFEN=0,MSTR=1,
    SPEIE=0★,SPTIE=0★,SPE=1★,SPRIE=0★ */

        for (;;)
        {
            /* 送信バッファエンプティ待ち */
            while (RSPI0.SPSR.BIT.SPTEF == 0)
            {
                /* 待つ */
            }

            /* 送信データ書き込み */
            RSPI0.SPDR.WORD.H = 0x00A5;

            /* 受信バッファフル待ち */
            while (RSPI0.SPSR.BIT.SPRF == 0)
            {
                /* 待つ */
            }

            /* 受信データ読み出し */
            (void) RSPI0.SPDR.WORD.H;
        }
    }

     

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page