/* Copyright (C) 2010/10/12 by Hiroshi Honda */ #include "iodefine.h" #define RXI_BUF_SIZE 256 volatile unsigned short rxi_buf_cnt_rd; volatile unsigned short rxi_buf_cnt_wr; volatile unsigned short rxi_buf_cnt_len; volatile unsigned char rxi_buf[RXI_BUF_SIZE]; int scif2_rxi(unsigned char *c) { if(1 == SCIF2.SCFSR.BIT.RDF) { /*受信データレジスタリード*/ *c = SCIF2.SCFRDR.BYTE; /*RDRFクリア*/ SCIF2.SCFSR.BIT.RDF = 0; return 0; } else { return -1; } } #pragma inline_asm(nop) static void nop(void) { nop } /*受信エラー割り込み処理*/ void int_scif2_eri(void) { if (SCIF2.SCFSR.WORD & 0x09c) { SCIF2.SCSCR.BIT.RE = 0; SCIF2.SCFCR.BIT.RFRST = 1; SCIF2.SCFCR.BIT.RFRST = 0; SCIF2.SCFSR.WORD &= ~0x9c; SCIF2.SCSCR.BIT.RE = 1; } //gcc //asm("nop"); //asm("nop"); //asm("nop"); //asm("nop"); nop(); nop(); nop(); nop(); } /*受信バッファ読込み*/ int rxi_buf_rd(unsigned char *c) { unsigned short n; /* 受信割り込み禁止*/ SCIF2.SCSCR.BIT.RIE=0; n=rxi_buf_cnt_rd; if( n == rxi_buf_cnt_wr ) { /* 受信割り込み許可*/ SCIF2.SCSCR.BIT.RIE=1; return -1; } /* 受信割り込み許可*/ SCIF2.SCSCR.BIT.RIE=1; *c=rxi_buf[n]; rxi_buf_cnt_len--; n++; if(n < RXI_BUF_SIZE) { /* 受信割り込み禁止*/ SCIF2.SCSCR.BIT.RIE=0; while(1==SCIF2.SCSCR.BIT.RIE); rxi_buf_cnt_rd=n; /* 受信割り込み許可*/ SCIF2.SCSCR.BIT.RIE=1; } else { /* 受信割り込み禁止*/ SCIF2.SCSCR.BIT.RIE=0; while(1==SCIF2.SCSCR.BIT.RIE); rxi_buf_cnt_rd=0; /* 受信割り込み許可*/ SCIF2.SCSCR.BIT.RIE=1; } return 0; } //------------------------------------------------------------------------------------ /*受信バッファ書き込み*/ int rxi_buf_wr(unsigned char c) { unsigned short n; unsigned short n_w; n=rxi_buf_cnt_wr; n_w=n; n++; if(n >= RXI_BUF_SIZE ) { n=0; } if( n != rxi_buf_cnt_rd) { rxi_buf[n_w]=c; rxi_buf_cnt_wr=n; rxi_buf_cnt_len++; return 0; } else { return -1; } } /* 受信割り込み処理*/ void int_scif2_rxi(void) { volatile unsigned char dumy_d; unsigned char d; if(0==scif2_rxi(&d)) { rxi_buf_wr(d); } while(1==SCIF2.SCFSR.BIT.RDF) { /*受信データレジスタリード*/ dumy_d = SCIF2.SCFRDR.BYTE; /*RDRFクリア*/ SCIF2.SCFSR.BIT.RDF = 0; } //gcc //asm("nop"); //asm("nop"); //asm("nop"); //asm("nop"); nop(); nop(); nop(); nop(); } void rxi_buf_init(void) { int i; rxi_buf_cnt_len=0; rxi_buf_cnt_rd=0; rxi_buf_cnt_wr=0; for(i=0 ; i < RXI_BUF_SIZE ;i++) { rxi_buf[i]=0; } } /* 1文字取得 */ int get_char(unsigned char *c) { return (rxi_buf_rd(c)); } /* 1文字取得するまで待つ */ unsigned char getc_wait(void) { unsigned char c; while( -1==get_char(&c) ); return c; } unsigned short get_rxi_buf_cnt_len(void) { return(rxi_buf_cnt_len); }