UART

目录

1.UART接口

2.数据结构

3.硬件流控

4.UART硬件特性

5.MH1902T平台

1.UART接口

1、串口初始化

该接口实现串口相关的数据结构、硬件初始化,一般只在开机初始化时调用一次。

void dev_com_init(void)
{
    static u8 is_poweron = 0;
    s32 i;

    if(0 == is_poweron)
    {
        is_poweron = 1;

        for(i=0; i

2、打开串口

s32 dev_com_open(s32 nCom, s32 baud, s32 data_bits, u32 parity, s32 stop_bits, s32 flow_ctrl)
{
    s32 ret = DEVSTATUS_ERR_PARAM_ERR;
    
    if(nCom >= PORT_NO_MAX)
    {
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(g_com_fd[nCom] >= 0)
    {
        return DEVSTATUS_SUCCESS;
    }
    
    if(nCom < PORT_UART_PHY_MAX)
    {
        ret = drv_com_open(nCom, baud, data_bits, parity, stop_bits, flow_ctrl);
    }
    else
    {   
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(ret >= 0)
    {
        g_com_fd[nCom] = ret;
    }
    
    return ret;
}

3、读取串口数据

s32 dev_com_read(s32 nCom, u8 *rbuf, u16 rlen)
{
    s32 ret = DEVSTATUS_ERR_PARAM_ERR;
    
    if(nCom >= PORT_NO_MAX)
    {
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(g_com_fd[nCom] < 0)
    {
        return DEVSTATUS_ERR_DEVICE_NOTOPEN;
    }
    
    if(nCom < PORT_UART_PHY_MAX)
    {
        ret = drv_com_read(nCom, rbuf, rlen);
    }  
    else
    {
        ret = 0;
    }
    
    return ret;
}

4、写串口数据

s32 dev_com_write(s32 nCom, u8 *wbuf, u16 wlen)
{
    s32 ret = DEVSTATUS_ERR_PARAM_ERR;
	u16 woffset = 0;
    
    if(nCom >= PORT_NO_MAX)
    {
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(g_com_fd[nCom] < 0)
    {
        return DEVSTATUS_ERR_DEVICE_NOTOPEN;
    }
    
    if(nCom < PORT_UART_PHY_MAX)
    {     
        while(woffset < wlen)
        {
        	ret = drv_com_write(nCom, &wbuf[woffset], wlen-woffset); 
			if(ret < 0)
			{
				break;
			}
           
            dev_watchdog_feed();
			woffset += ret;
        }
        
        ret = woffset;      	
    }    
    else 
    {
        ret = 0;
    }
    
    return ret;
}

5、等待串口发送完数据

s32 dev_com_wait_write_completed(s32 nCom)
{
    s32 ret = DEVSTATUS_ERR_PARAM_ERR;
    
    if(nCom >= PORT_NO_MAX)
    {
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(g_com_fd[nCom] < 0)
    {
        return DEVSTATUS_ERR_DEVICE_NOTOPEN;
    }
    
    if(nCom < PORT_UART_PHY_MAX)
    {
        ret = drv_com_wait_write_completed(nCom);
    }  
    else 
    {
        ret = 0;  
    }  
    
    return ret;
}

6、清除串口接收的数据

s32 dev_com_clean_received_data(s32 nCom)
{
    s32 ret = DEVSTATUS_ERR_PARAM_ERR;
    
    if(nCom >= PORT_NO_MAX)
    {
        return DEVSTATUS_ERR_PARAM_ERR;
    }
    
    if(g_com_fd[nCom] < 0)
    {
        return DEVSTATUS_ERR_DEVICE_NOTOPEN;
    }
    
    if(nCom < PORT_UART_PHY_MAX)
    {
        ret = drv_com_clean_received_data(nCom);
    }  
    else
    {
        ret = 0;
    }
    
    return ret;
}

2.数据结构

1、串口的枚举定义

typedef enum _COM_PORT_NO
{
    PORT_UART0_NO = 0,
    PORT_UART1_NO = 1,
    
    PORT_HID_NO   = 2,
    PORT_CDCD_NO  = 3,
    
    PORT_NO_MAX   = 4,
    PORT_UART_PHY_MAX = 2,
}COM_PORT_NO_E;

2、串口队列的结构体

typedef struct _uart_queue
{
    str_CircleQueue m_tx_queue;
    str_CircleQueue m_rx_queue;       
}uart_queue_t;

接收、发送队列的创建,在串口驱动的实现中,非常重要,有以下2个作用:

1)接收、发送数据的缓冲;

2)队列具有先进先出的特性,保证了数据的准确性;

队列长度的定义如下所示:

#define UART0_TXBUF_SIZE    256
#define UART0_RXBUF_SIZE    512

#define UART1_TXBUF_SIZE    256
#define UART1_RXBUF_SIZE    256

3.硬件流控

1、目的是协调收发双方,使数据不会丢失;

2、使用流控的主要目的就是在数据量大,有可能出现接收数组溢出的时候,采取的一种协调收发

双方的措施;

3、流控设计到RTS和CTS两个口,收发双方都有各自的RTS和CTS;

4、通信双方A,B。那么A的RTS就与B的CTS相连,A的CTS就与B的RTS相连;

5、RTS:RequesttosendCTS:Cleartosend。RTS的作用是告诉对方我可以接受数据,是输出

口。CTS的作用是根据电平高低控制发送或不发送数据

6、A与B通信,现在A给B发送数据,当B出现某种情况(可能是接受缓存快要满了)的时候,B的

RTS拉低,A的CTS是与B的RTS相连的,则A检测到它的CTS拉低,就知道B在告诉他暂时不要再

发了。他就乖乖地停止发送。等到B可以继续接收数据的时候,B的RTS拉高,这时候A的CTS也拉

高,A就知道可以继续发送数据了。

4.UART硬件特性

1、每次发送10位,1位是起始位,8位是数据位,1位是结束位;

2、起始位:用下降沿表示;

5.MH1902T平台

1、接收/发送FIFO介绍

UART外设可配置使用FIFO进行收发数据。每个UART外设均包括16个字节的独立的接收和发送

FIFO。

你可能感兴趣的:(平台层,单片机,嵌入式)