📄 uart.c
字号:
/**************************************************************************** * * MODULE: UART * * COMPONENT: uart.c,v * * VERSION: AT-Jenie_Release_v1_RC3 * * REVISION: 1.5 * * DATED: 2007/10/09 15:14:52 * * STATUS: Exp * * AUTHOR: MRW * * DESCRIPTION: Hardware abstarction layer for UART peripheral * * CHANGE HISTORY: * * uart.c,v * * Implemented configuration in flash * * * * MRW * * LAST MODIFIED BY: mwild * $Modtime: $ * **************************************************************************** * * (c) Copyright 2007 JENNIC Ltd * ****************************************************************************//****************************************************************************//*** Include files ***//****************************************************************************/#include <jendefs.h>#include "AppHardwareApi.h"#include "uart.h"/****************************************************************************//*** Macro Definitions ***//****************************************************************************//* default to uart 0 */#ifndef UART#define UART E_AHI_UART_0#endif#if (UART != E_AHI_UART_0 && UART != E_AHI_UART_1)#error UART must be either 0 or 1#endif/* default BAUD rate 9600 */#ifndef UART_BAUD_RATE#define UART_BAUD_RATE 9600#endif#if (UART == 0) /* [I SP001222_P1 281] */#define UART_START_ADR 0x30000000UL#elif (UART == 1)#define UART_START_ADR 0x40000000UL#endif#define UART_LCR_OFFSET 0x0C#define UART_DLM_OFFSET 0x04/****************************************************************************//*** Type Definitions ***//****************************************************************************//****************************************************************************//*** Local Function Prototypes ***//****************************************************************************/PRIVATE void vUART_HandleUartInterrupt(uint32 u32Device, uint32 u32ItemBitmap);/****************************************************************************//*** Exported Variables ***//****************************************************************************//****************************************************************************//*** Local Variables ***//****************************************************************************//* callbacks */void (*gpfRxFn)(uint8) = NULL;void (*gpfTxRdy)(void) = NULL;/****************************************************************************//*** Exported Functions ***//****************************************************************************//****************************************************************************//*** Local Functions ***//****************************************************************************//**************************************************************************** * * NAME: vUART_Init * * DESCRIPTION: * * PARAMETERS: Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC void vUART_Init(void (*pfRxFn)(uint8), void (*pfTxRdy)(void)){ gpfRxFn = pfRxFn; gpfTxRdy = pfTxRdy; /* Enable UART 0 */ vAHI_UartEnable(UART); vAHI_UartReset(UART, TRUE, TRUE); vAHI_UartReset(UART, FALSE, FALSE);#if (UART == E_AHI_UART_0) vAHI_Uart0RegisterCallback(vUART_HandleUartInterrupt);#elif (UART == E_AHI_UART_1) vAHI_Uart1RegisterCallback(vUART_HandleUartInterrupt);#endif /* Set the clock divisor register to give required buad, this has to be done directly as the normal routines (in ROM) do not support all baud rates */ vUART_SetBaudRate(UART_BAUD_RATE); vAHI_UartSetRTSCTS(UART, TRUE); vAHI_UartSetControl(UART, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, FALSE); /* [I SP001222_P1 279] */ vAHI_UartSetInterrupt(UART, FALSE, FALSE, FALSE, TRUE, E_AHI_UART_FIFO_LEVEL_1); // No TX ints!}/**************************************************************************** * * NAME: vUART_SetBuadRate * * DESCRIPTION: * * PARAMETERS: Name RW Usage * * RETURNS: * ****************************************************************************/PUBLIC void vUART_SetBaudRate(uint32 u32BaudRate){ uint8 *pu8Reg; uint8 u8TempLcr; uint16 u16Divisor; uint32 u32Remainder; /* Put UART into clock divisor setting mode */ pu8Reg = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET); u8TempLcr = *pu8Reg; *pu8Reg = u8TempLcr | 0x80; /* Write to divisor registers: Divisor register = 16MHz / (16 x baud rate) */ u16Divisor = (uint16)(16000000UL / (16UL * u32BaudRate)); /* Correct for rounding errors */ u32Remainder = (uint32)(16000000UL % (16UL * u32BaudRate)); if (u32Remainder >= ((16UL * u32BaudRate) / 2)) { u16Divisor += 1; } pu8Reg = (uint8 *)UART_START_ADR; *pu8Reg = (uint8)(u16Divisor & 0xFF); pu8Reg = (uint8 *)(UART_START_ADR + UART_DLM_OFFSET); *pu8Reg = (uint8)(u16Divisor >> 8); /* Put back into normal mode */ pu8Reg = (uint8 *)(UART_START_ADR + UART_LCR_OFFSET); u8TempLcr = *pu8Reg; *pu8Reg = u8TempLcr & 0x7F;}/**************************************************************************** * * NAME: vUART_HandleUart0Interrupt * * DESCRIPTION: * * PARAMETERS: Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PRIVATE void vUART_HandleUartInterrupt(uint32 u32Device, uint32 u32ItemBitmap){#if (UART == E_AHI_UART_0) if (u32Device == E_AHI_DEVICE_UART0) { if ((u32ItemBitmap & 0x000000FF) == E_AHI_UART_INT_RXDATA) { if (NULL != gpfRxFn) { gpfRxFn(u8AHI_UartReadData(E_AHI_UART_0)); } } else if (u32ItemBitmap == E_AHI_UART_INT_TX) { if (NULL != gpfTxRdy) { gpfTxRdy(); } } }#elif (UART == E_AHI_UART_1) if (u32Device == E_AHI_DEVICE_UART1) { if ((u32ItemBitmap & 0x000000FF) == E_AHI_UART_INT_RXDATA) { if (NULL != gpfRxFn) { gpfRxFn(u8AHI_UartReadData(E_AHI_UART_1)); } } else if (u32ItemBitmap == E_AHI_UART_INT_TX) { if (NULL != gpfTxRdy) { gpfTxRdy(); } } }#endif}/**************************************************************************** * * NAME: vUART_RtsStopFlow * * DESCRIPTION: * Set UART RS-232 RTS line high to stop any further data coming in * ****************************************************************************//* [I SP001222_P1 283] begin */PUBLIC void vUART_RtsStopFlow(void){ vAHI_UartSetControl(UART, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, E_AHI_UART_RTS_HIGH);}/* [I SP001222_P1 283] end *//**************************************************************************** * * NAME: vUART_RtsStartFlow * * DESCRIPTION: * Set UART RS-232 RTS line low to allow further data * ****************************************************************************//* [I SP001222_P1 283] begin */PUBLIC void vUART_RtsStartFlow(void){ vAHI_UartSetControl(UART, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, E_AHI_UART_RTS_LOW);}/* [I SP001222_P1 283] end *//**************************************************************************** * * NAME: vUART_TxChar * * DESCRIPTION: * Set UART RS-232 RTS line low to allow further data * ****************************************************************************/PUBLIC void vUART_TxChar(uint8 u8Char){ vAHI_UartWriteData(UART, u8Char);}/**************************************************************************** * * NAME: vUART_TxReady * * DESCRIPTION: * Set UART RS-232 RTS line low to allow further data * ****************************************************************************/PUBLIC bool_t bUART_TxReady(){ return u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE;}/**************************************************************************** * * NAME: vUART_SetTxInterrupt * * DESCRIPTION: * Enable / disable the tx interrupt * ****************************************************************************/PUBLIC void vUART_SetTxInterrupt(bool_t bState){ vAHI_UartSetInterrupt(UART, FALSE, FALSE, bState, TRUE, E_AHI_UART_FIFO_LEVEL_1);}/****************************************************************************//*** END OF FILE ***//****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -