?? uart.c
字號:
/****************************************************************************
*
* MODULE: uart.c
*
* COMPONENT: $RCSfile: uart.c,v $
*
* VERSION: $Name: $
*
* REVISION: $Revision: 1.1 $
*
* DATED: $Date: 2008/01/30 09:52:07 $
*
* STATUS: $State: Exp $
*
* AUTHOR: Ian Morris
*
* DESCRIPTION
*
* CHANGE HISTORY:
*
* $Log: uart.c,v $ * Revision 1.1 2008/01/30 09:52:07 lmitch * Updated to work with new SDK * * Revision 1.1 2006/07/24 14:40:11 rmm * First Release 1v0 (Based on Application Note JN-AN-1005-Wireless-UART Version 1.5). *
*
*
* LAST MODIFIED BY: $Author: lmitch $
* $Modtime: $
*
*
****************************************************************************
* * This software is owned by Jennic and/or its supplier and is protected * under applicable copyright laws. All rights are reserved. We grant You, * and any third parties, a license to use this software solely and * exclusively on Jennic products. You, and any third parties must reproduce * the copyright and warranty notice and any other legend of ownership on each * copy or partial copy of the software. * * THIS SOFTWARE IS PROVIDED "AS IS". JENNIC MAKES NO WARRANTIES, WHETHER * EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, * ACCURACY OR LACK OF NEGLIGENCE. JENNIC SHALL NOT, IN ANY CIRCUMSTANCES, * BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, SPECIAL, * INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON WHATSOEVER. * * Copyright Jennic Ltd 2005, 2006, 2007. All rights reserved * ****************************************************************************/
/****************************************************************************/
/*** Include files ***/
/****************************************************************************/
#include <jendefs.h>
#include <AppHardwareApi.h>
#include "config.h"
#include "serialq.h"
#include "uart.h"
/****************************************************************************/
/*** Macro Definitions ***/
/****************************************************************************/
#define UART_START_ADR 0x30000000UL
#define UART_LCR_OFFSET 0x0C
#define UART_DLM_OFFSET 0x04
/****************************************************************************/
/*** Type Definitions ***/
/****************************************************************************/
/****************************************************************************/
/*** Local Function Prototypes ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Variables ***/
/****************************************************************************/
/****************************************************************************/
/*** Local Variables ***/
/****************************************************************************/
/****************************************************************************/
/*** Exported Functions ***/
/****************************************************************************/
/****************************************************************************/
/*** Local Functions ***/
/****************************************************************************/
PRIVATE void vUART_SetBuadRate(uint32 u32BaudRate);
/****************************************************************************
*
* NAME: vUART_Init
*
* DESCRIPTION:
*
* PARAMETERS: Name RW Usage
* None.
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PUBLIC void vUART_Init(void)
{
/* Enable UART 0: 1200-8-N-1 */
vAHI_UartEnable(UART);
vAHI_UartReset(UART, TRUE, TRUE);
vAHI_UartReset(UART, FALSE, FALSE);
/* Set the clock divisor register to give 1200 buad, this has to be done
directly as the normal routines (in ROM) do not support 1200 baud */
vUART_SetBuadRate(UART_BAUD_RATE);
vAHI_UartSetControl(UART, FALSE, FALSE, E_AHI_UART_WORD_LEN_8, TRUE, FALSE);
vAHI_UartSetInterrupt(UART, FALSE, FALSE, TRUE, TRUE, E_AHI_UART_FIFO_LEVEL_1);
}
/****************************************************************************
*
* NAME: vUART_SetBuadRate
*
* DESCRIPTION:
*
* PARAMETERS: Name RW Usage
*
* RETURNS:
*
****************************************************************************/
PRIVATE void vUART_SetBuadRate(uint32 u32BaudRate)
{
uint8 *pu8Reg;
uint8 u8TempLcr;
uint16 u16Divisor;
/* 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));
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_StartTx
*
* DESCRIPTION:
*
* PARAMETERS: Name RW Usage
* None.
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PUBLIC void vUART_StartTx(void)
{
/* Has interrupt driven transmit stalled (tx fifo is empty) */
if (u8AHI_UartReadLineStatus(UART) & E_AHI_UART_LS_THRE)
{
if(!bSerialQ_Empty(TX_QUEUE))
{
vAHI_UartWriteData(UART, u8SerialQ_RemoveItem(TX_QUEUE));
}
}
}
/****************************************************************************
*
* NAME: vUART_TxCharISR
*
* DESCRIPTION:
*
* PARAMETERS: Name RW Usage
* None.
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PUBLIC void vUART_TxCharISR(void)
{
if(!bSerialQ_Empty(TX_QUEUE))
{
vAHI_UartWriteData(UART, u8SerialQ_RemoveItem(TX_QUEUE));
}
}
/****************************************************************************
*
* NAME: vUART_RxCharISR
*
* DESCRIPTION:
*
* PARAMETERS: Name RW Usage
* None.
*
* RETURNS:
* None.
*
* NOTES:
* None.
****************************************************************************/
PUBLIC void vUART_RxCharISR(uint8 u8RxChar)
{
vSerialQ_AddItem(RX_QUEUE, u8RxChar);
}
/****************************************************************************/
/*** END OF FILE ***/
/****************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -