RX621RSLIB 1.0
easy RX621 RS-232C LIBrary by I.N. 2021/10/22


更新履歴
2021/10/21 ver.1.0 初版


1.はじめに

 RX621マイコンボード + 開発環境 CS+ でシリアル通信プログラムを
作成するための関数ライブラリです.
 動作確認には,秋月電子 RX621マイコンボードを用いました.
また,開発環境はCS+ for CC(V8.06.00)で確認しました.


2.特長

 RX621マイコンボードでシリアル通信ポートを最大6チャンネル(SCI 0,1,2,3,5,6)まで使えます.
 11719〜3M[bps](BRR値=255〜0)までのボーレートに対応します.
 偶数/奇数パリティ,ストップビット,データ長の選択ができます.
 送信バッファ/受信バッファのサイズは変更(デフォルトは32)ができます.
 チャンネル2では使用するI/Oポートを2箇所から選択できます.

 リングバッファ構造の受信バッファがあり,受信割り込みによって受信データは
バックグラウンドで自動的に受信バッファへ格納されます.
 受信データが来る瞬間にメインプログラムで他の作業を実行していてもデータを
取りこぼすことがありません.
 ただし,受信バッファが一杯になった後に受信したデータはすべて無視(破棄)
されますので,受信バッファが一杯になる前にデータを読み出すようにしてください.

 リングバッファ構造の送信バッファがあり,送信ではデータはいったん送信バッファへ
格納されます.送信バッファへデータの格納が終わると,送信関数の制御はすぐに戻って
くるのでメインプログラムでは次の他の処理を行うことができます.
 送信割り込みによって送信バッファ内のデータはバックグラウンドで自動的に送信されます.
 ただし,送信バッファが一杯になった状態で送信関数を実行するとデータはすべて無視(破棄)され
ますので,送信バッファに空きがあることを確認してから送信するようにしてください.


3.使用方法とサンプル

3.1 使用方法
 開発環境を起動し,プロジェクト※の作成が済んだら,割り込み関数ファイル intprg.c を開き,
以下のようにSCI0 ERI0〜SCI6 TEI6の割り込み関数を#if 0#endifで括り, 無効化してください.
(intprg.cの456行〜528行あたり)
#if 0
// SCI0 ERI0
void Excep_SCI0_ERI0(void){ }

// SCI0 RXI0
void Excep_SCI0_RXI0(void){ }

・・・
中略
・・・

// SCI6 TEI6
void Excep_SCI6_TEI6(void){ }
#endif

また,rx621rslib.h を適当なディレクトリに置き,
プロジェクトの「ファイル」→「追加」→「既存のファイルを追加」からrx621rslib.hを選んで加えておきます.

あとは自分のソースファイルで次のようにインクルードするだけです.
#include <rx621rslib.h>

※動作確認したプロジェクト種類
マイクロコントローラ: RX
使用するマイクロコントローラ: R5F56218BxFP
プロジェクトの種類: C++アプリケーション(CC-RX)

3.2 サンプルプログラム
 SCI0を使用します.(ncomの値)
 ボーレート設定は 230769 (約230400) bpsです.(BRR値は12)
 SCI0が使用するI/Oポートは,送信がP20,受信がP21です.
 100ms毎にframeの値と現在の受信バッファのデータ数recv_sizeを送信します.
 外部からの何か受信があれば,すべて受信します.

//RX621RSLIBサンプル

#include <rx621rslib.h>

extern "C" {
void abort(void)
{
}
}

int ncom= 0;

unsigned char buf[32];

int main(void)
{
    int frame= 0;
        
    RXRS_Open(ncom,12);             //BRR 12= 230769.2 [bps]
        
    for(;;){
        //受信処理
        int n= RXRS_CheckRecv(ncom);
        RXRS_Printf(ncom,"frame=%d recv_size=%d\r\n",frame,n);

        if(n>0){
            RXRS_Recv(ncom,buf,n);
        }
                
        delay_ms(100);
        frame++;
    }
        
    return 0;
}


4.設定の変更

4.1 送受信バッファのサイズ変更
 バッファのサイズのデフォルト値は,送信・受信・いずれのチャンネルも32バイトですが,
