ここで利用している関数は、 LBC(Little Burning Core:©宮田耕自氏)のものをOAKS-mini用に一部書き換え、 AX-12との通信用に必要なものを付け足しました。
**********************************************
シリアル通信用関数関数(UART0, UART1)
**********************************************
sci.c, sci.h
--------- UART0 ------------------------------
void UART0_ini(BaudRate b);
引数 :BaudRate b
ボーレート(br57600のように指定)
戻り値:なし
解説 :UART0の初期化
初期値は非同期、8ビット、パリティなし、スリープなし、
送受信許可、割り込みレベル6
int UART0_read(unsigned char *c);
引数 :unsigned char *c
受信データ格納用
戻り値:int
受信状態(0:データなし, 1:データあり)
解説 :1バイト受信
int UART0_write(unsigned char c);
引数 :unsigned char c
送信データ
戻り値:int
送信状態(0:送信失敗, 1:送信成功)
解説 :1バイト送信
送信レジスタが空くまでポーリングでしばらく待つ
--------- UART1 ------------------------------
void UART1_ini(BaudRate b);
引数 :BaudRate b
ボーレート(br57600のように指定)
戻り値:なし
解説 :UART0の初期化
初期値は非同期、8ビット、パリティなし、スリープなし、
送受信許可、割り込みレベル6
int UART1_read(unsigned char *c);
引数 :unsigned char *c
受信データ格納用
戻り値:int
受信状態(0:データなし, 1:データあり)
解説 :1バイト受信
int UART1_write(unsigned char c);
引数 :unsigned char c
送信データ
戻り値:int
送信状態(0:送信失敗, 1:送信成功)
解説 :1バイト送信
送信レジスタが空くまでポーリングでしばらく待つ
--------- 汎用関数 ----------------------------
int SCI_putchar(unsigned char c, int port);
引数 :unsigned char c
送信データ
int port
送信ポート(0:UART0, 1:UART1)
戻り値:int
送信状態(0:送信失敗, 1:送信成功)
解説 :1文字送信
改行はCR+LFに変換して送信
int printStr(unsigned char *str, int port)
引数 :unsigned char *str
送信データ
int port
送信ポート(0:UART0, 1:UART1)
戻り値:int
送信状態(0:送信失敗, 1以上:送信文字数)
解説 :文字列送信
終端文字(0x00)まで送信
int SCI_Str(unsigned char *str, int port, int n)
引数 :unsigned char *str
送信データ
int port
送信ポート(0:UART0, 1:UART1)
int n
送信文字数
戻り値:int
送信状態(0:送信失敗, 1以上:送信文字数)
解説 :指定文字数送信
int SCI_getchar(int port)
引数 :int port
受信ポート(0:UART0, 1:UART1)
戻り値:int
受信状態(-1:ポート指定エラー, 0以上:受信文字)
解説 :1文字受信、受信するまで待つ
CRは改行に変換
|
#ifndef _SCI_H_
#define _SCI_H_
/**************************************************************************
* ボーレート設定リスト : BaudRate
* 転送速度:b pbs
* (設定値は20M/b/16-1)近い値をとるために四捨五入
**************************************************************************/
typedef enum {
br9600 = 129, /* 129.208 */
br14400 = 86, /* 85.806 */
br19200 = 64, /* 64.104 */
br28800 = 42, /* 42.403 */
br31250 = 39, /* 39 */
br38400 = 32, /* 31.552 */
br57600 = 21, /* 20.701 */
br115200 = 10, /* 9.851 */
} BaudRate;
void UART0_ini(BaudRate b);
void int_rec_uart0(void);
int UART0_read(unsigned char *c);
int UART0_write(unsigned char c);
void UART1_ini(BaudRate b);
void int_rec_uart1(void);
int UART1_read(unsigned char *c);
int UART1_write(unsigned char c);
int SCI_putchar(unsigned char c, int port);
int printStr(unsigned char *str, int port);
int SCI_getchar(int port);
int SCI_Str(unsigned char *str, int port, int n);
#endif
|
/****************************************************/
/* ファイル名: sci.c */
/* 内容: シリアル通信用関数 */
/* 日付: 2006.05.05 */
/* 作成者: ono */
/****************************************************/
/* インクルードファイル */
#include "sfr26.h" /* OAKSmini用定義ファイル */
#include "sci.h"
#pragma INTERRUPT int_rec_uart0
#pragma INTERRUPT int_rec_uart1
#define SCI_RX_BUF_SIZE 16
#define SCI_RX_BUF_MASK (SCI_RX_BUF_SIZE-1)
struct tdSCI_RX{
unsigned short stIdx; /* データ開始位置 */
unsigned short edIdx; /* データ終了位置 */
unsigned short dataNum; /* データ数 */
unsigned char buf[SCI_RX_BUF_SIZE]; /* データ格納 */
};
volatile static struct tdSCI_RX SCI_RX0, SCI_RX1;
/**************************************************************************
* uart0初期設定関数 : UART0_ini()
**************************************************************************/
void UART0_ini(BaudRate b)
{
u0mr = 0x05; /* 送受信モ−ドレジスタ 内部クロック */
/* 非同期、8ビット、パリティなし、*/
/* スリープなし */
u0c0 = 0x10; /* 送受信制御レジスタ0 クロックf1選択 */
u0brg = b; /* 転送速度レジスタ */
s0ric = 0x06; /* 割込みレベルの設定(レベル6) */
u0c1 = 0x05; /* 送受信制御レジスタ1 送受信許可 */
ucon = 0x00; /* 送受信制御レジスタ2 */
}
/**************************************************************************
* 受信割り込み : int_rec_uart0()
**************************************************************************/
void int_rec_uart0(void)
{
unsigned char c;
/* 受信バッファに空きがあれば受信 */
if(ri_u0c1){
c=u0rbl;
if(SCI_RX0.dataNum != SCI_RX_BUF_SIZE){
SCI_RX0.buf[SCI_RX0.edIdx]=c;
SCI_RX0.edIdx=(SCI_RX0.edIdx+1) & SCI_RX_BUF_MASK;
SCI_RX0.dataNum++;
}
}
}
/**************************************************************************
* 1バイト受信 : UART0_read()
**************************************************************************/
int UART0_read(unsigned char *c)
{
/* 受信バッファにデータがあれば取り出す */
if(SCI_RX0.dataNum != 0){
*c=SCI_RX0.buf[SCI_RX0.stIdx];
SCI_RX0.stIdx=(SCI_RX0.stIdx+1) & SCI_RX_BUF_MASK;
SCI_RX0.dataNum--;
return(1);
}
/* 受信バッファが空なら何もしないで終了 */
*c=0;
return(0);
}
/**************************************************************************
* 1バイト送信 : UART0_write()
**************************************************************************/
int UART0_write(unsigned char c)
{
unsigned long i;
unsigned short f;
/* 送信レジスタが空くまでポーリングで待つ */
f=0;
for(i=0; i<0x200000; i++){
if(ti_u0c1){
f=1;
break;
}
}
if(f){
u0tb=c;
return(1);
}
return(0);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/**************************************************************************
* uart1初期設定関数 : UART1_ini()
**************************************************************************/
void UART1_ini(BaudRate b)
{
u1mr = 0x05; /* 送受信モ−ドレジスタ 内部クロック */
/* 非同期、8ビット、パリティなし、*/
/* スリープなし */
u1c0 = 0x10; /* 送受信制御レジスタ0 クロックf1選択 */
u1brg = b; /* 転送速度レジスタ */
s1ric = 0x06; /* 割込みレベルの設定(レベル6) */
u1c1 = 0x05; /* 送受信制御レジスタ1 送受信許可 */
ucon = 0x00; /* 送受信制御レジスタ2 */
}
/**************************************************************************
* 受信割り込み : int_rec_uart1()
**************************************************************************/
void int_rec_uart1(void)
{
unsigned char int_flag, c;
int_flag=ri_u1c1;
/* 受信バッファに空きがあれば受信 */
if(int_flag){
c=u1rbl;
if(SCI_RX1.dataNum != SCI_RX_BUF_SIZE){
SCI_RX1.buf[SCI_RX1.edIdx]=c;
SCI_RX1.edIdx=(SCI_RX1.edIdx+1) & SCI_RX_BUF_MASK;
SCI_RX1.dataNum++;
}
}
}
/**************************************************************************
* 1バイト受信 : UART1_read()
**************************************************************************/
int UART1_read(unsigned char *c)
{
/* 受信バッファにデータがあれば取り出す */
if(SCI_RX1.dataNum != 0){
*c=SCI_RX1.buf[SCI_RX1.stIdx];
SCI_RX1.stIdx=(SCI_RX1.stIdx+1) & SCI_RX_BUF_MASK;
SCI_RX1.dataNum--;
return(1);
}
/* 受信バッファが空なら何もしないで終了 */
*c=0;
return(0);
}
/**************************************************************************
* 1バイト送信 : UART1_write()
**************************************************************************/
int UART1_write(unsigned char c)
{
unsigned long i;
unsigned short f;
/* 送信レジスタが空くまでポーリングで待つ */
f=0;
for(i=0; i<0x200000; i++){
if(ti_u1c1){
f=1;
break;
}
}
if(f){
u1tb=c;
return(1);
}
return(0);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
汎用関数
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/**************************************************************************
* 1文字送信 : SCI_putchar()
**************************************************************************/
int SCI_putchar(unsigned char c, int port)
{
int (* myfunc)(unsigned char);
if(port==0){
myfunc = UART0_write;
}else if(port==1){
myfunc = UART1_write;
}else{
return(0);
}
/* 改行はCR+LFに変換して送信 */
if(c=='\n'){
if(!(*myfunc)(0x0D)){
return(0);
}
if(!(*myfunc)(0x0A)){
return(0);
}
}else{ /* それ以外はそのまま送信 */
if(!(*myfunc)(c)){
return(0);
}
}
return(1);
}
/**************************************************************************
* 文字列送信 : printStr()
**************************************************************************/
int printStr(unsigned char *str, int port)
{
unsigned char *s;
/* 終端文字まで1文字ずつ表示 */
for(s=str; *s!='\0'; s++){
if(!SCI_putchar(*s, port)){
return(0);
}
}
return(s-str);
}
/**************************************************************************
* 指定文字数送信 : SCI_Str()
**************************************************************************/
int SCI_Str(unsigned char *str, int port, int n)
{
unsigned char *s;
int i;
/* 1文字ずつ表示 */
for(s=str, i=0; i<n ; i++){
if(!SCI_putchar(*(s+i), port)){
return(0);
}
}
return(s-str);
}
/**************************************************************************
* 1文字受信 : SCI_getchar()
**************************************************************************/
int SCI_getchar(int port)
{
int (* myfunc)(unsigned char *);
unsigned char c;
if(port==0){
myfunc = UART0_read;
}else if(port==1){
myfunc = UART1_read;
}else{
return(-1);
}
/* データを受信するまで待つ */
while(!(*myfunc)(&c)){
;
}
/* 改行文字変換 */
if(c==0x0D){
c='\n';
}
return(c);
}
|
| 広告 | 花 万馬券 | 無料レンタルサーバー ブログ blog | |