てりーぬの成長ブログ

1. 私の記録(ブログ)が誰かの役に立つように。1. 私のイラストでほっこり笑顔を届ける。1. たくさんの人に見てもらえるように工夫する。1. 自分が見返したとき笑顔になれるように記録を残す。

シリアル通信(配列データの送信)

シリアル通信(配列データの送信)

- GR-SAKURA RX63N -

配列データを送信する際に、トランスミットデータレジスタ(TDR)へそのまま配列を格納すると、配列の先頭アドレスを送信してしまう。


そのため、配列データをBYTEデータとして扱うことが基本。

 

送信データをBYTEデータとして扱うには、構造体を用いる。

 

例)PUSH1のON(1)/OFF(0)データを送信する

/*=======================================================================
プロジェクト名    : シリアル通信(配列データの送信)
機能        : SCI通信
Copyright(c) 2021 Mamu_Terrine
=======================================================================*/

#include    <machine.h>
#include    "iodefine.h"

/*
 * SCI0の初期化
 */
void
init_sci0(void){

    /* SCI0初期設定 */
    *SYSTEM.PRCR   = (SYSTEM.PRCR.PRKEY | SYSTWM.PRCR.PRC1);           /* レジスタライトプロテクションを解除   */
    *MSTP.MSTPCRB  = (*MSTP.MSTPCRB & ~MSTPCRB.MSTPB31);             /* SCI0のモジュールストップを解除       */
    *SYSTEM.PRCR   = SYSTEM.PRCR.PRKEY;                                /* レジスタライトプロテクションを再設定 */

    *MPC.PWPR      = 0;                            /* PFSWEビット書込みを許可 */
    *MPC.PWPR      = PWPR.PFSWE;                   /* PFSレジスタ書込みを許可 */

    *MPC.P20PFS    = P20PFS.TXD0;                  /* P20端子:TXD0 */
    *MPC.P21PFS    = P21PFS.RXD0;                  /* P21端子:RXD0 */

    *MPC.PWPR      = PWPR.BOWL;                    /* PFSレジスタへの書込みを禁止 */

    *PORT2.PMR     = PORT2.PMR;                    /* P20,P21端子を周辺機能として使用 */

    *SCI0.SCR      = 0;                            /* シリアルコントロールレジスタをクリア */
    *SCI0.SMR      = 0;                            /* シリアルモードレジスタをクリア */
    *SCI0.BRR      = 155;                   /* ボーレート9600ps(PCLK / *1 * baud)) - 1 */
    *SCI0.SCR      = (SCI0.SCR.RE | SCI0.SCR.TE | SCI0.SCR.RIE);  /* 受信,送信,RIE割り込み許可 */
}

 

#define PUSH1     0x20    // push1

/*
* 送信用データ格納用
*/
typedef struct {
    unsigned char BYTE;
    struct {
        char    component_id : 1;    // スライドスイッチの番号
        char    id_state : 1;        // スライドスイッチの状態(ON/OFF)
    } BIT;
}TXMSG;

/*
 * push送信タスク
 */
push_control_task(void){
    unsigned char state;
    TXMSG tx_buffer;

    init_sci0();
    
    for(;;){
        state = *PORT0.PIDR.ADDDR;    // pushの状態取得
        
        if ( (state & PUSH1) != 0x00 ) {

            tx_buffer.BYTE = 0x11;
        
        }else{

            tx_buffer.BYTE = 0x10;

        }
        
        if(!(state & PUSH1)) {
            return;
        }
        
           /* データ送信 */
           *SCI0.TDR = tx_buffer.BYTE & 0xFF;        //送信データレジスタに値を格納
    }

}

 

参考: 

https://www.tetras.uitec.jeed.go.jp/files/news/2014/rijicho_2-6.pdf

 

*******記事の更新記録*******

2021/11/20....初回記録!<更新!

*********************

*1:64 * 2^(2n-1