シリアル通信(送信)について

はじめまして。

RL87/G14にてシリアル通信の処理を作成していますが、送信処理がうまくいかないため、ご教授ください。

処理は、R_UART1_Start();の後、メインループで下記SendSWResultをコールしています。

この送信電文をアナライザで確認したところ、"57"ではなく"00"となっております。

ボーレート、パリティ、データサイズはアナライザ設定と一致しています。

コード生成済みであれば、これで送信ができると思っていたのですが、何か見落としているのでしょうか?


const uint8_t message_SET[2] = {"57"};

void SendSWResult(void)
{
DI(); /* 割込み禁止 */

R_UART1_Send((unsigned char *)message_SET,2U);
while( SSR00 & 0x0020 ) /* バッファ空き待ち */
{
NOP();
}

EI(); /* 割込み許可 */

}

  • R_UART1_Sendをする前(初期化などで)R_UART1_Start()をコールしていますか?

    R_UART1_Start()をしなければUARTは動作しません。

  • はい、メインループの直前に一度だけR_UART1_Start()をコールしています。

    アナライザで電文が見れているので、一応送信はできていると思うのですが、中身が想定しているものと違っているという状態です。

  • チョコです。

    UART1の送信であれば、SSR00レジスタをチェックするのは間違いです。UART1の送信であれば、SSR02レジスタをチェックすべきです。

    SSR00はUART0の送信ステータスレジスタです。従って、この SendSWResult関数はUART1の送信状態に無関係にwhileループを抜けてしまいます。

    レジスタの関係を確認してください。

    以上

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

    横からすみませけれども、なぜ、そもそもこのような、いったん割り込み禁止にして、その間に自前でレジスタをチェックして、というコードを書かれているのですか?

    実は、私見ながら「コード生成機能、初学者さん、あるある」として以下の2つが目に付いているのですけれども、そういうことだったりしますでしょうか?

    コード生成機能、初学者さん、あるある:

    (1) UART送受信APIの使い方が分からなくてHALT命令で送受信完了の割り込み発生を待とうとしてしまう
    (2) UART送受信APIの使い方が分からなくて送受信完了レジスタをチェックして送受信完了を待とうとしてしまう

    (もっとも、困り者は、10年間、チョコさんの指摘を無視し続けているルネサスさん、だと私は思ってますけれども、、、)

  • チョコです。

    NoMayさん、「送受信完了レジスタをチェックして送受信完了を待とうとしてしまう」は、Kotiさんのように割り込み禁止状態でやるのが正しいやり方です。ベクタ割り込みが受付け可能な状態だと、割り込み処理(通信完了)が受け付けられると、レジスタの状態が書き換わってしまう可能性があります。

    以上

  • チョコさん、こんにちは。NoMaYです。

    すみません、そういう意図ではなくて、なぜ割り込み完了ルーチン(全バイト送信完了コールバック関数)でフラグ変数をセットするようにして、それをチェックするようにしていないのか?、ということが気掛かりだったのです。

    それに、コード生成機能を使うと、どのみち、1バイト送信完了毎に割り込みの窓を開けてやらないと、複数バイト送信が出来ないですし、、、(コード生成機能では、割り込み駆動で次のバイトを送信する仕組みなのですし、、、)

  • NoMaYさん、チョコさん、こんにちは。

    >UART1の送信であれば、SSR00レジスタをチェックするのは間違いです。UART1の送信であれば、SSR02レジスタをチェックすべきです。
    SSR00→SSR02に変更して動かしてみましたが、出力は"00"から変わりませんでした。

    >なぜ、そもそもこのような、いったん割り込み禁止にして、その間に自前でレジスタをチェックして、というコードを書かれているのですか?
    ご指摘のとおり、コード生成機能は初めてです。UART送信方法をググって参考にしたコードを使っています。
    バッファ空き待ちの部分は、デバッグ時に動きを見るために残しています。いずれ消すつもりです。

    レジスタに関して意識できていなかったので、ハードウェアマニュアルを読んで勉強します。

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

    > ご指摘のとおり、コード生成機能は初めてです。UART送信方法をググって参考にしたコードを使っています。

    まさに私が気掛かりに思ったことだったのですね。実は、かふぇルネで、もう随分と何度も何度も話題になったことなのですけれども、かふぇルネに限らず、(もともとGoogle検索で見付かるウェブ上の情報が少ないのがルネサスマイコンでのファームウェア開発でしたけれども)なんとなく以前よりもさらにGoogle検索でルネサスマイコンの情報が見付からなくなってきているような、そんな気がしなくもない今日この頃です、、、

    ちょっと探してみます。(初学者さん向けのUART送受信APIの使い方は分かっていますので、それを書き下ろせば良い、という方向の話の流れの方が良いのかも知れませんけれども、、、)

    ちなみに、その段階では、ハードウェアマニュアルを読まなくても出来ることです。

  • こんにちは。NoMaYです。

    かふぇルネで以前に他のひと(ほやさんだったような)から教えて頂いたやり方だと思うのですけれども、Google検索する時には、以下のように site:renesas.com を付けると調子が良さそうな気がしなくもないです、、、(続く)

    Google検索: RL78 コード生成機能 site:renesas.com
    www.google.com/search?q=RL78+コード生成機能+site:renesas.com
     

  • こんにちは。NoMaYです。

    まずは先ほどの検索条件で見付かった以下のウェブページですかね、、、(続く)

    コード生成プラグイン Code Generator 製品ページ
    www.renesas.com/jp/ja/software-tool/code-generator-plug