下記のようにして変更できます.デフォルト値より大きくすることも小さくすることもできます.
ただし,2のべき乗となる値だけが指定できます.(例,2, 4, 8, 16, 32, 64, …)
最小値は 2 です.大きくすれば,それだけRAMを食います.
SCIのチャンネルごとに異なるバッファサイズを指定できます.
また,受信と送信で異なるバッファサイズを指定できます.
蓄えられる最大データ数は(バッファサイズ-1)バイトとなります.

 以下の使用例から必要なものを #include <rx621rslib.h>より前に記述します.
下記はすべてのチャンネルで受信バッファのサイズを4096,送信バッファのサイズを256に変更する例です.
#define RXRS_RECVBUFFERSIZE0 4096
#define RXRS_SENDBUFFERSIZE0 256
#define RXRS_RECVBUFFERSIZE1 4096
#define RXRS_SENDBUFFERSIZE1 256
#define RXRS_RECVBUFFERSIZE2 4096
#define RXRS_SENDBUFFERSIZE2 256
#define RXRS_RECVBUFFERSIZE3 4096
#define RXRS_SENDBUFFERSIZE3 256
#define RXRS_RECVBUFFERSIZE5 4096
#define RXRS_SENDBUFFERSIZE5 256
#define RXRS_RECVBUFFERSIZE6 4096
#define RXRS_SENDBUFFERSIZE6 256
#include <rx621rslib.h>

4.2 ボーレートの指定
 ボーレート(通信速度)は,RXRS_Open()の第2引数で指定します.
SCIのチャンネル毎に異なる値を設定できます.
主なbrr値とボーレートの関係は以下のとおりです.
brr ->ボーレート[bps]
  0 ->3000000.0 [bps]
  1 ->1500000.0 [bps]
  2 ->1000000.0 [bps]
  3 -> 750000.0 [bps]
  4 -> 600000.0 [bps]
  5 -> 500000.0 [bps]
  6 -> 428571.4 [bps]
  7 -> 375000.0 [bps]
  8 -> 333333.3 [bps]
  9 -> 300000.0 [bps]
 10 -> 272727.3 [bps]
 11 -> 250000.0 [bps]
 12 -> 230769.2 [bps]
 25 -> 115384.6 [bps]
 51 ->  57692.3 [bps]
 77 ->  38461.5 [bps]
 95 ->  31250.0 [bps]
155 ->  19230.8 [bps]

また,brr値からボーレートへの換算は次式となります.

 baudrate = 48M/(16*(brr+1)) [bps]

 通信相手との誤差が大きなボーレート設定において,連続した大量のデータを送受信しようと
する場合,誤差が累積して,誤通信(文字化け)が発生する可能性があります.

4.3 パリティ,ストップビット,データ長の変更
 デフォルトでは,スタートビット1bit,ストップビット1bit,パリティなし,データ長8bit,XON/XOFFなしです.
このうち,パリティ,ストップビット,データ長については変更できます.
以下の中から必要なものを #include <rx621rslib.h>より前に記述します.
いずれにおいても,n にはSCIのチャンネル番号(0, 1, 2, 3, 5, 6)が入ります.
偶数パリティ:
#define SCIn_PARITY_EVEN
奇数パリティ:
#define SCIn_PARITY_ODD
ストップビット2:
#define SCIn_STOP_2
データ長7ビット:
#define SCIn_DATA_7

4.4 使用ポートの変更
 デフォルトでは,SCIの各チャンネルは次のポートを使用します.
SCI0:  ポートP21 =RXD, P20 =TXD
SCI1:  ポートP30 =RXD, P26 =TXD
SCI2:  ポートP12 =RXD, P13 =TXD
SCI3:  ポートP25 =RXD, P23 =TXD
SCI5:  ポートPC2 =RXD, PC3 =TXD
SCI6:  ポートP33 =RXD, P32 =TXD  

このうち,SCI2については,ポートP52 =RXD, P50 =TXDへ変更できます.
以下のように#include <rx621rslib.h>より前にSCI2_RXDTXD_P52P50を定義してください.

#define SCI2_RXDTXD_P52P50
#include <rx621rslib.h>


5.関数リファレンス

