PASII/CandeII_1.4/Driver/uart.c

234 lines
5.4 KiB
C
Raw Normal View History

#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<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uint8_t data Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ע<EFBFBD><EFBFBD>:
ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Tx<EFBFBD>ж<EFBFBD>
*****************************************************************************/
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<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>Rx FIFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
pcnt - <EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
pbuf - ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD>ŵ<EFBFBD>buf
ע<EFBFBD><EFBFBD>: FIFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buf<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD>ֽ<EFBFBD>
****************************************************************************/
void uart_0_read(uint8_t *pcnt, uint8_t *pbuf)
{
uint8_t i = 0;
volatile uint8_t dly = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64Mʱ<4D>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>delay
while(!UART_0_CTRL->RX_FIFO_EMPTY)
{
*(pbuf+i) = UART_0_CTRL->RX_DATA;
i++;
//<2F><>ʱ400ns<6E><73><EFBFBD><EFBFBD>
dly++;
dly++;
dly++;
}
*pcnt = i;
}
void uart_0_close(void)
{
UART_0_CTRL->UART_EN = 0;
NVIC_DisableIRQ(UART0_IRQn);
}
/*****************************************************************************
UART0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
ע<EFBFBD><EFBFBD>:
RX_FLUSHֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λRX_FIFO_EMPTY,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RI
*****************************************************************************/
void UART0_IRQHandler(void)
{
if ((UART_0_CTRL->RI) == 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>buf[]<5D><>
uint8_t len, buf[4];
UART_0_CTRL->RI = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD>
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<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uint8_t data Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ע<EFBFBD><EFBFBD>:
ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Tx<EFBFBD>ж<EFBFBD>
****************************************************************************/
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<EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>Rx FIFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
pcnt - <EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
pbuf - ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD>ŵ<EFBFBD>buf
ע<EFBFBD><EFBFBD>: FIFO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buf<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ4<EFBFBD>ֽ<EFBFBD>
****************************************************************************/
void uart_1_read(uint8_t *pcnt, uint8_t *pbuf)
{
uint8_t i = 0;
volatile uint8_t dly = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>64Mʱ<4D>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>delay<61><79>ʱ400ns<6E><73><EFBFBD><EFBFBD>
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<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϺ<EFBFBD><EFBFBD><EFBFBD>
ע<EFBFBD><EFBFBD>:
RX_FLUSHֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λRX_FIFO_EMPTY,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RI
*****************************************************************************/
void UART1_IRQHandler(void)
{
if ((UART_1_CTRL->RI) == 1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>buf[]<5D><>
UART_1_CTRL->RI = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD>
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;
}
}