SCI(Serial Communication Interface)設定

  MCR委員会から購入できるH8/3048Fボードにおいて
  2つのSCI(Serial Communication Interface)は、
  次のようなハードウエアとなっています。



  SCI0はTTLレベルの入出力、SCI1はRS232CインタフェースICが
  接続されています。

  SCI0はc328(scam)と接続するので、通信プロトコルは以下とします。

  通信プロトコルを設定する関数init_SCI0は、以下とします。
    void init_SCI0(UWORD x)
    {
      volatile UWORD i;
      SCI0.SCR.BYTE = 0 ;
      SCI0.SMR.BYTE = 0 ;
      /* data transfer speed */
      SCI0.BRR = x ;
      /* wait 1 frame */
      for (i = 0; i < 3000 ; i++) ;
      /* enable Transmmit and Receive with interrupt */
      SCI0.SCR.BYTE = 0x70 ;
    }

  データ転送速度を設定後、1データの受信時間以上待ってから
  送受信および受信割込みを許可します。

  データ転送速度の設定値は、14400bpsで52となります。
  この数値は、H8のクロック周波数が24.576MHzの場合です。


  SCI1のデータ転送速度は、c328(scam)よりも高速であれば
  他は、どう設定しようと構いません。
  できる限り高速になるように、通信プロトコルは次のように
  指定します。

  通信プロトコルを設定する関数init_SCI1は、以下とします。
    void init_SCI1(UWORD x)
    {
      volatile UWORD i;
      SCI1.SCR.BYTE = 0 ;
      SCI1.SMR.BYTE = 0 ;
      /* data transfer speed */
      SCI1.BRR = x ;
      /* wait 1 frame */
      for (i = 0; i < 3000 ; i++) ;
      /* enable Transmmit and Receive with interrupt */
      SCI1.SCR.BYTE = 0x70 ;
    }

  データ転送速度を設定後、1データの受信時間以上待ってから
  送受信および受信割込みを許可します。

  データ転送速度の設定値は、57600bpsで12となります。
  この数値は、H8のクロック周波数が24.576MHzの場合です。


  2つのSCIの動作仕様を、より詳細に設定します。


SCI0動作仕様

 SCI0は、上位のファームウエアからの命令でc328(scam)に  コマンドを転送します。  コマンド転送は、送信割込みを使わずに、1文字ずつファーム  ウエアで送信します。  c328(scam)からの応答は、受信割込みでデータを受取ります。  受取ったデータは、リングバッファに保存します。  (リングバッファに関しては、後の章で説明します。)  受信でエラーが発生することもあるので、エラー対応の  コードも付け加えます。  受信割込みでは、受信バッファから1データを取出し  リングバッファに保存するだけです。   void int_rxi0(void)   {    UBYTE ch0,dummy ;    /* clear flag */    dummy = SCI0.SSR.BYTE ;    SCI0.SSR.BIT.RDRF = OFF ;    /* get a character */    ch0 = SCI0.RDR ;    /* store */    put_ring( ch0 ) ;   }  受信で発生するエラーは、フレーミングエラーとオーバーランエラー のいずれかなので、これらのエラーが発生した場合は、フラグクリア で対応します。   void int_eri0(void)   {    /* Framing Error */    SCI0.SSR.BYTE &= ~0x30 ;   }  受信処理は定義できたので、送信を考えます。  土台となる処理は、1バイト送信なので、これだけを  関数にまとめます。  送信バッファに空きがあることを確認後、データを送信  バッファに転送します。   void rs_put_txd0(UBYTE x)   {    /* wait data transfer */    while ( SCI0.SSR.BIT.TDRE == OFF ) ;    /* put */    SCI0.TDR = x ;    SCI0.SSR.BIT.TDRE = OFF ;   }

SCI1動作仕様

 SCI1は、パーソナルコンピュータの端末ソフトからコマンド  を入力し、c328(scam)を間接的に動かします。  コマンドは、受信割込みを使い取りこぼさないように工夫します。  受信割込みを使うので、コマンド受信があったことを  フラグを利用して通知します。  受信でエラーが発生することもあるので、エラー対応の  コードも付け加えます。  受信割込みでは、受信バッファから1データを取出し  バッファに保存します。さらに、デリミタ'\r'を検出  したならば、フラグで上位に通知します。   void int_rxi1(void)   {    volatile UBYTE ch,dummy ;    /* clear flag */    dummy = SCI1.SSR.BYTE ;    SCI1.SSR.BIT.RDRF = OFF ;    /* get a character */    ch = SCI1.RDR ;    /* store */    *(sbuf+sindex) = ch ;    sindex++ ;    /* check */    if ( ch == '\r' ) {    *(sbuf+sindex) = 0 ;    sindex = 0 ;    S1FLAG = ON ;    }   }  受信で発生するエラーは、フレーミングエラーとオーバーランエラー のいずれかなので、これらのエラーが発生した場合は、フラグクリア で対応します。   void int_eri1(void)   {    /* Framing Error */    SCI1.SSR.BYTE &= ~0x30 ;   }  受信処理は定義できたので、送信を考えます。  土台となる処理は、1バイト送信なので、これを  関数にまとめます。  送信バッファに空きがあることを確認後、データを送信  バッファに転送します。   void rs_put_txd1(UBYTE x)   {    /* wait data transfer */    while ( SCI1.SSR.BIT.TDRE == OFF ) ;    /* put */    SCI1.TDR = x ;    SCI1.SSR.BIT.TDRE = OFF ;   }  ホストには、文字列を送信する処理もあるので  文字列出力を定義します。   void rs_puts_txd1(UBYTE *x)   {    while ( *x ) {    rs_put_txd1( *x );    x++ ;    }    crlf();   }  文字列ごとに、改行をつけるのは面倒です。  改行を担当する関数を定義します。   void crlf(void)   {    rs_put_txd1('\r');    rs_put_txd1('\n');   }
目次

inserted by FC2 system