⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 JENNIC无线传感器网络 ZIGBEE 文件资料
💻 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 + -