忘備録-備忘録

技術的な備忘録

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

RS232C通信プログラム2

2015-03-27 08:58:53 | RX62N
RX62N用のRS232C通信プログラムです。割込みとバッファリングを使用しています。環境はkpitです。
/***********************************************************************/
/*                                                                     */
/*  FILE        :rs232ctest02.c                                        */
/*  DATE        :Thu, Dec 06, 2012                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :RX62N                                                 */
/*                                                                     */
/*  This file is generated by KPIT GNU Project Generator.              */
/*                                                                     */
/***********************************************************************/
																						
#include <stdio.h>																				
#include "iodefine.h"
#include "interrupt_handlers.h"

#define PCLK 48			//PクロックMHz
#define TX_ACTIVE   1	//送信動作中
#define TX_INACTIVE 0	//送信停止中

#define TX_RING_BUFF_SIZE	32	//リングバッファのサイズ
#define RX_RING_BUFF_SIZE	32	//リングバッファのサイズ

//リングバッファ
unsigned char rx_buff[RX_RING_BUFF_SIZE];	//受信用
unsigned char tx_buff[TX_RING_BUFF_SIZE];	//送信用

//データポインタ
volatile int ptr_rx_top,ptr_rx_bottom;
volatile int ptr_tx_top,ptr_tx_bottom;
//送信フラグ データ送信中かどうか
volatile int tx_flag = TX_INACTIVE;


//受信エラー処理
void  INT_Excep_SCI0_ERI0(void)
{ 
	SCI0.SSR.BYTE &= ~0x38;	//エラーフラグクリア
}

//受信完了割込み
void  INT_Excep_SCI0_RXI0(void)
{ 
    
	/* Read data */
	rx_buff[ptr_rx_top] = SCI0.RDR;
	ptr_rx_top++;
	ptr_rx_top = ptr_rx_top % RX_RING_BUFF_SIZE;
}

//送信完了割込み
void  INT_Excep_SCI0_TXI0(void)
{

	/* Write the character out */
	SCI0.TDR = tx_buff[ptr_tx_bottom];
	ptr_tx_bottom++;
	ptr_tx_bottom = ptr_tx_bottom % TX_RING_BUFF_SIZE;
	//すべてのデータを送信したら割込み禁止
	if( ptr_tx_bottom == ptr_tx_top ) {
		IEN(SCI0, TXI0) = 0;
		tx_flag = TX_INACTIVE;
	}    
}

/* SCI初期化 引数はボーレート */
void InitSCI(int bps)
{    
	/* Enable SCI0 */
	MSTP(SCI0) = 0;
   
	/* RxD0 is input */
	PORT2.DDR.BIT.B1 = 0;
	/* Enable Input Buffer on RxD0 */
	PORT2.ICR.BIT.B1 = 1;
	/* TxD0 is output */
 	PORT2.DDR.BIT.B0 = 1;

	/* Disable Tx/Rx */
	SCI0.SCR.BYTE = 0;
    
	/*  Set mode register
		-Asynchronous Mode
		-8 bits
		-no parity
		-1 stop bit
		-PCLK clock (n = 0) */
	SCI0.SMR.BYTE = 0x00;
	//SCI0.SEMR.BIT.ABCS = 1;
	/* 送受信で割込み発生 */
	SCI0.SCR.BIT.RIE = 1;
	SCI0.SCR.BIT.TIE = 1;
    /* 割込み優先度 */
	IPR(SCI0,RXI0) = 0x04;
	IPR(SCI0,TXI0) = 0x04;
	/* Clear IR bits for TIE and RIE */
	IR(SCI0, RXI0) = 0;
	IR(SCI0, TXI0) = 0;
   
	/* 受信・送信割込み許可 */
	IEN(SCI0, RXI0) = 1;
	IEN(SCI0, TXI0) = 1;
   
	/*  Set baud rate to 115200
		N = (PCLK Frequency) / (64 * 2^(2*n - 1) * Bit Rate) - 1
		N = (48,000,000) / (64 * 2^(2*0 - 1) * 115200) - 1
		115200bps N = 12
		 38400bps N=38 
	*/
	//SCI0.BRR = 38;
	SCI0.BRR = PCLK *1000000 / 32 / bps - 1;

	/* Enable Tx/Rx */
	SCI0.SCR.BYTE |= 0x30;
	
	/*リングバッファ初期化*/
	ptr_rx_top = ptr_rx_bottom = 0;
	ptr_tx_top = ptr_tx_bottom = 0;
}

/* データの送信 */
void charput(unsigned char output_char)
{
	int tmp;
	tmp = ptr_tx_top + 1;
	tmp = tmp % TX_RING_BUFF_SIZE;
	while(tmp == ptr_tx_bottom) ;	//バッファに空きができるまで待つ
	
	tx_buff[ptr_tx_top] = output_char;
	ptr_tx_top++;
	ptr_tx_top = ptr_tx_top % TX_RING_BUFF_SIZE;
	if(tx_flag == TX_INACTIVE) {
		tx_flag = TX_ACTIVE;
		IEN(SCI0, TXI0) = 1;
		SCI0.SCR.BYTE |= 0xA0; //送信割込み発生
	}
}

/* データの受信 バッファに受信したデータがなければ受信するまで待つ */
unsigned char charget(void)
{
	unsigned char c;
	
	while(ptr_rx_bottom == ptr_rx_top); //データを受信するまで待つ
	c = rx_buff[ptr_rx_bottom];
	ptr_rx_bottom++;
	ptr_rx_bottom = ptr_rx_bottom % RX_RING_BUFF_SIZE;
	return c;
}

/* 文字列の出力 */
void printString(char *s)
{
	while( *s != 0 ) {
		if(( *s == '\r' ) && ( *(s+1) != '\n')) {
			charput('\r');charput('\n');
		} else if( (*s == '\n') && ( *(s-1) != '\r') ) {
			charput('\r');charput('\n');
		} else {
			charput(*s);
		}
		s++;
	}
}

/* printf関数で使用 */
int _write(int file,char *ptr,int len)
{
	int i;
	
	for(i=0;i<len;i++) {
		if( (ptr[i]=='r') || (ptr[i]=='n')) {
			charput('r');charput('n');
		} else {
			charput(ptr[i]);
		}
	}

    return len;
}

/* scanf関数で使用 */
int _read (int file, char *ptr, int len)
{
	*ptr = charget();
     return 1;
}


int main(void)
{
	char c;
    // TODO: add application code here

	SYSTEM.SCKCR.BIT.ICK = 0x00;		//システムクロック x16 96MHz
	SYSTEM.SCKCR.BIT.PCK = 0x01;		//周辺クロック   x4  48MHz
	SYSTEM.SCKCR.BIT.BCK = 0x01;		//外部バスクロック x4  48MHz
	
	InitSCI(38400);	//38400bpsで初期化
	
	printf("Startn");
    while (1) {
		c = charget();
		printf("%c",c);
    }
  return 0;
}


コメント (2)   この記事についてブログを書く
« RS232C通信プログラム1 | トップ | RX210でFreeRTOSを動かす »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
#include "interrupt_handlers.h"について (森川)
2016-02-20 15:50:47
RS232C通信プログラムの割り込みを使用したサンプルプログラムで#include "interrupt_handlers.h"
とありますがこれはどうやって取り込んだら良いのでしょうか?
#include "interrupt_handlers.h"について (lm324)
2016-02-22 18:20:23
e2 Studio+CC-RXの組み合わせでプロジェクトを作成すると自動的に interrupt_handlers.h ファイルが作成されます。

コメントを投稿

RX62N」カテゴリの最新記事