?? uart.c
字號:
break;
}
triger_t = (triger_t<<4); //UART接收觸發級即為1(0x00)
WriteReg(UART0_FCR,triger_t);
//設置UART2工作于loopback模式
WriteReg(UART0_MCR,0x10);
//打開modem狀態變化中斷
WriteReg(UART0_IER,0x1);
//寫入FIFO
WriteReg(UART0_T0FIFO,'L');
WriteReg(UART0_T0FIFO,'O');
WriteReg(UART0_T0FIFO,'O');
WriteReg(UART0_T0FIFO,'P');
WriteReg(UART0_T0FIFO,'B');
WriteReg(UART0_T0FIFO,'A');
WriteReg(UART0_T0FIFO,'C');
WriteReg(UART0_T0FIFO,'K');
WriteReg(UART0_T0FIFO,' ');
WriteReg(UART0_T0FIFO,'M');
WriteReg(UART0_T0FIFO,'O');
WriteReg(UART0_T0FIFO,'D');
WriteReg(UART0_T0FIFO,'E');
WriteReg(UART0_T0FIFO,' ');
WriteReg(UART0_T0FIFO,'O');
WriteReg(UART0_T0FIFO,'K');
WriteReg(UART0_T0FIFO,'!');
WriteReg(UART0_T0FIFO,'\n');
for(i=0;i<100;i++);
WriteReg(UART0_MCR,0x16);
for(i=0;i<300;i++);
ReadReg(UART0_MSR);
for(i=0;i<2500;i++);
return 0;
}
/*************************************************************************/
/* FUNCTION */
/* */
/* UartLoopbackTest */
/* */
/* DESCRIPTION */
/* */
/* 該函數的作用是用來把數據打印到上位機超級終端。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* char *s,U32 uart_add */
/* */
/* */
/* OUTPUTS */
/* */
/* 1:success */
/* 0:error */
/* */
/********************print************************************************/
/*************************************************************************/
void Prints(char *s,U32 uart_add) //把數據打印到上位機超級終端
{
int i;
while(*s != '\0')
{
{
*(RP)(uart_add) = *s++; //利用指針傳輸數據,這個是硬件管理的,我們只要把指針指向首數據地址,并且建立循環
}
for(i=0; i<5000 ; i++) ;
}
}
/*************************************************************************/
/* FUNCTION */
/* */
/* UartPcTest */
/* */
/* DESCRIPTION */
/* */
/* 該函數的作用是用來測試UART和PC的通信。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* U32 uart_add,U32 sysclk,U32 baudrate,U32 data_bit */
/* U32 tri_level_t,U32 tri_level_r */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* */
/************************test point 5:UART-PC*****************************/
/*************************************************************************/
void UartPcTest(U32 uart_add,U32 sysclk,U32 baudrate,U32 data_bit,U32 tri_level_t,U32 tri_level_r)
{
U32 baud,bit1,triger_r,triger_t,baudh,baudl;
baud = sysclk/16/baudrate;
baudh = baud >> 8; //波特率高8位
baudl = baud & 0xff; //波特率低8位
switch(data_bit) //bit的第八位設為1,即訪問divisor latch寄存器
{
case 5: bit1 = 0x80;
break;
case 6: bit1 = 0x81;
break;
case 7: bit1 = 0x82;
break;
case 8: bit1 = 0x83;
break;
default: ;
break;
}
bit1 = bit1|0x0b; //奇校驗,1個停止位
WriteReg((uart_add+0x0c),bit1);
WriteReg((uart_add+0x04),baudh);
WriteReg((uart_add+0x00),baudl);
bit1 &= (~(0x1<<7)); //設置訪問普通寄存器
WriteReg((uart_add+0x0c),bit1);
//配置發送FIFO觸發級
switch(tri_level_t) //UART0 發送
{
case 0: triger_t = 0x0;
break;
case 2: triger_t = 0x1;
break;
case 4: triger_t = 0x2;
break;
case 8: triger_t = 0x3;
break;
}
triger_t = (triger_t<<4); //該通道發送觸發級即為(0x00)
WriteReg((uart_add+0x08),triger_t);
/////////////////////////////接收/////////////////////////////////////
switch(tri_level_r)
{
case 1: triger_r = 0x0;
break;
case 4: triger_r = 0x1;
break;
case 8: triger_r = 0x2;
break;
case 14:triger_r = 0x3;
break;
}
triger_r = (triger_r<<6); //該通道發送觸發級即為0(0x00)
WriteReg((uart_add+0x08),triger_r);
WriteReg((uart_add+0x04),0x00);
Uart0IntEn(1, 0); //配置中斷觸發
}
/*************************************************************************/
/* FUNCTION */
/* */
/* Uart0IntEn */
/* */
/* DESCRIPTION */
/* */
/* 該函數的作用是判斷uart0是否準備接收和發送數據, */
/* 從而決定FIFO的使能控制。 */
/* */
/* AUTHOR */
/* */
/* QI Haochun, ASIC&Prochip. */
/* */
/* INPUTS */
/* */
/* S8 recie, S8 thrie */
/* */
/* */
/* OUTPUTS */
/* */
/* None */
/* */
/* */
/*************************************************************************/
void Uart0IntEn(S8 recie, S8 thrie) //判斷uart0是否準備接收和發送數據,從而決定FIFO的使能控制
{
RP uart_reg;
if(recie == 1) //uart0準備好接收數據
{
*uart_reg=ReadReg(UART0_IER); //開接收FIFO觸發級中斷使能/*received data available interrupt enable*/
*uart_reg|=0x1;
}
else if(recie == 0) //uart0沒準備接收數據
{
*uart_reg=ReadReg(UART0_IER); //關閉接收FIFO觸發級中斷使能/*interrupt disable*/
*uart_reg&=~0x1;
}
if(thrie == 1) //uart0準備發送數據
{
*uart_reg=ReadReg(UART0_IER);// |= (0x1 << 1); //開發送FIFO觸發級空中斷使能/*transmitter holding register empty interrupt enable*/
*uart_reg|=(0x1<<1);
}
else if(thrie == 0) //uart0沒準備好發送數據
{
*uart_reg=ReadReg(UART0_IER);// &= ~(0x1 << 1); //關閉發送FIFO觸發級空中斷使能/*transmitter holding register empty interrupt disable*/
*uart_reg&= ~(0x1 << 1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -