PASII/CandeII_1.4/Driver/uart.c

234 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}