忘備録-備忘録

技術的な備忘録

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;
}


RS232C通信プログラム1

2015-03-27 08:53:50 | RX62N
RX62N用のRS232C通信プログラムです。割り込みを利用しません。
/***********************************************************************/
/*                                                                     */
/*  FILE        :RS232Ctest.c                                          */
/*  DATE        :Thu, Jul 12, 2012                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :RX62N                                                 */
/*                                                                     */
/*  This file is generated by KPIT GNU Project Generator.              */
/*                                                                     */
/***********************************************************************/
                    
																							
																							
#include "iodefine.h"

/******************************************************************************
* Function Name: InitSCI
* Description  : Initializes SCI channel for asychronous operation
* Arguments    : none
* Return Value : none
******************************************************************************/
void InitSCI(void)
{    
	/* Enable SCI0 */
	MSTP(SCI0) = 0;
   
	/* RxD0 is input */
	PORT2.DDR.BIT.B1 = 0;
	/* Enable Input Buffer on RxD1 */
	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;
	/* Enable RXI and TXI interrupts, even though we are not
		using the interrupts, we will be checking the IR bits
		as flags */
	//SCI0.SCR.BIT.RIE = 1;
	//SCI0.SCR.BIT.TIE = 1;
    
	/* Clear IR bits for TIE and RIE */
	//IR(SCI0, RXI0) = 0;
	//IR(SCI0, TXI0) = 0;
   
	/* Disable RXI and TXI interrupts in ICU because we are polling */
	//IEN(SCI0, RXI0) = 0;
	//IEN(SCI0, TXI0) = 0;
   
	/*  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
		N = 12
		38400bps N=38 */
	SCI0.BRR = 38;

	/* Enable Tx/Rx */
	SCI0.SCR.BYTE |= 0x30;
}

/******************************************************************************
* Function Name: charput
* Description  : Outputs a character on a serial port
* Arguments    : character to output
* Return Value : none
******************************************************************************/
void charput(unsigned char output_char)
{
	
	/* Wait for transmit buffer to be empty */
	//while(IR(SCI1, TXI1) == 0);
	while(SCI0.SSR.BIT.TDRE == 0);

	/* Clear TXI IR bit */
	//IR(SCI0, TXI0) = 0;

	/* Write the character out */
	SCI0.TDR = output_char;    
}

/******************************************************************************
* Function Name: charget
* Description  : Gets a character on a serial port
* Arguments    : character to output
* Return Value : none
******************************************************************************/
unsigned char charget(void)
{
	unsigned char temp;
    
	/* エラーチェック */
	if (SCI0.SSR.BYTE & 0x38) {
		SCI0.SSR.BYTE &= ~0x38;	//エラーフラグクリア
		temp = SCI0.RDR;
		return 0;
	}
	/* Read any 'junk' out of receive buffer */
	//temp = SCI0.RDR;
    
	/* Clear flag to receive next byte */
	//IR(SCI0, RXI0) = 0;
    
	/* Wait for next receive data */
	//while(IR(SCI1, RXI1) == 0);
	while(SCI0.SSR.BIT.RDRF == 0);
    
	/* Read data */
	temp = SCI0.RDR;
    
/*	// Echo data back out 
	if(temp == 0x0d)
	{
		// Enter was pressed, output newline 
		charput('\r');
		charput('\n');
	}
	else
	{
		// Echo back character 
		charput(temp);
	}
*/  
	// Receive data acquired, send back up 
	return temp;         
}

/* 文字列の出力 */
void printString(char *s)
{
	while( *s != 0 ) {
		charput(*s);
		s++;
	}
}

int main(void)
{
    // 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();
	
	printString("Start\r\n");
    while (1) {
		charput(charget());
    }
  return 0;
}