================全体に関するもの================

--------------------------------------------------------
int RXRS_Open(int ncom, int brr)
--------------------------------------------------------
説明
 シリアル通信(SCI)のチャンネルを開始します.最初に必要です.
 通信設定は,スタートビット1bit,ストップビット1bit,パリティなし,データ長8bit,XON/XOFFなしです.
 ボーレートは第2引数にbrr値で指定します.
 正常終了した後,RXRSLIB の各関数が使用可能となります.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 brr:ボーレートに対応するBRR値 [0〜255] ※4.2を参照
戻り値
 常に0
使用例
 RXRS_Open(0, 25);
 RXRS_Open(1, 12);


================送信に関するもの================

--------------------------------------------------------
int RXRS_CheckSend(int ncom);
--------------------------------------------------------
説明
 送信バッファの空きサイズをバイト単位で返します.
 データを送信するときは,この関数でバッファの空きを確認してから
 送信するようにすると,データの送信洩れがありません.
 送信バッファのサイズより大きな値を返すことはありません.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
戻り値
 送信バッファの空きサイズ(単位:バイト)
使用例
 int n=32;
 char buf[32];
 while(RXRS_CheckSend(1)<n);
 RXRS_Send(1, buf, n);


--------------------------------------------------------
void RXRS_ClearSend(int ncom);
--------------------------------------------------------
説明
 送信バッファをクリアします.
 バッファに残っている全データの送信完了を待ってから制御が戻ってきます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
使用例
 RXRS_ClearSend(1);


--------------------------------------------------------
int RXRS_Send(int ncom, const void *buf, int n);
--------------------------------------------------------
説明
 データの送信を行います.
 送信バッファへデータの格納が終わると送信を開始し,制御はすぐに戻ってきます.
 前回データ送信中のとき,最終バイト送信中でなければ,今回のデータが送信バッファに追加され,制御はすぐ戻ります.
 前回データの最終バイト送信中は,そのバイトが完了するまで待ってから制御が戻ります.
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 buf:送信データが格納されている領域の先頭アドレス(ポインタ)
 n:送信データのサイズ(単位:バイト)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)
使用例
 char buf[32];
 RXRS_Send(1, buf, 32);


--------------------------------------------------------
int RXRS_Putc(int ncom, int c);
--------------------------------------------------------
説明
 1バイト送信します.
 他の動作はRXRS_Send()と同じなので,そちらを参照してください.
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 c:送信データ(下位8ビットのみ有効)[0〜255] 
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)[0 or 1]
使用例
 RXRS_Putc(0, 'A');


--------------------------------------------------------
int RXRS_Puts(int ncom, const char *s);
--------------------------------------------------------
説明
 文字列を送信します.
 文字列の終端コード(\0)は送信せず,改行(\rと\n)を最後に付けて送信します.
 他の動作はRXRS_Send()と同じなので,そちらを参照してください.
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)(最後の改行も含む)
使用例
 char *s="ABC";
 RXRS_Puts(0, s);
 RXRS_Puts(0, "Hello");


--------------------------------------------------------
int RXRS_Sends(int ncom, const char *s);
--------------------------------------------------------
説明
 文字列を送信します.
 文字列の終端コード(\0)の直前までを送信し,終端コードは送信しません.
 他の動作はRXRS_Send()と同じなので,そちらを参照してください.
 送信バッファからあふれたデータは無視(破棄)されます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 s:送信される文字列が格納してある領域の先頭アドレス(ポインタ)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)(最後の改行も含む)
使用例
 RXRS_Sends(2, "Hello\r\n");


--------------------------------------------------------
int RXRS_Printf(int ncom, const char *format [, argument]...);
--------------------------------------------------------
説明
 書式付き文字列を送信します.
 使える書式は,一般的な printf() と同じです.制御文字や漢字もそのまま送信されます.
 文字列の終端コード(\0)は送信されません.
 他の動作はRXRS_Send()と同じなので,そちらを参照してください.
 送信バッファからあふれたデータは無視(破棄)されます.
 <補足>
 一回に送信できる最大文字数は256バイトです.この上限を変更するには
 #define RXRS_PRINTF_BUFFERSIZE 1024(←1024バイトに変更する例) を
 #include <rx621rslib.h>より前に記述してください.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 format:書式付き文字列へのポインタ
 argument...:引数(必要に応じて)
戻り値
 送信バッファへ格納されたデータのバイト数(単位:バイト)
使用例
 int a=100;
 RXRS_Printf(0, "a=%d\r\n", a);


================受信に関わるもの================

--------------------------------------------------------
int RXRS_CheckRecv(int ncom);
--------------------------------------------------------
説明
 受信バッファにたまっているデータの数を返します.
 受信バッファのサイズ-1より大きな値を返すことはありません.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
戻り値
 受信バッファ内のデータ数(単位:バイト)
使用例
 int n;
 char buf[32];
 n=RXRS_CheckRecv(6);
 RXRS_Recv(6,buf,n);


--------------------------------------------------------
void RXRS_ClearRecv(int ncom);
--------------------------------------------------------
説明
 受信バッファをクリアします.
 受信バッファにたまっている読み出し前のデータはすべて破棄されます.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
使用例
 RXRS_ClearRecv(6);


--------------------------------------------------------
int RXRS_Recv(int ncom, void *buf, int n);
--------------------------------------------------------
説明
 データの受信を行います.
 (正確には,受信バッファからbufへデータを移動させます.)
<補足>
 指定されたデータ数よりも受信バッファのデータ数が少ない場合,
 受信バッファ内のデータがなくなった時点で制御が戻ってきます.
 指定された数のデータが来るまで待つことはしないので,
 事前にRXRS_CheckRecv()で受信バッファ内のデータ数を確認しておいてください.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 buf:受信データを格納する領域の先頭アドレス(ポインタ)
 n:読み込みたいデータ数(単位:バイト)
戻り値
 実際に読み込めたデータ数(単位:バイト)
使用例
 char buf[32];
 int n;
 n=RXRS_Recv(1,buf,32);


--------------------------------------------------------
int RXRS_Getc(int ncom);
--------------------------------------------------------
説明
 1バイト受信し,その値を返します.
 もし受信バッファにデータがない等の理由で受信できなかった場合は-1を返します.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
戻り値
 受信データ[0〜255]または-1
使用例
 int c;
 c=RXRS_Getc(1);
 if (c<0) ...


--------------------------------------------------------
int RXRS_Gets(int ncom, char *s);
--------------------------------------------------------
説明
 文字列を受信します.
 最初に改行または終端コード(\r or \n or \0)が来るまで受信し,
 その改行または終端コードは\0に置き換えて格納されます.
 最初の改行または終端コードが来るまで制御は戻ってきません.
引数
 ncom:チャンネル番号 [0, 1, 2, 3, 5, 6]
 s:受信した文字列を格納する領域の先頭アドレス(ポインタ)
  格納領域 s のサイズを超える場合もチェックされないので注意してください.
戻り値
 受信できた文字列のバイト数(改行または終端コードを含む)
使用例
 char buf[100];
 RXRS_Gets(1,buf);


--------------------------------------------------------
void delay_us(int n);
--------------------------------------------------------
説明
 ソフトウェアディレイ(単位:us)
 システムクロックは96MHzを前提としています.
 シリアル通信をオープンしていなくても,いつでも使える関数です.
 for文で作っているのでそれほど精度は高くありません.
引数
 n:待ち時間(単位:マイクロ秒)
使用例
 delay_us(100);


--------------------------------------------------------
void delay_ms(int n);
--------------------------------------------------------
説明
 ソフトウェアディレイ(単位:ms)
 システムクロックは96MHzを前提としています.
 シリアル通信をオープンしていなくても,いつでも使える関数です.
 for文で作っているのでそれほど精度は高くありません.
引数
 n:待ち時間(単位:ミリ秒)
使用例
 delay_ms(500);


6.その他
 RXRS_Open()を実行したとき,システムクロックと周辺クロックは,それぞれ96MHzと48MHzへ変更されます.
 (基板上のクリスタルが12.0MHzの場合)
 (電源投入時は,このクロック速度ではないようです)


ダウンロード

 rx621rslib_10.zip ファイル rx621rslib.h がZIP圧縮してあります.



1つ上へ戻る