?? uart.c
字號:
/********************************************************************************/
/* Filename: uart.c */
/* Function: Define uart transfer and receiver functions */
/********************************************************************************/
#include "UART.h"
#include "type.h"
#include <csl_gpt.h>
extern GPT_Handle hGpt;
extern unsigned short int Counter;
unsigned int Delay_Factor;
HANDLE UartChannel;
unsigned int *SendDataPtr;
/******************************************************************************/
/* delay() - 延時一段時間 */
/* */
/* 參數: */
/* 無 */
/* */
/* 返回值: 無 */
/* */
/******************************************************************************/
extern void delay(void)
{
unsigned int i;
for(i=0;i<7;i++)
{
asm(" NOP");
}
}
/******************************************************************************/
/* uart_open() - 打開相應的異步串口,獲得有效的句柄 */
/* */
/* 參數: */
/* uart:選擇要打開的異步串口 */
/* */
/* 返回值: 對應的有效句柄 */
/* 當返回值為0xFFFF時,為無效句柄 */
/* */
/******************************************************************************/
extern HANDLE uart_open(UartId uart)
{
int data_return;
if(uart == 0)
{
data_return = 0x10; // Uart A
return (HANDLE) data_return;
}
if(uart == 1)
{
data_return = 0x18; // Uart B
SYSCNTL1 = 0x10; // 選擇外擴的UART B
delay();
return (HANDLE) data_return;
}
data_return = 0xFFFF;
return (HANDLE) data_return;
}
/********************************************************************************/
/* */
/* 函數定義: unsigned int _uart_write_reg(HANDLE channel, unsignedint reg,unsigned int regdata) */
/* 功 能: 串口初始化 */
/* 入口參數: */
/* ---- channel:串口A或是串口B */
/* 出口參數: 無 */
/* */
/********************************************************************************/
extern unsigned int uart_write_reg(HANDLE channel, unsigned int reg,unsigned int regdata)
{
if((unsigned long int)channel == 0x10) // a path
{
(*(volatile unsigned int *)(chanel_a+reg)) = regdata;
delay();
}
else // b path
{
(*(volatile unsigned int *)(chanel_b+reg)) = regdata;
delay();
}
return(OK);
}
/******************************************************************************/
/* uart_read_reg - 讀取串口控制寄存器 */
/* */
/* 參數: */
/* channel: 選擇要打開的異步串口 */
/* reg : 寄存器的相對地址 */
/* */
/* 返回值: 所對應的寄存器值 */
/* */
/* */
/******************************************************************************/
extern unsigned int uart_read_reg(HANDLE channel, unsigned int reg)
{
unsigned int RegValue;
if((unsigned long int)channel == 0x10) // a path
{
RegValue = (*(volatile unsigned int *)(chanel_a+reg));
}
else // b path
{
RegValue = (*(volatile unsigned int *)(chanel_b+reg));
}
return (RegValue);
}
/******************************************************************************/
/* uart_setup() - 設置串口通訊的狀態,并設置其各寄存器默認值 */
/* */
/* 參數: */
/* Channel: 有效的串口句柄 */
/* UartBaud: 設置串口的波待率 */
/* UartWordLen: 設置字長 */
/* UartStopBits: 設置停止位 */
/* UartParity: 設置較驗位 */
/* UartFifoControl:設置FIFO的狀態 */
/* UartLoopway: 是否進行自閉環測試 */
/* */
/* 返回值: - 無 */
/* */
/******************************************************************************/
extern void uart_setup(HANDLE Channel,
unsigned int UartBaud,
unsigned int UartWordLen,
unsigned int UartStopBits,
unsigned int UartParity,
unsigned int UartFifoControl,
unsigned int UartLoopway)
{
unsigned int baudrateh,baudratel;
unsigned int uartdata;
/* 確定延時系數 */
Delay_Factor = UartBaud;
/*設置波待率分頻數為1*/
uart_write_reg(Channel,lcr,0xBF);
uart_write_reg(Channel,efr,0x10);
uart_write_reg(Channel,lcr,0x0);
uart_write_reg(Channel,mcr,0x0);
/*使能波待率設置寄存器*/
uart_write_reg(Channel,lcr,0x80);
/*設置波特率低位*/
baudratel = UartBaud & 0xff;
uart_write_reg(Channel,dll,baudratel);
/*設置波特率高位*/
baudrateh = (UartBaud & 0xff00) >>8;
uart_write_reg(Channel,dlh,baudrateh);
/*關閉波待率設置寄存器*/
uart_write_reg(Channel,lcr,0x00);
/*設置數據格式*/
uartdata = UartWordLen + UartStopBits + UartParity;
uart_write_reg(Channel,lcr,uartdata);
/*設置FIFO參數*/
uart_write_reg(Channel,fcr,fifo_rreset);
uart_write_reg(Channel,fcr,UartFifoControl);
/*是否為閉環測試*/
uart_write_reg(Channel,mcr,UartLoopway);
}
/******************************************************************************/
/* uart_interrupt_control() - 串口中斷設置,并設置相應的寄存器默認值 */
/* */
/* 參數: */
/* Channel: 有效的串口句柄 */
/* UartIntr: 設置串口的中斷源 */
/* */
/* 返回值: */
/* 操作成功,返回0 */
/* 操作失敗,返回-1 */
/* */
/******************************************************************************/
extern void uart_interrupt_control( HANDLE Channel,
unsigned int UartIntr)
{
if((unsigned long int)Channel == 0x10)
{
/*清空UART的狀態位*/
uart_read_reg((HANDLE)0x10,lsr);
/*設置中斷源*/
uart_write_reg(Channel,ier,UartIntr);
/*設置A通路中斷使能*/
uart_write_reg((HANDLE)0x10,mcr,0x49);
}
if((unsigned long int)Channel == 0x18)
{
/*清空UART的狀態位*/
uart_read_reg((HANDLE)0x18,lsr);
/*設置中斷源*/
uart_write_reg(Channel,ier,UartIntr);
/*設置B通路中斷使能*/
uart_write_reg((HANDLE)0x18,mcr,0x49);
}
}
/******************************************************************************/
/* max3610_set() - MAX3310的設置,并設置相應的寄存器默認值 */
/* */
/* 參數: */
/* Channel:有效的串口句柄 */
/* FastSet: 設置串口的通訊速度限制 */
/* HpdsSet: 設置串口的全雙工,還是半雙工 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void max3160_set( HANDLE Channel,
unsigned int FastSet,
unsigned int HdplxSet)
{
unsigned int max3310t;
/*保存當前的寄存器設置*/
max3310t = uart_read_reg(Channel,mcr);
max3310t = (max3310t || (FastSet + HdplxSet<<4));
/*更新設置*/
uart_write_reg(Channel,mcr,max3310t);
}
/******************************************************************************/
/* uart_send_sigle() - 查詢方式下串口發送一個數據 */
/* */
/* 參數: */
/* Channel:有效的串口句柄 */
/* send_data: 要發送的數據 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void uart_send_sigle(HANDLE Channel,unsigned int send_data)
{
unsigned int lsrdata;
do
{
lsrdata = uart_read_reg(Channel,lsr);
}
while((lsrdata & 0x40) != 0x40);
uart_write_reg(Channel,thr,send_data);
}
/******************************************************************************/
/* Myuart_Send() - 在查詢方式下串口發送多個數據(由定時器控制數據發送) */
/* */
/* 參數: */
/* Channel:有效的串口句柄 */
/* longth: 緩沖區的長度 */
/* send_data: 緩沖區的首址 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
extern void Myuart_Send(HANDLE Channel,
unsigned int longth,
unsigned int *send_data)
{
Counter = 0; // 字符發送計數器清0
SendDataPtr = send_data;
UartChannel = Channel;
GPT_start(hGpt); // 啟動定時器,開始計時
do
{
}
while(!(Counter>=longth));
GPT_stop(hGpt); // 停止定時器
}
/******************************************************************************/
/* uart_receive_single() - 中斷方式下串口接收單個數據 */
/* */
/* 參數: */
/* Channel: 有效的串口句柄 */
/* */
/* 返回值 接收到的數據 */
/******************************************************************************/
extern unsigned int uart_receive_single(HANDLE Channel)
{
unsigned int RegValue;
unsigned int j;
for(j=0;j<1000;j++)
{
asm(" NOP");
}
if((unsigned long int)Channel == 0x10)
{
/* 讀接收保持寄存器 */
RegValue = uart_read_reg((HANDLE)0x10,rhr);
return(RegValue);
}
if((unsigned long int)Channel == 0x18)
{
/* 讀接收保持寄存器 */
RegValue = uart_read_reg((HANDLE)0x18,rhr);
return(RegValue);
}
else return(OK) ;
}
/*******************************************************************************************/
// No more
/*******************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -