目录
1.UART接口
2.数据结构
3.硬件流控
4.UART硬件特性
5.MH1902T平台
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;
}
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
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就知道可以继续发送数据了。
1、每次发送10位,1位是起始位,8位是数据位,1位是结束位;
2、起始位:用下降沿表示;
1、接收/发送FIFO介绍
UART外设可配置使用FIFO进行收发数据。每个UART外设均包括16个字节的独立的接收和发送
FIFO。