⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sio_com.c

📁 oki67500系列arm工程例程源代码
💻 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 + -