📄 uart.c
字号:
//Description : The description of Function Pointer sholud be under 15 characters
#include "system.h"
#include "Uart.h"
char BitTable[16][10] = {
"0000 ",
"0001 ",
"0010 ",
"0011 ",
"0100 ",
"0101 ",
"0110 ",
"0111 ",
"1000 ",
"1001 ",
"1010 ",
"1011 ",
"1100 ",
"1101 ",
"1110 ",
"1111 "
};
//Externs
extern void EPLL_setEPLLREF_Source(int epllrefsource);//iis.c
extern void StartStopwatchExtendSet(int n);
extern void StartStopwatchExtendStart(int n);
extern unsigned int EndStopwatchExtend(int n);
// Functions
unsigned char UART_SelectOpClock(int clocksource);
void CalcBaudrate( UART_REGS *, UART_CON *);
int InitializeUart( UART_REGS *, UART_CON *); // initialize with current setting
__inline void RxFifoSub(unsigned char ch);;
__inline void RxFifoSubISR(unsigned char ch);
__inline void RxNonFifoSub(unsigned char ch);
__inline void RxNonFifoSubISR(unsigned char ch);
__inline void TxFifoSub(unsigned char ch);;
__inline void TxFifoSubISR(unsigned char ch);
__inline void TxNonFifoSub(unsigned char ch);
__inline void TxNonFifoSubISR(unsigned char ch);
void UartSubIsr(unsigned char );
void __irq UartIsr0(void);
void __irq UartIsr1(void);
void __irq UartIsr2(void);
void __irq UartIsr3(void);
void __irq DmaIsr(void);
static unsigned int save_rGPHCON;//, save_rGPHPU, save_rSPCON; // for setting Uart Port
static UART_CON UartCon[5] = {{115200,0,0,0,0, 0,3,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,1,0,1,0}
, {115200,0,0,0,0, 0,3,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,1,0,1,0}
, {115200,0,0,0,0, 0,3,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,1,0,1,0}
, {115200,0,0,0,0, 0,3,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,1,0,1,0}
, {115200,0,0,0,0, 0,3,0,0,1, 1,1,1,1,0, 0,0,0,0,0, 0,1,0,1,0}};
// control property per each channel. 4th data is defualt value for initialize
//defined at uart.h
const unsigned int nSlotTable[16] = {0x0000, 0x0080, 0x0808, 0x0888, 0x2222, 0x4924, 0x4a52, 0x54aa,
0x5555, 0xd555, 0xd5d5, 0xddd5, 0xdddd, 0xdfdd, 0xdfdf, 0xffdf};
//Regarding Common Setting information(fixed at before test)
unsigned char g_UART_portTx = 0;
unsigned char g_UART_portRx = 0;
bool g_UART_bTXtest = 0;
bool g_UART_bRXtest = 0;
unsigned int g_UART_baudrate = 115200;
bool g_UART_EnableFifo =0;
unsigned char g_UART_TxTrig =0;
unsigned char g_UART_RxTrig =0;
bool g_UART_RXTimeOuten=0;
unsigned char g_UART_DmaRxDMD_HS =1;
unsigned char g_UART_DmaRxTSZ =0;
unsigned char g_UART_DmaTxDMD_HS =1;
unsigned char g_UART_DmaTxTSZ =0;
extern char *g_pTxString;
extern char *g_pRxString;
//Regarding Setting information(fixed at before test)
static volatile UART_CON *g_pUartConTx;
static volatile UART_CON *g_pUartConRx;
//Regarding Interrupt(fixed at beginning of test)
static volatile U32 SRCPNDOFFSETDUPLEX0;//tx for general
static volatile U32 SUBINTOFFSETDUPLEX0;
static volatile U32 SRCPNDOFFSETDUPLEX1;//rx for general
static volatile U32 SUBINTOFFSETDUPLEX1;
static unsigned char g_RxTrigNum;
static unsigned char g_TxTrigNum;
static bool g_FifoEnableTx;
static bool g_FifoEnableRx;
static bool g_bLeveltypeTx;
static bool g_bLeveltypeRx;
//Regarding Register(address fixed at beginning of test)
// (value always changes)
static volatile UART_REGS *g_pUartRegsTx;
static volatile UART_REGS *g_pUartRegsRx;
//values changes middle of test
unsigned int g_UART_TXdatasize = 10;
unsigned int g_UART_TXdatacnt = 0;
unsigned int g_cntfivepercentTX=1;
unsigned int g_UART_RXdatasize = 10;
unsigned int g_UART_RXdatacnt = 0;
unsigned int g_cntfivepercentRX=1;
static volatile unsigned char isTxDone[4] = {0, 0, 0, 0};
static volatile unsigned char isRxDone[4] = {0, 0, 0, 0};
char *pUartTxStr[4], *pUartRxStr[4];
volatile unsigned int UextClk = 12000000;
volatile unsigned int EpllClk = 12000000;
//volatile unsigned int *pFifoDebug = (unsigned int *)FIFO_DEBUG_BUF; //temporary for fifo count test
//volatile unsigned int fcnt = 0;
//for 2443
BOOL g_bIsLevelInt = FALSE; //TRUE : Level Type , FALSE : Pulse Type
U32 SRCPNDOFFSET;
U32 SUBINTOFFSET;
/////////////////////////////////////////////////////////////////////////////
// Set port / Open, Close Uart
//
void SetUartPort(void)
{ //Push UART GPIO port configuration
save_rGPHCON = rGPHCON;
//Configure UART port
rGPHCON &= ~((0xf<<20)|(0xf<<16)|(0xf<<12)|(0xf<<8)|(0xf<<4)|(0xf<<0));
rGPHCON |= ((0xa<<20)|(0xa<<16)|(0xa<<12)|(0xa<<8)|(0xa<<4)|(0xa<<0));
}
void ReturnUartPort(void)
{ //Pop UART GPIO port configuration
rGPHCON = save_rGPHCON;
}
//can be get input of AFC
unsigned char UartOpen(unsigned char ch, unsigned int SetIRQ, bool bAFC2) // setting H/W & initializing regiter
{
unsigned int temp;
if(SetIRQ)
{
pISR_UART0 = (unsigned)UartIsr0;
pISR_UART1 = (unsigned)UartIsr1;
pISR_UART2 = (unsigned)UartIsr2;
pISR_UART3 = (unsigned)UartIsr3;
pISR_DMA = (unsigned)DmaIsr;
}
switch(ch)
{
case 0 :
rUCON0 &= ~(0x3);//receive disable before gpio set to prevent dummy data input
temp=rGPHCON;
temp &= ~(0xf000f); // GPH0,1,8,9
temp |= 0xa000a; // Uart 0 Rx, Tx, Rts, Cts
rGPHCON = temp;//if uart mode, then keep uart mode.
if(InitializeUart(UART0_REG, &UartCon[0]) == SENDBREAK)
return SENDBREAK; // Initialize register set for Uart 0
break;
case 1 :
rUCON1 &= ~(0x3);//receive disable before gpio set to prevent dummy data input
temp=rGPHCON;
temp&= ~(0xf000f0); // GPH2,3,10,11
temp|= (0xa000a0); // Uart 1 Rx, Tx, Rts, Cts
rGPHCON=temp;//if uart mode, then keep uart mode.
if(InitializeUart(UART1_REG, &UartCon[1]) == SENDBREAK)
return SENDBREAK;
break;
case 2 :
//can be afc
rUCON2 &= ~(0x3);//receive disable before gpio set to prevent dummy data input
temp=rGPHCON;
if(!bAFC2)
{
temp&= ~(0xf<<8); // GPH4,5 //it was 6
temp |= (0xa<<8); // Uart 2 Rx, Tx
}
else
{
temp &= ~(0xff<<8); // GPH4,5,6,7
temp |= (0xfa<<8); // Uart 2 Rx, Tx,nRTS2, nCTS2
}
rGPHCON=temp;//if uart mode, then keep uart mode.
if(InitializeUart(UART2_REG, &UartCon[2]) == SENDBREAK)
return SENDBREAK;
break;
case 3 :
rUCON3 &= ~(0x3);//receive disable before gpio set to prevent dummy data input
temp=rGPHCON;
temp &= ~(0xf<<12); // GPH6,7
temp |= (0xa<<12); // Uart 3 Rx, Tx
rGPHCON=temp;//if uart mode, then keep uart mode.
if(InitializeUart(UART3_REG, &UartCon[3]) == SENDBREAK)
return SENDBREAK;
break;
default :
printf("Can't open UARTx!! Select 0,1, or 2!!");
return FALSE;
}
return TRUE;
}
//support full duplex : duplex0 for tx, duplex1 for rx in general
// at this moment, one channel tx, one channel rx are allowed in this code,
// tx, tx, or rx, rx are not supported.
unsigned char UartClose(unsigned char ch, unsigned char duplex) // return to reset value
{
if (ch > 3) return FALSE;
if(duplex==UART_DUPLEX0)
{
rINTMSK |= (BIT_UART_DUPLEX0);
rINTSUBMSK |= (BIT_UART_ERROR<<SUBINTOFFSETDUPLEX0)|(BIT_UART_TXD<<SUBINTOFFSETDUPLEX0)|(BIT_UART_RXD<<SUBINTOFFSETDUPLEX0);
rSUBSRCPND |= (BIT_UART_ERROR<<SUBINTOFFSETDUPLEX0)|(BIT_UART_TXD<<SUBINTOFFSETDUPLEX0)|(BIT_UART_RXD<<SUBINTOFFSETDUPLEX0);
ClearPending(BIT_UART_DUPLEX0);
}
else
{
rINTMSK |= (BIT_UART_DUPLEX1);
rINTSUBMSK |= (BIT_UART_ERROR<<SUBINTOFFSETDUPLEX1)|(BIT_UART_TXD<<SUBINTOFFSETDUPLEX1)|(BIT_UART_RXD<<SUBINTOFFSETDUPLEX1);
rSUBSRCPND |= (BIT_UART_ERROR<<SUBINTOFFSETDUPLEX1)|(BIT_UART_TXD<<SUBINTOFFSETDUPLEX1)|(BIT_UART_RXD<<SUBINTOFFSETDUPLEX1);
ClearPending(BIT_UART_DUPLEX0);
}
switch(ch)
{
case 0 :
rGPHCON &= ~(0xf000f); // GPH0,1,8,9
break;
case 1 :
rGPHCON &= ~(0xf000f<<4); // GPH2,3,10,11
break;
case 2 :
rGPHCON &= ~(0xf<<6); // GPH4,5
break;
case 3 :
rGPHCON &= ~(0xf<<12); // GPH6,7
break;
default :
printf("Can't close UARTx!! Select 0,1, or 2!!");
return FALSE;
}
return TRUE;
}
//input : Clock source, speed of clock source
//output : rUBRDIVn, rUDIVSLOTn
void CalcBaudrate( UART_REGS *pUartRegs, UART_CON *pUartCon)
{
float DIV_VAL;
unsigned int nOpClock;
unsigned int nSlot;//UDIV_SLOT
float fSlot;//UDIV_SLOT
float frealDiv;
float freal16clock;
switch(pUartCon->cOpClock)
{
case 1 : nOpClock = UextClk; break;// Uextclk
case 3 : nOpClock = EpllClk; break;// Epll
case 0 :
case 2 : // Pclk
default : nOpClock = PCLK; break;
}
DIV_VAL = (nOpClock/(16.*pUartCon->iBaudrate)) - 1;//integerpart-1 + floating part;
//nSlot = (int)( (DIV_VAL - (int)DIV_VAL) * 16);
fSlot = ( (DIV_VAL - (int)DIV_VAL) * 16);
nSlot = (fSlot < 0.5)? 0 :
(fSlot < 1.5)? 1 :
(fSlot < 2.5)? 2 :
(fSlot < 3.5)? 3 :
(fSlot < 4.5)? 4 :
(fSlot < 5.5)? 5 :
(fSlot < 6.5)? 6 :
(fSlot < 7.5)? 7 :
(fSlot < 8.5)? 8 :
(fSlot < 9.5)? 9 :
(fSlot < 10.5)? 10 :
(fSlot < 11.5)? 11 :
(fSlot < 12.5)? 12 :
(fSlot < 13.5)? 13 :
(fSlot < 14.5)? 14 :
(fSlot < 15.5)? 15 :
16;
if(nSlot == 16)
{
printf("Floating part is almost near to 1, integer div value will be added 1 more\n");
nSlot = 0;
DIV_VAL = DIV_VAL +1;
}
pUartRegs->rUbrDiv = (int)DIV_VAL;
pUartRegs->rUdivSlot = nSlotTable[nSlot];
printf("ideal baudrate : %d\n", pUartCon->iBaudrate);
printf("ideal 1 bit length : %f ms\n", 1000/(float)pUartCon->iBaudrate);
printf("ideal 16 mode clock : %d\n", pUartCon->iBaudrate * 16);
printf("ideal div value : %f\n", DIV_VAL+1);
printf("\n");
frealDiv = (int)DIV_VAL + 1 + (float)nSlot/16;
freal16clock = (float)nOpClock / frealDiv;
printf("source clock: %d\n", nOpClock);
printf("real div value : %f\n", frealDiv);
printf("real 16 mode clock :%f \n", freal16clock );
printf("real baudrate :%f \n", freal16clock/16 );
printf("real 1 bit length : %f msec\n", 16*1000/freal16clock );
printf("\n");
printf("register setting\n");
printf("real div value = UBRDIVn(intergerpart-1):%d + floating part : %f (UDIVSLOT : 0x%x)\n",
(int)DIV_VAL, (float)nSlot/16, nSlotTable[nSlot]);
}
int InitializeUart( UART_REGS *pUartRegs, UART_CON *pUartCon) // Initialize register set with current control set
{
#if 1
rGPHCON = ((rGPHCON & ~(0x03 << 26)) | (0x02 << 26)); //clock out0
rMISCCR = ((rMISCCR & ~(0x07 << 4)) | (0x04 << 4)); //pclk
//SetBitFReg(rGPHCON, 2, 0x02, 26);
//SetBitFReg(rMISCCR, 3, 0x04, 4);
//pUartCon->cDataBit = 0x00;
#endif
CalcBaudrate(pUartRegs, pUartCon);
pUartRegs->rUlCon = (pUartCon->fSelUartIrda<<6)|(pUartCon->cParityBit<<3)|(pUartCon->cStopBit<<2)
|(pUartCon->cDataBit);
pUartRegs->rUCon = (pUartCon->cOpClock<<10)|TX_INT_TYPE(pUartCon->cTxIntType)|RX_INT_TYPE(pUartCon->cRxIntType)| (pUartCon->bRXTimeOuten<<7) | (pUartCon->bRXErrorInten<<6)
|(pUartCon->fLoopTest<<5)| (pUartCon->cSendBreakSignal<<4) |(pUartCon->cTxMode<<2)|(pUartCon->cRxMode);
if(pUartCon->cSendBreakSignal)
return SENDBREAK;
pUartRegs->rUfCon = (pUartCon->cTxTrig<<6)|(pUartCon->cRxTrig<<4)|TX_FIFO_RESET|RX_FIFO_RESET
|(pUartCon->fEnableFifo);
pUartRegs->rUmCon = (pUartCon->cRtsTrig<<5)|(pUartCon->fAfc<<4)|RTS_ACTIVE;
return 0;
}
//return n : Divide by n( /1~ /16)
int UART_EpllSel(unsigned char sel)
{
int iNum, DivideBy;
printf("select epll speed : 0. 589.824Mhz->53.620Mhz(11), 1. 96Mhz-> 48Mhz(2) 2. 406.4256Mhz->50.8032(8)MHz\n" );
printf("select epll speed : 3. 589.824Mhz->98.304Mhz(6), 4. 96Mhz-> 96Mhz(1) 5. 406.4256Mhz->101.6064(4)MHz\n" );
printf("select epll speed : 6. 406.4256Mhz->135.4752(3)MHz : %d 7. 36Mhz->2.25Mhz(16) 8.384Mhz->64Mhz(6)\n", sel);
//iNum=GetIntNum();
//iNum = 6;
iNum = (int)sel;
if(iNum==0)
{
rEPLLCON= (49<<16) | (1<<8) | 0;// Epll output - 589824000Hz, pll input - 12MHz
rEPLLCON_K = 9961;
EpllClk = 589824000;
DivideBy =11;//divide by 11 - 53.620Mhz for 4Mbps, 2Mbps
}
else if(iNum==1)
{
rEPLLCON= (32<<16) | (1<<8) | 2;// Epll output - 96M, pll input - 12MHz
rEPLLCON_K = 0;
EpllClk = 96000000;
DivideBy =2;//divide by 2 - 48Mhz for 3Mbps, 1.5Mbps
}
else if(iNum==2)
{
rEPLLCON= (33<<16) | (1<<8) | 0;// Epll output - 406425600, pll input - 12MHz
rEPLLCON_K = 56938;
EpllClk = 406425600;
DivideBy =8;//divide by 8
}
else if(iNum==3)
{
rEPLLCON= (49<<16) | (1<<8) | 0;// Epll output - 589824000Hz, pll input - 12MHz
rEPLLCON_K = 9961;
EpllClk = 589824000;
DivideBy =6;
}
else if(iNum==4)
{
rEPLLCON= (32<<16) | (1<<8) | 2;// Epll output - 96M, pll input - 12MHz
rEPLLCON_K = 0;
EpllClk = 96000000;
DivideBy = 1;
}
else if(iNum==5)
{
rEPLLCON= (33<<16) | (1<<8) | 0;// Epll output - 406425600, pll input - 12MHz
rEPLLCON_K = 56938;
EpllClk = 406425600;
DivideBy =4;
}
else if(iNum==6)
{
rEPLLCON= (33<<16) | (1<<8) | 0;// Epll output - 406425600, pll input - 12MHz
rEPLLCON_K = 56938;
EpllClk = 406425600;
DivideBy =3;
}
else if(iNum==7)
{
rEPLLCON= (48<<16) | (1<<8) | 4;// Epll output - 36Mhz, pll input - 12MHz
rEPLLCON_K = 0;
EpllClk = 36000000;
DivideBy =16;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -