📄 sio_com.c
字号:
/**********************************************************************************/
/* */
/* Copyright (C) 2003 Oki Electric Industry Co., LTD. */
/* */
/* System Name : ML675001 series */
/* Module Name : SIO common module */
/* File Name : sio_com.c */
/* Revision : 01.00 */
/* Date : 2003/03/09 initial version */
/* */
/**********************************************************************************/
#include "ML675001.h"
#include "common.h"
#include "sio_com.h"
#include "irq.h"
static volatile int SIO_transmit_flag; /* 1:complete transmit 0: not complete transmit */
static volatile char error_flag; /* 0:error not happen 1: overrun error
2:parity error 3:framing error 4:overflow error */
static volatile UBYTE SIO_rw_buf[SIO_BUF_SIZE];
static volatile int rw_in, rw_out, rw_size;
UBYTE str_buff[16];
void SIO_handler(void);
/*****************************************************************************/
/* Initialize SIO */
/* Function : SIO_init */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/*****************************************************************************/
void SIO_init(void)
{
UHWORD gpctl_dt;
SIO_transmit_flag = 1;
error_flag =0;
put_hvalue(SIOBCN, 0x00); /* stop baud rate timer */
put_hvalue(SIOSTA, 0x37); /* clear SIOSTA */
put_hvalue(SIOCON, 0x00); /* clear SIOCON */
/* a setup of SIOBT (set a reload value) */
put_hvalue(SIOBT,VALUE_OF_SIO);
/* a setup of SIOCON (8 bits of data length, parity bit none, a stop bit 1) */
put_hvalue(SIOCON,SIOCON_LN8|SIOCON_PDIS|SIOCON_TSTB1);
/* register IRQ handlers into handler table */
IRQ_HANDLER_TABLE[INT_SIO] = SIO_handler;
/* setup interrupt level */
set_wbit(ILC1, ILC1_ILR10 & ILC1_INT_LV2); /* sio(nIRQ[10]) -> level2 */
/* SIO start */
gpctl_dt = get_hvalue(GPCTL);
gpctl_dt |= 0x0002;
/* setting of port */
set_hbit(GPCTL,gpctl_dt); /* selection of a secondary function (gpctl 1bit)*/
put_hvalue(SIOBCN,SIOBCN_BGRUN); /* start baud rate timer */
return;
}
/*****************************************************************************/
/* SIO transmission data */
/* Function : SIO_out */
/* Parameters */
/* Input : Pointer to transmission data */
/* Length of transmission data */
/* Output : Nothing */
/*****************************************************************************/
void SIO_send(unsigned const char *s, int l)
{
int count = 0;
while(count <= l){
SIO_transmit_flag = 0;
put_hvalue(SIOBUF,s[count]); /* output one character */
while(SIO_transmit_flag == 0) /* complete transmit ? */
;
count++;
}
return;
}
/*****************************************************************************/
/* SIO transmission data */
/* Function : SIO_out */
/* Parameters */
/* Input : Pointer to transmission data */
/* Length of transmission data */
/* Output : Nothing */
/*****************************************************************************/
char SIO_receive(char *s, int *l)
{
int i;
irq_dis(); /* disable irq */
for(i=0;i<SIO_BUF_SIZE;i++) {
s[i] = (char)SIO_rw_buf[rw_out];
rw_out ++;
rw_size --;
rw_out = (rw_out >= SIO_BUF_SIZE) ? 0 : rw_out;
if(rw_size < 0) {
break;
}
}
*l = i;
irq_en(); /* enable irq */
return(error_flag);
}
/*****************************************************************************/
/* SIO handler */
/* Function : SIO_handler(void) */
/* Parameters */
/* Input : Nothing */
/* Output : Nothing */
/*****************************************************************************/
void SIO_handler(void)
{
UWORD sta = get_hvalue(SIOSTA);
UWORD buf;
if(sta & SIOSTA_RVIRQ){ /* received interrupt ? */
/* receive */
put_hvalue(SIOSTA,SIOSTA_RVIRQ); /* clear RVIRQ flag */
buf = get_hvalue(SIOBUF);
/* error happened */
if(sta & 0x07){
if((sta & 0x07) & SIOSTA_OERR) error_flag = 1; /* overrun error ? */
else if((sta & 0x07) & SIOSTA_PERR) error_flag = 2; /* parity error ? */
else if((sta & 0x07) & SIOSTA_FERR) error_flag = 3; /* framing error ? */
else
;
put_hvalue(SIOSTA,(sta & 0x07)); /* clear error status */
}
else if((rw_size >= SIO_BUF_SIZE)) error_flag = 4; /* overflow error ? */
/* error did not happen */
else{ /* normal receive */
SIO_rw_buf[rw_in] = buf; /* set receive data */
rw_in ++;
rw_size ++;
rw_in = (rw_in >= SIO_BUF_SIZE) ? 0 : rw_in;
}
}
else if(sta & SIOSTA_TRIRQ){
/* transmit */
put_hvalue(SIOSTA,SIOSTA_TRIRQ); /* clear TRIRQ flag */
SIO_transmit_flag = 1;
}
return ;
}
/********************************************************************/
/* Long to hex char */
/********************************************************************/
const unsigned char *SIO_ltoa_hex(unsigned long i, int len)
{
int tmp;
str_buff[len] = '\0';
for(len--;len>=0;len--){
tmp = i&0xF;
str_buff[len] = tmp + (tmp<10 ? '0' : ('A'-10));
i >>= 4;
}
return str_buff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -