📄 toya2_pdic_uart.c
字号:
/*
* @file toya2_pdic_uart.c
* @brief UART1,2 Control
* @author 2005/07/11 Masatoshi Kawashima
* Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
*/
#include "SPRDEF.h"
#include "reg_mx21.h"
#include "toya2_pdic_uart.h"
/*
* Define
*/
#define MHz 1000*1000
#define UARTCLK 16*MHz /* Clock frequency of UART */
/*
* Table for UART1 - 4 control register operation
*/
volatile unsigned long* regUCR1[] = {
&rlMX21_UCR1_1,
// &rlMX21_UCR1_2,
// &rlMX21_UCR1_3,
// &rlMX21_UCR1_4
} ;
volatile unsigned long* regUCR2[] = {
&rlMX21_UCR2_1,
// &rlMX21_UCR2_2,
// &rlMX21_UCR2_3,
// &rlMX21_UCR2_4
} ;
volatile unsigned long* regUCR3[] = {
&rlMX21_UCR3_1,
// &rlMX21_UCR3_2,
// &rlMX21_UCR3_3,
// &rlMX21_UCR3_4
} ;
volatile unsigned long* regUCR4[] = {
&rlMX21_UCR4_1,
// &rlMX21_UCR4_2,
// &rlMX21_UCR4_3,
// &rlMX21_UCR4_4
} ;
volatile unsigned long* regUFCR[] = {
&rlMX21_UFCR_1,
// &rlMX21_UFCR_2,
// &rlMX21_UFCR_3,
// &rlMX21_UFCR_4,
};
volatile unsigned long* regURXD[] = {
&rlMX21_URXD_1,
// &rlMX21_URXD_2,
// &rlMX21_URXD_3,
// &rlMX21_URXD_4,
};
volatile unsigned long* regUTXD[] = {
&rlMX21_UTXD_1,
// &rlMX21_UTXD_2,
// &rlMX21_UTXD_3,
// &rlMX21_UTXD_4,
};
volatile unsigned long* regUBIR[] = {
&rlMX21_UBIR_1,
// &rlMX21_UBIR_2,
// &rlMX21_UBIR_3,
// &rlMX21_UBIR_4
};
volatile unsigned long* regUBMR[] = {
&rlMX21_UBMR_1,
// &rlMX21_UBMR_2,
// &rlMX21_UBMR_3,
// &rlMX21_UBMR_4
};
volatile unsigned long* regUSR1[] = {
&rlMX21_USR1_1,
// &rlMX21_USR1_2,
// &rlMX21_USR1_3,
// &rlMX21_USR1_4
};
volatile unsigned long* regUSR2[] = {
&rlMX21_USR2_1,
// &rlMX21_USR2_2,
// &rlMX21_USR2_3,
// &rlMX21_USR2_4
};
/*=============================================================================
// Function_Name: TOYA2_UARTInit
// description : UART initialize
// argument : None
// return : None
// =============================================================================
*/
void TOYA2_UARTInit(void)
{
/* Set the common Pin */
/* UART1: PTE12-15 */
rlMX21_PTE_GUIS &= ~(0x0000F000) ;
rlMX21_PTE_GPR &= ~(0x0000F000) ;
/* Set clock */
rlMX21_PCCR0 |= 0x00000001; /* UART1 CLK Enable: TOYA2 RS232C port */
rlMX21_PCCR0 &= ~0x00000002; /* UART2 CLK Disable: It is disconnection in default */
rlMX21_PCCR0 &= ~0x00000004; /* UART3 CLK Disable: It is disconnection in default */
rlMX21_PCCR0 &= ~0x00000008; /* UART4 CLK Disable: It is disconnection in default */
}
/*=============================================================================
// Function_Name: TOYA2_UARTOpen
// description : UART Open
// argument : ulPortNum: Port number
// return : None
// =============================================================================
*/
void TOYA2_UARTOpen(ULONG ulPortNum)
{
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
ulPortNum--;
*regUCR1[ulPortNum] |= 0x01; /* UARTEN Bit Enable */
*regUCR2[ulPortNum] |= 0x06; /* TXEN, RXEN bit Enable */
}
/*=============================================================================
// Function_Name: TOYA2_UARTClose
// description : UART Close
// argument : ulPortNum: Port number
// return : None
// =============================================================================
*/
void TOYA2_UARTClose(ULONG ulPortNum)
{
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
ulPortNum--;
*regUCR1[ulPortNum] &= ~0x01; /* UARTEN Bit Enable */
*regUCR2[ulPortNum] &= ~0x06; /* TXEN, RXEN bit Enable */
}
/*=============================================================================
// Function_Name: TOYA2_UARTGetConfigX
// description : Get the UART settings
// argument : ulPortNum: Port number
// return : Present register setting value
// =============================================================================
*/
ULONG TOYA2_UARTGetConfig1(ULONG num){ return(*regUCR1[(num)-1]); }
ULONG TOYA2_UARTGetConfig2(ULONG num){ return(*regUCR2[(num)-1]); }
ULONG TOYA2_UARTGetConfig3(ULONG num){ return(*regUCR3[(num)-1]); }
ULONG TOYA2_UARTGetConfig4(ULONG num){ return(*regUCR4[(num)-1]); }
/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig1
// description : Set UART
// argument : ulPortNum: Port number
// : ulConfig: UCR1 setting value
// return : None
// =============================================================================
*/
void TOYA2_UARTSetConfig1(ULONG ulPortNum, ULONG ulConfig )
{
UCHAR idx; /* Index for array operation */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
*regUCR1[idx] = ulConfig ;
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig2
// description : Set UART
// argument : ulPortNum: Port number
// : ulConfig: UCR1 setting value
// return : None
// =============================================================================
*/
void TOYA2_UARTSetConfig2(ULONG ulPortNum, ULONG ulConfig )
{
UCHAR idx; /* Index for array operation */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
*regUCR2[idx] = ulConfig ;
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig3
// description : Set UART
// argument : ulPortNum: Port number
// : ulConfig: UCR1 setting value
// return : None
// =============================================================================
*/
void TOYA2_UARTSetConfig3(ULONG ulPortNum, ULONG ulConfig )
{
UCHAR idx; /* Index for array operation */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
*regUCR3[idx] = ulConfig ;
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig4
// description : Set UART
// argument : ulPortNum: Port number
// : ulConfig: UCR1 setting value
// return : None
// =============================================================================
*/
void TOYA2_UARTSetConfig4(ULONG ulPortNum, ULONG ulConfig )
{
UCHAR idx; /* Index for array operation */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
*regUCR4[idx] = ulConfig ;
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetFIFOControl
// description : Set UART FIFO
// argument : ulPortNum: Port number
// : ulTxTrg : Transmitter Trigger Level setting vcalue (2 -32)
// : ulRxTrg : Receiver Trigger Level setting vcalue(1 - 32)
// return : None
// =============================================================================
*/
void TOYA2_UARTSetFIFOControl(ULONG ulPortNum, ULONG ulTxTrg, ULONG ulRxTrg )
{
UCHAR idx; /* Index for array operation */
ULONG wkUFCR; /* Work variable for register setting */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
wkUFCR = *regUFCR[idx] ; /* Get the current settings */
wkUFCR &= ~0x0000FC3F; /* Clear the TXTL,RXTL */
wkUFCR |= ((ulTxTrg<<10) | (ulRxTrg<<0)) ; /* Reflect the set value */
*regUFCR[idx] = wkUFCR ; /* Set the register */
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetRFDIV
// description : Set UART FIFO
// argument : ulPortNum: Port number
// : ulDivider: Seting of dividing frequency value of input clock(1 - 7)
// return : None
// =============================================================================
*/
void TOYA2_UARTSetRFDIV(ULONG ulPortNum, ULONG ulDivider )
{
UCHAR idx; /* Index for array operation */
ULONG wkUFCR; /* Work variable for register setting */
const ULONG regval[] = { 0, 5, 4, 3, 2, 1, 0, 6 };
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
wkUFCR = *regUFCR[idx] ; /* Get the current settings */
wkUFCR &= ~0x00000380; /* Clear the value of RFDIV */
wkUFCR |= (regval[ulDivider]<<7) ; /* Reflect the set value */
*regUFCR[idx] = wkUFCR ; /* Set the register */
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetDCEMode
// description : Set UART FIFO
// argument : ulPortNum: Port number
// : ulMode: Set DCE/DTE(0: DCE mode, 1:DTE mode )
// return : None
// =============================================================================
*/
void TOYA2_UARTSetDCEMode(ULONG ulPortNum, ULONG ulMode )
{
UCHAR idx; /* Index for array operation */
ULONG wkUFCR; /* Work variable for register setting */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
wkUFCR = *regUFCR[idx] ; /* Get the current settings */
wkUFCR &= ~0x00000040; /* Clear RFDIV value. */
wkUFCR |= (ulMode<<6) ; /* Reflect the set value */
*regUFCR[idx] = wkUFCR ; /* Set the register */
}
/*=============================================================================
// Function_Name: TOYA2_UARTSetBaudrate
// description : Set baud rate UART
// argument : ulPortNum: Port number
// : ulBaudrate: Baud rate (bps:
// return : None
// =============================================================================
*/
void TOYA2_UARTSetBaudrate(ULONG ulPortNum, ULONG ulBaudrate )
{
ULONG idx; /* Index for array operation */
if( ulPortNum > 1 )
{ /* Parameter error */
return;
}
idx = ulPortNum - 1;
*regUBIR[idx] = (ulBaudrate/100) -1; /* NUM: Baudrate/100 -1*/
*regUBMR[idx] = 0x270F; /* NUM: Baudrate/100 -1*/
}
/*=============================================================================
// Function_Name: TOYA2_UARTReadData
// description : Get the data From UART RxFIFO
// argument : ulPortNum: Port number
// : lDataNum: The maxmum number of data read
// : pReadData: Pointer to data reading array
// : pReadStatus: Pointer to error information storage array
// return : Number of data (LONG type) actually read. Ret<0 indicates error.
// =============================================================================
*/
LONG TOYA2_UARTReadData(ULONG ulPortNum, LONG lDataNum, UCHAR* pReadData, UCHAR* pReadStatus )
{
ULONG idx; /* Index for array operation */
ULONG rxdata;
LONG iCnt;
if( (ulPortNum > 1) ||
(lDataNum < 1) ||
(pReadData==0)
)
{ /* Parameter error */
return -1 ;
}
idx = ulPortNum - 1;
for( iCnt=0; iCnt<lDataNum; iCnt++ )
{
rxdata = *regURXD[idx];
if( (rxdata & 0x00008000)==0 )
{ /* Check out the invalidate data = RxFIFO is emperty */
break;
}
*pReadStatus = (UCHAR)(rxdata>>8); /* Save the error information */
*pReadData = (UCHAR)(rxdata&0x000000FF); /* Save the number of data read */
pReadStatus++; /* upate pointer */
pReadData++;
}
return iCnt;
}
/*=============================================================================
// Function_Name: TOYA2_UARTSendData
// description : Write data to UART TxFIFO.
// argument : ulPortNum: Port number
// : lDataNum: Total number of data written (byte)
// : pSendData: Pointer to writing data
// return : Error information: ret<0 indicates error.
// =============================================================================
*/
LONG TOYA2_UARTSendData(ULONG ulPortNum, LONG lDataNum, UCHAR* pSendData )
{
UCHAR idx; /* Index for array operation */
LONG iCnt;
if( (ulPortNum > 1) ||
(lDataNum < 1) ||
(pSendData==0)
)
{ /* Parameter error */
return -1 ;
}
idx = ulPortNum - 1;
for( iCnt=0; iCnt<lDataNum; iCnt++ )
{
*regUTXD[idx] = *pSendData;
pSendData++;
}
return iCnt;
}
/*=============================================================================
// Function_Name: TOYA2_UARTIsTxReady
// description : Get the information of if it is possible to transmit
// argument : ulPortNum: Port number
// return : TRUE: It is possible to transmit,FALSE: It is impossible to transmit.
// =============================================================================
*/
LONG TOYA2_UARTIsTxReady(ULONG ulPortNum )
{
if(ulPortNum > 1)
{
return FALSE;
}
if( 0==(*regUSR1[ulPortNum-1] & (1<<13)) )
{
return FALSE;
}
return TRUE;
}
/*
* Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -