外部バスCS5#、CS6#使用時にCS6#の方が動作しない

毎度お世話になっております

下記のように設定し、RXにて外部バスを使用しています。

CS5#とCS6#を使用しており、それぞれW0#とW1を使用して16bitで使用したいと考えています。

下記の設定の最後の方に記載していますが、CSはこの設定部では動作禁止の状態で設定しておき、

使用時に許可にしています。

このようにして使用したいのですが、なぜかCS5#の方のバスは正常に動作するのですが、

CS6#の方が動作せずに困っております。

何か抜け、設定ミスがありますでしょうか?

こんなことですが、丸2日悩んで分かりませんでした。

分かる方いっらしゃいましたらご教授願います。

いつも大したことでなく質問してしまい申し訳ありません。

よろしくお願い致します。

 

以下、設定です

 SYSTEM.PRCR.WORD = 0xA502;

 BSC.CS5CR.BIT.EMODE = 0; //領域nのエディアンは動作モードのエディアンと同じ
 BSC.CS5CR.BIT.MPXEN = 0;

 MPC.PFCSE.BIT.CS5E = 1; //CS5使用
 MPC.PFCSE.BIT.CS6E = 1; //CS6使用

 MPC.PFCSS1.BIT.CS5S = 0; //P65をCS5に設定(1:P75,2:P25)
 MPC.PFCSS1.BIT.CS6S = 0; //P66をCS6に設定(1:P76,2:P26)

 BSC.CS5CR.BIT.BSIZE = 0; //16bitバス空間に設定 W0# & W1#を共に使用

 BSC.CS5MOD.BIT.PRMOD = 0; //ノーマルアクセス互換モード:0

 BSC.CSRECEN.BIT.RCVEN5 = 0; //許可→リカバリ無しに変更
 BSC.CSRECEN.BIT.RCVENM5 = 0;

 BSC.CS5REC.BIT.WRCV = 0; //ライトリカバリサイクル1サイクル設定
 BSC.CS5REC.BIT.RRCV = 0; //リードリカバリサイクル1サイクル設定

 BSC.CS5MOD.BIT.WRMOD = 0; //バイトストロープモード設定(ライトタイミングWR#にて処理)
 BSC.CS5MOD.BIT.EWENB = 0; //外部wait#未使用

 //WR1#使用時はWR1BC1E,WR2#もしくはWR3#使用時はWR1BC32Eを1へ
 MPC.PFBCR0.BIT.WR1BC1E = 1;
 MPC.PFBCR0.BIT.WR32BC32E = 0;

 BSC.CS5MOD.BIT.PRENB = 0; //ページリードアクセス禁止
 BSC.CS5MOD.BIT.PWENB = 0; //ページライトアクセス禁止

 BSC.CSRECEN.BIT.RCVEN6 = 0; //リカバリ許可→無しに変更
 BSC.CSRECEN.BIT.RCVENM6 = 0;

 BSC.CS6CR.BIT.EMODE = 0; //領域nのエディアンは動作モードのエディアンと同じ
 BSC.CS6CR.BIT.MPXEN = 0;

// BSC.CS6CR.BIT.BSIZE = 2; //8bitバス空間に設定
 BSC.CS6CR.BIT.BSIZE = 0; //16bitバス空間に設定

 BSC.CS6MOD.BIT.PRMOD = 0; //ノーマルアクセス互換モード:0

 BSC.CS6REC.BIT.WRCV = 0; //ライトリカバリサイクル1サイクル設定
 BSC.CS6REC.BIT.RRCV = 0; //リードリカバリサイクル1サイクル設定

 BSC.CS6MOD.BIT.WRMOD = 0; //バイトストロープモード設定(ライトタイミングWR#にて処理)
 BSC.CS6MOD.BIT.EWENB = 0; //外部wait#未使用

 BSC.CS6MOD.BIT.PRENB = 0; //ページリードアクセス禁止
 BSC.CS6MOD.BIT.PWENB = 0; //ページライトアクセス禁止

 BSC.CS5WCR1.BIT.CSRWAIT = 3; //ノーマルリードサイクルウェイト2サイクル挿入
 BSC.CS5WCR1.BIT.CSWWAIT = 3; //ノーマルライトサイクルウェイト2サイクル挿入
 BSC.CS5WCR1.BIT.CSPRWAIT = 2; //ページリードサイクルウェイト2サイクル挿入
 BSC.CS5WCR1.BIT.CSPWWAIT = 2; //ページライトサイクルウェイト2サイクル挿入

 BSC.CS5WCR2.BIT.AWAIT = 1;
 BSC.CS5WCR2.BIT.CSON = 1; //アサートウェイト1サイクル挿入
 BSC.CS5WCR2.BIT.WDON = 1; //ライトデータ出力ウェイト3サイクル挿入
 BSC.CS5WCR2.BIT.WRON = 1; //WRアサートウェイトウェイト4サイクル挿入
 BSC.CS5WCR2.BIT.RDON = 1; //リードデータアサートウェイト2サイクル挿入

 BSC.CS5WCR2.BIT.WDOFF = 1; //ライトデータ出力延長サイクルウェイト1サイクル挿入
 BSC.CS5WCR2.BIT.CSWOFF = 1; //ライト時延長サイクルウェイト1サイクル挿入
 BSC.CS5WCR2.BIT.CSROFF = 1; //リード時延長サイクルウェイト1サイクル挿入


 BSC.CS6WCR1.BIT.CSRWAIT = 3; //ノーマルリードサイクルウェイト2サイクル挿入
 BSC.CS6WCR1.BIT.CSWWAIT = 3; //ノーマルライトサイクルウェイト2サイクル挿入
 BSC.CS6WCR1.BIT.CSPRWAIT = 2; //ページリードサイクルウェイト2サイクル挿入
 BSC.CS6WCR1.BIT.CSPWWAIT = 2; //ページライトサイクルウェイト2サイクル挿入

 BSC.CS6WCR2.BIT.AWAIT = 1;
 BSC.CS6WCR2.BIT.CSON = 1; //アサートウェイト1サイクル挿入
 BSC.CS6WCR2.BIT.WDON = 1; //ライトデータ出力ウェイト3サイクル挿入
 BSC.CS6WCR2.BIT.WRON = 1; //WRアサートウェイトウェイト4サイクル挿入
 BSC.CS6WCR2.BIT.RDON = 1; //リードデータアサートウェイト2サイクル挿入

 BSC.CS6WCR2.BIT.WDOFF = 1; //ライトデータ出力延長サイクルウェイト1サイクル挿入
 BSC.CS6WCR2.BIT.CSWOFF = 1; //ライト時延長サイクルウェイト1サイクル挿入
 BSC.CS6WCR2.BIT.CSROFF = 1; //リード時延長サイクルウェイト1サイクル挿入


 SYSTEM.BCKCR.BYTE = 0; //外部クロックコントロール BCLKの1分周(BCLKそのまま)

 MPC.PFBCR0.BIT.ADRHMS = 0; //PC0~PC7
 MPC.PFBCR0.BIT.ADRLE = 1; //PA0~PA7は外部アドレスバスA0~A7として設定

 MPC.PFAOE0.BYTE = 0xFF; //A8~A15アドレス出力許可
 MPC.PFAOE1.BYTE = 0x0F; //A16,17,18,19アドレス出力許可

 MPC.PFBCR0.BIT.DHE = 1; //PE0PE7を外部データバスD8~D15として設定
 MPC.PFBCR0.BIT.DH32E = 0; //D16~31は未使用→通常IOポートとして使用

 BSC.CS5CR.BIT.EXENB = 0; //CS5動作禁止→各CS使用時に許可にする
 BSC.CS6CR.BIT.EXENB = 0; //CS6動作禁止

    SYSTEM.PRCR.WORD = 0xA503;

 SYSTEM.SYSCR0.WORD = 0x5A03;

    while( 0 == SYSTEM.SYSCR0.BIT.EXBE )
    {
        /* Confirm that the written value can be read correctly. */
    }

 // 動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み禁止
 SYSTEM.PRCR.WORD = 0xA500;

