お世話になります。
若山です。
R5F1006Aのプログラムを作成しています。
CS+のコード生成ツールを使用してプログラムを作成していますが、
UART1でR_UART1_Send()関数を使用して8バイト送信しようとしていますが、
波形を確認すると、1バイトor2バイトしか送信されておりません。
UARTの設定は下記の通りです。
ボーレート:115200bps
ストップビット:1bit
パリティ:偶数
データ長:8bit
データ送信方向:MSB
今までに他のRL78でプログラムを作成を何回も行っていますが、
こんな事は初めてです。
UART1.zip
チョコです。
簡単なプロジェクトを作成してみました。
コード生成では、通信完了を明確にはサポートしていないので、そこを普通の変数を使ったフラグではなく、P30を使用しています。これをシミュレータのタイミングチャートで確認することで、8バイトが送信され、P30がハイになっていることを確認できました。詳細は添付のzipファイルを参照してください。
以上
これは、コード生成されたAPI関数の仕様を誤解しているのが原因ではないかと思われます。
若山さんは、「R_UART1_Send()関数から戻ってきたら、送信は完了している」と考えてはいないでしょうか。
コード生成されたR_UART1_Send()関数は、最初の送信データをUART1に書き込んだらすぐに関数から戻ってきます。決して、全てのデータの送信が完了した訳ではありません。
全ての送信データの送信が完了するまで待つ必要があります。全データの送信完了を確認するには、(1キャラクタの)送信完了割り込みの中のcallback関数で送信完了フラグをセットして、そのフラグを確認する必要があります。手元にはUART0のプログラムしかありませんでしたので、その内容を以下に示します。ここで、if文のelse側が指定したデータが全て送信された場合の処理です。ここで呼び出しているr_uart1_callback_sendend();でフラグをセットしてください。main処理ではR_UART1_Send()関数を呼び出すときにフラグをクリアしておいてください。
R_UART1_Send()関数を呼び出した後で、そのフラグがセットされるのを待ってください。
UART1B.zip
プロジェクトで、UART1の設定がおかしかったので、wakaさんの設定に合わせておきました。
また、タイミングチャートの設定方法も追加しておきました。