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

こんにちは。

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

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

  • MCP3208 のデータシートは参照されてますか?

  • はい、3バイトで通信とあるのですが、最初の5ビット送信が終わったら、すぐに受信になるのかな?と疑問になり、質問させて頂きました。
  • MCP3204/3208 日本語データシートの「5.0 シリアル通信」に結構詳しく書かれていると思いますが、これ以上の情報を求められているのであれば MICROCHIP の技術サポートに問い合わされるべきと思います。
  • MCP3208 日本語データシートの「6 使用方法について」に3バイトで通信する方法が書いてありますよ。先行ゼロを入れるのがポイントのようです。
  • えるんさん
    24ビット長でも可能とは思いますが
    まずは8ビット長で
    チャンネル1の場合
    0x06,0x40,0x00 を送信すると
    受信データは下位から12ビットのようです

    CSの設定やCLKのHi/Low設定お忘れなく

  • mbed、Arduinoなどのコードを移植するのが簡単だと思います。
    検索するとかなり色々と出てくるようです。
  • 皆さん、お返事ありがとうございます。
    アルディーノなどのコードが参考になるとのことなので、調べてみます。
    今はイニシャライズで各レジスタが正しいのか、わからない状態です。
    SPPCR.MOIFV = 0 SPPCR.MOIFE =1
    シングルマスタ、シングルスレーブで、
    SPDCR.BYTE =0x04

    SPCMD0.WORD = 0xEB83

    コマンドレジスタ1~7
    SPCMDn.WORD = 0x070D

    の状態で、プログラムを流してもクロックがハイに張り付いてる状態です。
    特にクロック遅延の部分のレジスタの設定が、1.5クロックで変換とあるのですが、正しいのかわかりません。
  • こんにちは。
    MCP3208は先頭の"1"を検出してそこから先のデータを使用するみたいですね。
    なので、ビット数についてはそれほど気にしなくても、末尾からのビット数が合っていればよさそうです。
    RSPIについては、どこに接続しているのでしょうか?
    ピン名に-Aとか-Bとか付いている場合は、どちらを使用するか設定が必要です。
    ポートCを使い、SSLA0を使用する場合は、ポートファンクションレジスタGを、IOPORT.PFGSPI.BYTE = 0x1e;とします。
    あとは、モジュールストップを解除するMSTP_RSPI0 = 0;などを忘れがちなことや、データ長でSPDRへのアクセスが異なることです。
  • ご回答ありがとうございます。
    RSPIポートは、PORTCを使用しています。
    仰る文字だと、Aになります。

    帰宅したら、イニシャライズのあたりを一通り載せてみます。
  • こんばんわ。帰宅しましたので、各レジスタ初期化の部分を記載させて頂きます。

    //------------------------------------------------------------------------------
    /* SPIインタフェース(RSPI0)初期化 */
    //------------------------------------------------------------------------------
    static void Init_RSPI0(void)
    {
    /* 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 = 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 */
    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を使用*/
    PORTC.DDR.BIT.B7 = 0;
    PORTC.ICR.BIT.B7 = 1; /* PC7(MISOA)の入力バッファ有効 */
    PORTC.PCR.BIT.B7 = 1; /* PC7(MISOA)のプルアップ抵抗有効 */
    #if SPI_SLAVE_MAX == 4
    IOPORT.PFHSPI.BYTE = 0xFF; /* RSPIS=1,RSPCKE=1,MOSIE=1,MISOE=1,SSL0E=1,SSL1E=1,SSL2E=1,SSL3E=1(SSLB0~S
    SLB3有効) */
    #elif SPI_SLAVE_MAX == 3
    IOPORT.PFHSPI.BYTE = 0x7F; /* RSPIS=1,RSPCKE=1,MOSIE=1,MISOE=1,SSL0E=1,SSL1E=1,SSL2E=1,SSL3E=0(SSLB0~S
    SLB2有効) */
    #elif SPI_SLAVE_MAX == 2
    IOPORT.PFHSPI.BYTE = 0x3F; /* RSPIS=1,RSPCKE=1,MOSIE=1,MISOE=1,SSL0E=1,SSL1E=1,SSL2E=0,SSL3E=0(SSLB0~S
    SLB1有効) */
    #else
    IOPORT.PFHSPI.BYTE = 0x1F; /* RSPIS=1,RSPCKE=1,MOSIE=1,MISOE=1,SSL0E=1,SSL1E=0,SSL2E=0,SSL3E=0(SSLB0の
    み有効) */
    #endif
    /* RSPI0制御レジスタ設定 */
    RSPI0.SPCR.BYTE = 0xB8; /* SPMS=0,TXMD=0,MODFEN=0,MSTR=1,SPEIE=1,SPTIE=1,SPE=0,SPRIE=1 */
    RSPI0.SPCR.BYTE; /* SPCR空読み */
    /* RSPI0割り込みプライオリティ */
    IPR(RSPI0, ) = 4; /* SPEI1,SPRI1,SPTI1,SPII1共通 */
    /* RSPI0割り込み要求ステータスフラグクリア */
    IR(RSPI0, SPTI0) = 0;
    IR(RSPI0, SPRI0) = 0;
    IR(RSPI0, SPEI0) = 0;
    /* RSPI0割り込み禁止 */
    IEN(RSPI0, SPTI0) = 0;
    IEN(RSPI0, SPRI0) = 0;
    /* RSPI0エラー割り込み許可 */
    IEN(RSPI0, SPEI0) = 1;
    }