Parents
  • yueさん
    #define MPC_PROTECT_OFF MPC.PWPR.BIT.B0WI=0; MPC.PWPR.BIT.PFSWE=1;
    #define MPC_PROTECT_ON MPC.PWPR.BIT.PFSWE=0; MPC.PWPR.BIT.B0WI=1;
    こんなの作って
    MPC_PROTECT_OFF
    MPC.PFBCR0.BIT.ADRHMS = 0; //PC0~PC7
    MPC.PFBCR0.BIT.ADRLE = 1; //PA0~PA7は外部アドレスバスA0~A7として設定

    MPC.PFAOE0.BYTE = 0xFF; //A8~A15アドレス出力許可
    MPC.PFAOE1.BYTE = 0x0F; //A16,17,18,19アドレス出力許可

    MPC.PFBCR0.BIT.DHE = 1; //PE0PE7を外部データバスD8~D15として設定
    MPC.PFBCR0.BIT.DH32E = 0; //D16~31は未使用→通常IOポートとして使用
    MPC_PROTECT_ON
    してみたら?
    関係なかったかな?自信ありません。
  • This reply was deleted.
  • 追記するほどではなく当たり前のことなのですが、
    一つ前で書きましたように
    mem_datにライトするアドレスを入れ、*mem_datにデータを入れるのではなく、
    全く関係ない *mem_testにデータを入れ(*mem_test = wfrom_data; )、
    後ほど下記のように*mem_testをリードすると正常に0xAA00とリードできます。

    r_dat = *mem_test; //r_datを確認すると0xAA00となっている。

    なので、やはり外部バスとしてCS6#が正常に動作していないのだろうため、
    設定か、回路でおかしいところがあるのではないかと思い、再確認しています。
Reply
  • 追記するほどではなく当たり前のことなのですが、
    一つ前で書きましたように
    mem_datにライトするアドレスを入れ、*mem_datにデータを入れるのではなく、
    全く関係ない *mem_testにデータを入れ(*mem_test = wfrom_data; )、
    後ほど下記のように*mem_testをリードすると正常に0xAA00とリードできます。

    r_dat = *mem_test; //r_datを確認すると0xAA00となっている。

    なので、やはり外部バスとしてCS6#が正常に動作していないのだろうため、
    設定か、回路でおかしいところがあるのではないかと思い、再確認しています。
Children
  • yueさん
    オシロスコープは持っておられますか?
    オシロで確認すればわかりますよ、yueさんの仮定のような推論ですと、どうかなと思います。
    オシロが無くても74HC541AのようなICにE1端子にCSをE2端子にRDを接続してBUSも接続して入力HI/LO見れば良いでしょう。

  • もっています。
    というかオシロで見たことも記載しておけばよかったですね。
    申し訳ありません。
    この問題で悩んでいるときからオシロでは見ていますが、
    A1~A18やD0~D15、CS6、W1、RDとは動作していないことを確認しています。
  • yueさん
    私のRXの設定で動作しています
    ///////////////////////////////////////////////////////////////////////
    //外部BUS端子許可
    ///////////////////////////////////////////////////////////////////////
    void setup_bsc(void)
    {
    MPC_PROTECT_OFF

    //BEREN バスエラー監視許可レジス
    //b7:b2 読むと“0”が読めます。書く場合、“0”としてくださ
    //b1 TOEN 0:バスタイムアウト検出禁止
    //b0 IGAEN 0:不正アドレスアクセス検出禁止
    BSC.BEREN.BYTE=0x00;

    //BUSPRI バスプライオリティ制御レジスタ
    //b15:b14 読むと“0”が読めます。書く場合、“0”としてくださ
    //b13:b12 BPEB[1:0] 0 0:優先順位固定
    //b11:b12 BPFB[1:0] 0 0:優先順位固定
    //b9:b8 BPHB[1:0] 0 0:優先順位固定
    //b7:b6 BPGB[1:0] 0 0:優先順位固定
    //b5:b4 BPIB[1:0] 0 0:優先順位固定
    //b3:b2 BPRO[1:0] 0 0:優先順位固定
    //b1:b0 BPRA[1:0] 0 0:優先順位固定
    //BSC.BUSPRI.WORD=0x0000;

    //PFCSE CS 出力許可レジスタ
    //b0 CS0E CS0禁止
    //b1 CS1E CS1許可
    //b2 CS2E CS2許可
    //b3 CS3E CS3許可
    //b4 CS4E CS4許可
    //b5 CS5E CS5許可
    //b6 CS6E CS6許可
    //b7 CS7E CS7許可
    MPC.PFCSE.BYTE=0xFE;//1111 1110

    //PFCSS0 CS 出力端子選択レジスタ0
    //b0 CS0S 0:P60をCS0#出力端子として設定(FPGA->IO104)
    //b1 読むと“0”が読めます。書く場合、“0”としてくださ
    //b3-b2 CS1S 0 1:P71をCS1#出力端子として設定
    //b5-b4 CS2S 0 1:P72をCS2#出力端子として設定
    //b7-b6 CS3S 0 1:P73をCS3#出力端子として設定
    MPC.PFCSS0.BYTE=0x54;//0101 0100

    //PFCSS1 CS 出力端子選択レジスタ1
    //b1-b0 CS4S 0 1:P74をCS4#出力端子として設定
    //b3-b2 CS5S 0 1:P75をCS5#出力端子として設定
    //b5-b4 CS6S 0 1:P76をCS6#出力端子として設定
    //b7-b6 CS7S 0 1:P77をCS7#出力端子として設定
    MPC.PFCSS1.BYTE=0x55;//0101 0101

    //PFBCR0 外部バス制御レジスタ0
    //b7 WR32BC32E 0:P56、P57をI/O ポートとして設定
    //b6 WR1BC1E 1:P51をWR1#またはBC1#として設定
    //b5 DH32E 0:PG0~PG7、P90~P97をI/Oポートとして設定
    //b4 DHE 1:PE0~PE7を外部データバスD8~D15として設定
    //b3:b2 Reserved 読むと“0”が読めます。書く場合、“0”としてくださ
    //b1 ADRHMS 0:PC0~PC7を外部アドレスバスA16~A23として設定
    //b0 ADRLE 1:PA0~PA7を外部アドレスバスA0~A7として設定
    MPC.PFBCR0.BYTE=0x51;

    //PFBCR1 外部バス制御レジスタ1
    //b7 SDCLKE 1:SDCLK出力有効
    //b6 DQM1E 1:DQM1出力有効(b4共で)
    //b5 読むと“0”が読めます。書く場合、“0”としてくださ
    //b4 MDSDE 1:CKE、SDCS#、RAS#、CAS#、WE#、DQM0出力有効
    //b3 読むと“0”が読めます。書く場合、“0”としてくださ
    //b2 ALEOE 0:P54をI/Oポートとして設定
    //b1:b0 WAITS 0 0:P57をWAIT#入力端子として設定
    MPC.PFBCR1.BYTE=0xD0;

    MPC.PFAOE0.BYTE=0xFF;//A15-A8出力許可
    MPC.PFAOE1.BYTE=0x3F;//3210 9876 A23-A16出力許可

    PORTA.PDR.BYTE=0x00;//PORTA(A0-A7) input
    PORTB.PDR.BYTE=0x00;//PORTB(A8-A14) input
    PORTD.PDR.BYTE=0x00;//PORTD(D0-D7) input
    PORTE.PDR.BYTE=0x00;//PORTE(D8-D15) input
    PORT6.PDR.BYTE=0x00;//SDCS#, RAS#,CAS#, WE#, CKE, DQM0, DQM1 input
    PORT7.PDR.BIT.B0=0;//SDCLK input

    MPC_PROTECT_ON

    SYS_PROTECT_OFF
    SYSTEM.SYSCR0.WORD=0x5A03;//外部バス有効 |内蔵ROM有効
    SYS_PROTECT_ON
    }
    ///////////////////////////////////////////////////////////////////////
    //外部BUS端子許可
    ///////////////////////////////////////////////////////////////////////
  • IKUZO 様

    ありがとうございます

    試してみます。
    参考にさせていただきます
  • IKUZO 様


    試したところ確認できました。
    また、私のいじっていた方でも問題なく動作できるようになりました。

    結果として原因だったのは、HEWの設定でコンパイラなどの設定の最適化を
    先日いろいろと試して変更していたのですが、
    それが悪影響していたようでおかしくなってしまっていたようです。
    その設定をデフォルトの状態に戻し確認しただけで問題なくなりました。

    失礼いたしました。
    また、ありがとうございました。