234 lines
5.4 KiB
C
234 lines
5.4 KiB
C
#include "uart.h"
|
||
#include "gpio.h"
|
||
|
||
static UART_CTRL_TYPE * UART_0_CTRL = ((UART_CTRL_TYPE *) UART_0_CTRL_BASE);
|
||
static UART_CTRL_TYPE * UART_1_CTRL = ((UART_CTRL_TYPE *) UART_1_CTRL_BASE);
|
||
|
||
void uartRx_callback(void);
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
void uart_0_init(void)
|
||
{
|
||
PIN_CONFIG->PIN_15_SEL = PIN_SEL_UART_RXD0;
|
||
PIN_CONFIG->PIN_16_SEL = PIN_SEL_UART_TXD0;
|
||
|
||
|
||
PIN_CONFIG->PAD_21_INPUT_PULL_UP = 0;
|
||
PIN_CONFIG->PAD_22_INPUT_PULL_UP = 0;
|
||
|
||
UART_0_CTRL->CLK_SEL = 0; /* 1=32M, 0=16M */
|
||
|
||
UART_0_CTRL->BAUDSEL = UART_BAUD_115200;
|
||
UART_0_CTRL->FLOW_EN = UART_RTS_CTS_DISABLE;
|
||
|
||
UART_0_CTRL->RX_INT_MASK = 1; /* 1=MASK */
|
||
UART_0_CTRL->TX_INT_MASK = 1; /* 1=MASK */
|
||
|
||
UART_0_CTRL->PAR_FAIL_INT_MASK = 1; /* 1=MASK */
|
||
UART_0_CTRL->par_rx_even = 0; /* 1=Even, 0=Odd */
|
||
UART_0_CTRL->par_rx_en = 0; /* 1=Rx Parity check enable */
|
||
|
||
UART_0_CTRL->par_tx_even = 0; /* 1=Even, 0=Odd */
|
||
UART_0_CTRL->par_tx_en = 0; /* 1=Tx Parity check enable */
|
||
|
||
//clr Int Flag
|
||
UART_0_CTRL->RI = 0;
|
||
UART_0_CTRL->TI = 0;
|
||
UART_0_CTRL->PAR_FAIL = 1;
|
||
|
||
UART_0_CTRL->RX_FLUSH = 1; /* clr rx fifo and set RX_FIFO_EMPTY */
|
||
|
||
NVIC_EnableIRQ(UART0_IRQn);
|
||
|
||
UART_0_CTRL->UART_EN = 1;
|
||
}
|
||
|
||
/****************************************************************************
|
||
UART0串口写函数
|
||
参数: uint8_t data 要发送的数据
|
||
注意:
|
||
使用这个函数不可使能Tx中断
|
||
*****************************************************************************/
|
||
void uart_0_write(uint8_t data)
|
||
{
|
||
UART_0_CTRL->TX_DATA = data;
|
||
while(UART_0_CTRL->TI == 0);
|
||
UART_0_CTRL->TI = 0;
|
||
}
|
||
|
||
/****************************************************************************
|
||
UART0串口读Rx FIFO函数
|
||
参数:
|
||
pcnt - 返回读到的字节数
|
||
pbuf - 指向数据存放的buf
|
||
注意: FIFO长度为4,要求接收buf大小至少为4字节
|
||
****************************************************************************/
|
||
void uart_0_read(uint8_t *pcnt, uint8_t *pbuf)
|
||
{
|
||
uint8_t i = 0;
|
||
volatile uint8_t dly = 0; //如果用64M时钟,必须要加delay
|
||
|
||
while(!UART_0_CTRL->RX_FIFO_EMPTY)
|
||
{
|
||
*(pbuf+i) = UART_0_CTRL->RX_DATA;
|
||
i++;
|
||
|
||
//延时400ns以上
|
||
dly++;
|
||
dly++;
|
||
dly++;
|
||
}
|
||
|
||
*pcnt = i;
|
||
}
|
||
|
||
void uart_0_close(void)
|
||
{
|
||
UART_0_CTRL->UART_EN = 0;
|
||
NVIC_DisableIRQ(UART0_IRQn);
|
||
}
|
||
|
||
/*****************************************************************************
|
||
UART0串口中断函数
|
||
注意:
|
||
RX_FLUSH只能置位RX_FIFO_EMPTY,不能清除RI
|
||
*****************************************************************************/
|
||
void UART0_IRQHandler(void)
|
||
{
|
||
if ((UART_0_CTRL->RI) == 1)
|
||
{
|
||
//读数据到buf[]中
|
||
uint8_t len, buf[4];
|
||
UART_0_CTRL->RI = 0; //先清标志,再读数据
|
||
uart_0_read(&len, buf);
|
||
}
|
||
|
||
#if 1
|
||
if ((UART_0_CTRL->TI) == 1)
|
||
{
|
||
UART_0_CTRL->TI = 0;
|
||
}
|
||
#endif
|
||
|
||
if((UART_0_CTRL->PAR_FAIL) == 1)
|
||
{
|
||
UART_0_CTRL->PAR_FAIL = 1;
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
void uart_1_init(void)
|
||
{
|
||
// PIN_CONFIG->PIN_0_SEL = PIN_SEL_UART_RXD1;
|
||
// PIN_CONFIG->PIN_1_SEL = PIN_SEL_UART_TXD1;
|
||
|
||
PIN_CONFIG->PIN_12_SEL = PIN_SEL_UART_RXD1;
|
||
PIN_CONFIG->PIN_13_SEL = PIN_SEL_UART_TXD1;
|
||
|
||
PIN_CONFIG->PAD_12_INPUT_PULL_UP = 0;
|
||
PIN_CONFIG->PAD_13_INPUT_PULL_UP = 0;
|
||
|
||
UART_1_CTRL->CLK_SEL = 0; /* 1=32M, 0=16M */
|
||
|
||
UART_1_CTRL->BAUDSEL = UART_BAUD_2400;
|
||
UART_1_CTRL->FLOW_EN = UART_RTS_CTS_DISABLE;
|
||
|
||
UART_1_CTRL->RX_INT_MASK = 0; /* 1=MASK */
|
||
UART_1_CTRL->TX_INT_MASK = 1; /* 1=MASK */
|
||
|
||
UART_1_CTRL->PAR_FAIL_INT_MASK = 1; /* 1=MASK */
|
||
UART_1_CTRL->par_rx_even = 0; /* 1=Even, 0=Odd */
|
||
UART_1_CTRL->par_rx_en = 0; /* 1=Rx Parity check enable */
|
||
|
||
UART_1_CTRL->par_tx_even = 0; /* 1=Even, 0=Odd */
|
||
UART_1_CTRL->par_tx_en = 0; /* 1=Tx Parity check enable */
|
||
|
||
//clr Int Flag
|
||
UART_1_CTRL->RI = 0;
|
||
UART_1_CTRL->TI = 0;
|
||
UART_1_CTRL->PAR_FAIL = 1;
|
||
|
||
UART_1_CTRL->RX_FLUSH = 1; /* clr rx fifo and set RX_FIFO_EMPTY */
|
||
|
||
NVIC_EnableIRQ(UART1_IRQn);
|
||
|
||
UART_1_CTRL->UART_EN = 1;
|
||
}
|
||
|
||
/****************************************************************************
|
||
UART1串口写函数
|
||
参数: uint8_t data 要发送的数据
|
||
注意:
|
||
使用这个函数不可使能Tx中断
|
||
****************************************************************************/
|
||
void uart_1_write(uint8_t data)
|
||
{
|
||
UART_1_CTRL->TX_DATA = data;
|
||
while(UART_1_CTRL->TI == 0);
|
||
UART_1_CTRL->TI = 0;
|
||
}
|
||
|
||
/****************************************************************************
|
||
UART1串口读Rx FIFO函数
|
||
参数:
|
||
pcnt - 返回读到的字节数
|
||
pbuf - 指向数据存放的buf
|
||
注意: FIFO长度为4,要求接收buf大小至少为4字节
|
||
****************************************************************************/
|
||
void uart_1_read(uint8_t *pcnt, uint8_t *pbuf)
|
||
{
|
||
uint8_t i = 0;
|
||
volatile uint8_t dly = 0; //如果用64M时钟,必须要加delay延时400ns以上
|
||
|
||
while(!UART_1_CTRL->RX_FIFO_EMPTY)
|
||
{
|
||
*(pbuf+i) = UART_1_CTRL->RX_DATA;
|
||
i++;
|
||
//
|
||
dly++;
|
||
dly++;
|
||
dly++;
|
||
}
|
||
|
||
*pcnt = i;
|
||
}
|
||
void uart_1_close(void)
|
||
{
|
||
UART_1_CTRL->UART_EN = 0;
|
||
NVIC_DisableIRQ(UART1_IRQn);
|
||
}
|
||
|
||
void uartRx_callback(void)
|
||
{
|
||
uint8_t cnt,temp[4];
|
||
uart_1_read(&cnt,temp);
|
||
}
|
||
|
||
/*****************************************************************************
|
||
UART1串口中断函数
|
||
注意:
|
||
RX_FLUSH只能置位RX_FIFO_EMPTY,不能清除RI
|
||
*****************************************************************************/
|
||
void UART1_IRQHandler(void)
|
||
{
|
||
if ((UART_1_CTRL->RI) == 1)
|
||
{
|
||
//读数据到buf[]中
|
||
|
||
UART_1_CTRL->RI = 0; //先清标志,再读数据
|
||
|
||
uartRx_callback();
|
||
}
|
||
|
||
#if 0
|
||
if ((UART_1_CTRL->TI) == 1)
|
||
{
|
||
UART_1_CTRL->TI = 0;
|
||
}
|
||
#endif
|
||
if((UART_1_CTRL->PAR_FAIL) == 1)
|
||
{
|
||
UART_1_CTRL->PAR_FAIL = 1;
|
||
}
|
||
}
|