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

📄 serial.c

📁 ch7013驱动
💻 C
字号:
#include <stdarg.h>

#include <assert.h>

#include "config.h"
#include "GFD_reg.h"
#include "TypeDef.h"
#include "serial.h"

#define DBG_ERROR(void)

//#define DBG_Port    UART0_ID

U32 GetBaseAddr(U32 Channel)
{
    switch (Channel)
    {
        case (UART0_ID):
            return (U32)BASE_UART0;
            break;
        case (UART1_ID):
            return (U32)BASE_UART1;
            break;
        default:
            assert(1);
            return ER_;
            break;
    }
  
}


void setTriger( U32 Channel, U8 RevLevel, U8 TranLevel )
{
     U8     tmpRevLev, tmpTranLev;
     
    switch(RevLevel)		//设置接收触发级
    {
        case TrigLev_Rev_1:
            tmpRevLev = msk_TrigerLever_Rev_1;
            break;
        case TrigLev_Rev_4:
            tmpRevLev = msk_TrigerLever_Rev_4;
            break;
        case TrigLev_Rev_8:
            tmpRevLev = msk_TrigerLever_Rev_8;
            break;
        case TrigLev_Rev_14:
            tmpRevLev = msk_TrigerLever_Rev_14;
            break;
        default:
            DBG_ERROR();
            break;
    }
    
    switch(TranLevel)		//设置发送触发级
    {
        case msk_TrigerLever_Tra_0:
            tmpTranLev = msk_TrigerLever_Tra_0;
            break;
        case msk_TrigerLever_Tra_2:
            tmpTranLev = msk_TrigerLever_Tra_2;
            break;
        case msk_TrigerLever_Tra_4:
            tmpTranLev = msk_TrigerLever_Tra_4;
            break;
        case msk_TrigerLever_Tra_8:
            tmpTranLev = msk_TrigerLever_Tra_8;
            break;
        default:
            DBG_ERROR();
            break;
    }

    
    REG8( GetBaseAddr(Channel) + Offset_LineControl ) \
            &= (msk_TrigerLever_Tra_ZI & msk_TrigerLever_Rev_ZI);
    REG8( GetBaseAddr(Channel) + Offset_LineControl ) \
            |= (tmpRevLev |tmpTranLev);
    REG8( GetBaseAddr(Channel) + Offset_IntEnable ) \
            |= msk_INT_EN_TranData;         //发送FIFO触发级中断使能
    REG8( GetBaseAddr(Channel) + Offset_IntEnable ) \
            |= msk_INT_EN_RevData;	        //接收FIFO触发级中断使能

}


void setDataBit(int Channel, char databit)
{
    U8 tmpDataBit;

    switch(databit)    //设置数据位比特数
    {
    case 5:
        tmpDataBit = msk_DataBit_5;
        break;
    case 6:
        tmpDataBit = msk_DataBit_6;
        break;
    case 7:
        tmpDataBit = msk_DateBit_7;
        break;
    case 8:
        tmpDataBit = msk_DateBit_8;
        break;
    default:
        break;
    }

    REG8( GetBaseAddr(Channel) + Offset_LineControl ) &= msk_DataBit_ZI;
    REG8( GetBaseAddr(Channel) + Offset_LineControl ) |= tmpDataBit;
    
}

void setBaudRate (int Channel, short baudrate)
{
    U8 baudh;              //波特率高8  位
    U8 baudl;               //波特率低8  位
    
    /* get correct divisor */
    baudh = ((CLOCK_SPEED_Hz / (baudrate * 16)) & 0xFF00)>>8;
    baudl = (CLOCK_SPEED_Hz / (baudrate * 16)) & 0x00FF;

    REG8( GetBaseAddr(Channel) + Offset_LineControl ) |= msk_DivisorSel;	//允许波特率寄存器被访问
    REG8( GetBaseAddr(Channel) + Offset_Divisor_High ) = baudh;	//将计算后的波特率高8 位写入
    REG8( GetBaseAddr(Channel) + Offset_Divisor_Low ) = baudl;	//将计算后的波特率低8 位写入
    REG8( GetBaseAddr(Channel) + Offset_LineControl ) &= ~msk_DivisorSel;	//关闭波特率寄存器访问

}


void serial_init ( U32 Channel, 
                   U32 BaudRate, U32 DataBit,
                   U32 TrigerLever_Rev, U32 TrigerLever_Tra,
                   BOOL StopBit, 
                   BOOL ParityEnable,
                   BOOL EvenParity,
                   BOOL StickParity,
                   BOOL Break)
{
    
    setBaudRate(Channel, BaudRate);
    setDataBit( Channel, DataBit);
    setTriger( Channel, TrigerLever_Rev, TrigerLever_Tra);
    
    
    (StopBit) ? setStopBit(Channel) : clearStopBit(Channel);
    (ParityEnable) ? setParityBit(Channel) : clearParityBit(Channel);
    (EvenParity) ? setEvenParity(Channel) : setOddParity(Channel);
    (StickParity) ? setStickParity(Channel) : clearStickParity(Channel);
    (Break) ? setBreakBit(Channel): clearBreakBit(Channel);
    
}


void serial_putc (U32 Channel, const U8 c)
{
    
    /* wait for room in the transmit FIFO */
    while(!(REG8( GetBaseAddr(Channel) + Offset_LineStauts ) & msk_T_FIFO_Empty));

    REG8( GetBaseAddr(Channel) + Offset_FIFO_Tran ) = c;

    /*
    to be polite with serial console add a line feed
    to the carriage return character
    */
    if (c=='\n')	
    {
        serial_putc(Channel, '\r');
    }

}

void serial_puts ( U32 Channel, const U8 *s)
{
	while (*s)
	{
	    serial_putc (Channel, *s++);
	}
}

/*
 * Read a single byte from the serial port. Returns 1 on success, 0
 * otherwise. When the function is succesfull, the character read is
 * written into its argument c.
 */
U8 serial_tstc ( U32 Channel )
{
	return ( REG8( GetBaseAddr(Channel) + Offset_LineStauts ) & msk_DataReady);
}

/*
 * Read a single byte from the serial port. Returns 1 on success, 0
 * otherwise. When the function is succesfull, the character read is
 * written into its argument c.
 */
U8 serial_getc ( U32 Channel )
{
	char rv;

	while(1)
        {
	    rv = serial_tstc(Channel);
	    if(rv > 0)
            {
	        return REG8(GetBaseAddr(Channel) + Offset_FIFO_Rev);
            }

        }
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -