RX631でBluetoothモジュールからのUART受信ができない問題について

はじめまして。

somaと申します。

現在、RX631を用いて別のデバイス(RN4020やBL652)とUART送受信を行っています。

RX631から送信することには成功しているのですが、特定のマイコン(BL652)から送られたデータを受信することができず困っています。

考えられる原因、アドバイスなどありましたら、ご教授いただきたいです。

以下、これまでに確認してきたこと等になります。

【使用しているデバイス】

  • RX631(自作基板)で外部デバイス用にSCI9を使用
  • BL652(Bluetoothモジュール / 秋月電子通商のブレイクアウトキットボード)
  • RN4020(Bluetoothモジュール / 秋月電子通商で確認できます)

【プログラム】

  • SCI9を用いたUARTで送受信を行っています
  • ボーレートは38400bps (RN4020 / BL652) または 115200bps (BL652のapp起動時)
  • RX631から数バイトの文字列を転送してBluetoothモジュールのプログラム起動
    • 転送すると、インタラクティブモードのBluetoothモジュールから自動的に応答があります。
    • 例えば、BL652に"ATI 4\r"を送信すると、14文字のBluetoothアドレスが転送されます。
  • RN4020の場合、MLDPというBluetooth SPPをシミュレートしたものが動作
  • BL652の場合、smartBASICを用いてプログラムし、書き込んだアプリケーションが動作
    • BL652のBLE機能でスキャンしたデータをUARTで転送
  • whileループの中で割り込みステータスフラグIR(SCI9,RXI9)とフレーミングエラーを監視してデータ受信の確認
    • 変数にSCI9.RDRを代入
    • 代入結果をprintf()で表示
  • RX631から外部デバイスにはChaNさんのxprintf()を使用、SCI9.TDRに1文字のdataを代入したのちIR(SCI9,TXI9)に0を代入
  • printf()はUSBからPC等に出力するために使用しています。
  • xprintf()はUART転送に使用しています。

【確認したこと】

  • RX631によるRN4020のMDPLモードの起動、起動後の送信と受信に成功
    • MLDPモードではRX631に接続したRN4020と対になるRN4020から入力した文字の取得ができました
    • LEDやブザーを用いて受信の確認
  • RX631によるBL652のアプリケーションを起動("$autorun$\r"を送信するとランタイムに入る)成功
    • しかし、起動後にUARTを使用して送られてくるデータの受信に失敗
  • ESP32を用いて、BL652にデータを送信してアプリケーション起動に成功しました
    • ArduinoやESP32で頻繁に使用するSerial.println()を使用
    • 受信にはSerial.available()を用いて、アプリケーション起動後の受信の確認 -> データの取得と表示に成功
  • RX231にてSCIの受信ができません。にて割り込みやSCI9プルアップ確認
    • Excep_SCI9_RXI9()関数内でLED点灯
    • プルアップするとRN4020でアプリケーション起動の部分がうまくいきませんでした。

主な問題としてBL652のアプリケーション起動後のUART受信になります。

該当箇所のプログラムを添付します。

よろしくお願いします。

community-ja.renesas.com/.../_D730ED30B030E930E030_.txt

  • somaさん、こんにちは。NoMaYと申します。

    こういう以下の私の認識で良いのですよね?

    (1) RN4020ではSCI9でうまく受信出来ていた → つまり作った受信処理は一応動作するプログラムである
    (2) にも関わらずBL652では同SCI9で受信出来なかった → なぜ同じ受信処理を使っているのに駄目なのだろう?

    以下のことを確認されてみてはどうでしょうか?

    (1) SCI9でオーバーランフラグは立っていませんでしょうか?
    (2) SCI9でパリティエラーフラグは立っていませんでしょうか?
    (3) SCI9で受信エラー割り込みフラグは立っていませんでしょうか?

    ちなみに、RXマイコンでは受信エラーが発生すると、受信エラー割り込みフラグは立ちますが、受信割り込みフラグは立たないです。(全ての種類のSCI回路でそうなっているかどうか、すみません、ちょっと自信が無いですけれども。)

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

    ごめんなさい、1つ見落としに気付きました。ですけれども以下は何でしょうか?この時は受信割り込み許可にした?

    > Excep_SCI9_RXI9()関数内でLED点灯

    つまり、以下のコメント化を解除してのことですか?

    >    //IEN(SCI9, RXI9) = 1;          // 割り込み許可

  • somaです。

    NoMaYさん、こんにちは。

    リプライありがとうございます。

    NoMaYさんの質問に対しての答えは以下の通りになります。

    1. RN4020ではできたのにBL652ではうまく動かなかったという認識で良いか?
      1. NoMaYさんの認識で合っています。
    2. Excep_SCU9_RXI9()関数内でLED点灯
      1. おっしゃる通り、コメントを解除して確認した際のことになります。わかりづらくてすみませんでした。
      2. BL652のアプリケーション起動前の接続確認時(xprintf("ATI 4\r")に対する応答)と起動後(BL652から転送)でRX631が受信する流れになっています。
      3. その際に受信割り込みが入ってExcep_SCI9_RXI9()が実行され、LEDが点灯したと考えています。

    いただいたアドバイスに関しては今から確認したいと思います。

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

    そういうことでしたか。そうなりますと、以下のようなコードにするとLEDは点灯しそうですね。実際、どうなりますでしょうか?

        while(1){
            // Bluetoothモジュールから受信
            if(IR(SCI9,RXI9)==1||SCI9.SSR.BIT.FER==1){
                LED点灯処理追加
                rxbuff = SCI9.RDR;
                SCI9.SSR.BYTE = 0xC0;
                IR(SCI9,RXI9) = 0;
                printf("%c\n",rxbuff);  //受信結果表示
            }
        }

     

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

    LED点灯処理を追加したプログラムでLEDが点灯することを確認しました。

    また、いただいたアドバイスからフレーミングエラーフラグ、パリティエラーフラグ、オーバーランエラー、正常割り込みの4つのif文を追加し、実行してみました。

    その結果、オーバーランエラーフラグが1になっていることがわかりました。

    正常に取得できた文字とオーバーランエラーフラグが立った出力の2通りが確認できました。

    .

    そして、ここがあまりわからないのですが、昨日は確認できなかった文字が確認できるようになっていました。

    SCIのBRRの設定値Nに定数を入力したり、N = PCLK / (*** * SCI_BITRATE / 2) - 1の式に従って計算した結果をunsigned charでキャストして代入したりと弄っていたのが原因かなと考えています。計算を間違えていた可能性も考えています。

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

    おそらく、BL652へ"ATI 4\r"を送信した後にBL652から送信されてくる14文字のBluetoothアドレスを読み捨てる設計なのだろうと思いますけれども、ならば、以下でSCI9の受信エラーフラグのクリアが必要ではないかと思うのです。(ただ、概念コードっぽい気もしますので、実際は既に入っているのかも知れませんけれども。ボーレート切り替えがある筈?なの??かなぁ???)

        if(device == 1){
            ms_delay(1000);
            受信エラーフラグクリア処理追加
            あと、受信割り込みフラグと受信エラー割り込みフラグのクリアも、追加
            xprintf("$autorun$\r");  // BL652のアプリケーション起動
        }

     

  • somaです。こんばんは、NoMaYさん。

    おっしゃる通り、RX631から"ATI 4\r"を送信した後に受信するBluetoothアドレスは読み捨てる設計になっています。

    また、アドバイス通りエラー処理を入れることで受信エラーも無くなりました。

    ボーレートに関しても正にその通りで、このスレッドを建てた当初は切り替えをやっておりました。

    しかし、切り替える必要もなく動作することが確認できたため、現在動かしているものでは切り替えは行っていません。

    最初に載せたものは概念コードではあるのですが、切り替え以外は一部除いたデバッグ用のprintf()以外は実際のコードと変わりありません。

    NoMaYさん、本当にありがとうございました。