はじめまして。
somaと申します。
現在、RX631を用いて別のデバイス(RN4020やBL652)とUART送受信を行っています。
RX631から送信することには成功しているのですが、特定のマイコン(BL652)から送られたデータを受信することができず困っています。
考えられる原因、アドバイスなどありましたら、ご教授いただきたいです。
以下、これまでに確認してきたこと等になります。
【使用しているデバイス】
【プログラム】
【確認したこと】
主な問題として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さんの質問に対しての答えは以下の通りになります。
いただいたアドバイスに関しては今から確認したいと思います。
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さん、本当にありがとうございました。