?? uart.h
字號:
/********************************************************************************/
/* UART.H v1.00 */
/* 版權(c) 2003- 北京合眾達電子技術有限責任公司 */
/* 設計者: 段立鋒 */
/********************************************************************************/
#ifndef _UART
#define _UART
#include "type.h"
/********************************************************************************/
/* 常量定義 */
/********************************************************************************/
// UART instance enumeration
typedef enum
{
UART_A = 0,
UART_B = 1
} UartId, *PUartId;
extern HANDLE UartChannel;
extern unsigned int *SendDataPtr;
/************************************************************************/
/* Register definiton for system I/O control and status registers */
/************************************************************************/
#define SYSCNTL1 (*(volatile unsigned int *)(0x280000)) // Sytem control register 1
#define SYSSTAT1 (*(volatile unsigned int *)(0x280003)) // Sytem status register 1
/*System interruption Register*/
#define sysstat1 0x280003 /*系統中斷狀態寄存器在IO空間的地址。只讀 */
/**********************************************************************/
/* Register definiton for B path */
/**********************************************************************/
#define TLARHR (*(volatile int *)(0x280008)) /*接收保持寄存器的地址,只讀*/
#define TLATHR (*(volatile int *)(0x280008)) /*發送保持寄存器的地址,只寫*/
#define TLAIER (*(volatile int *)(0x280009)) /*中斷使能寄存器的地址,讀寫*/
#define TLAIIR (*(volatile int *)(0x28000A)) /*中斷標志寄存器的地址,只讀*/
#define TLAFCR (*(volatile int *)(0x28000A)) /*FIFO控制寄存器的地址,只寫*/
#define TLALCR (*(volatile int *)(0x28000B)) /*線路控制寄存器的地址,讀寫*/
#define TLAMCR (*(volatile int *)(0x28000C)) /*MODEM控制寄存器的地址,讀寫*/
#define TLALSR (*(volatile int *)(0x28000D)) /*線路狀態寄存器的地址,只讀*/
#define TLAMSR (*(volatile int *)(0x28000E)) /*MODEM狀態寄存器的地址,只讀*/
#define TLASPR (*(volatile int *)(0x28000F)) /*暫存寄存器的地址,讀寫*/
#define TLADLL (*(volatile int *)(0x280008))
#define TLADLH (*(volatile int *)(0x280009))
#define TLAEFR (*(volatile int *)(0x28000A))
#define TLAXON1 (*(volatile int *)(0x28000C))
#define TLAXON2 (*(volatile int *)(0x28000D))
#define TLAXOFF1 (*(volatile int *)(0x28000E))
#define TLAXOFF2 (*(volatile int *)(0x28000F))
#define TLATCR (*(volatile int *)(0x28000E))
#define TLATLR (*(volatile int *)(0x28000F))
#define TLAFIFO (*(volatile int *)(0x28000F))
/**********************************************************************/
/* Register definiton for B path */
/**********************************************************************/
#define TLBRHR (*(volatile int *)(0x280010)) /*接收保持寄存器的地址,只讀*/
#define TLBTHR (*(volatile int *)(0x280010)) /*發送保持寄存器的地址,只寫*/
#define TLBIER (*(volatile int *)(0x280011)) /*中斷使能寄存器的地址,讀寫*/
#define TLBIIR (*(volatile int *)(0x280012)) /*中斷標志寄存器的地址,只讀*/
#define TLBFCR (*(volatile int *)(0x280012)) /*FIFO控制寄存器的地址,只寫*/
#define TLBLCR (*(volatile int *)(0x280013)) /*線路控制寄存器的地址,讀寫*/
#define TLBMCR (*(volatile int *)(0x280014)) /*MODEM控制寄存器的地址,讀寫*/
#define TLBLSR (*(volatile int *)(0x280015)) /*線路狀態寄存器的地址,只讀*/
#define TLBMSR (*(volatile int *)(0x280016)) /*MODEM狀態寄存器的地址,只讀*/
#define TLBSPR (*(volatile int *)(0x280017)) /*暫存寄存器的地址,讀寫*/
#define TLBDLL (*(volatile int *)(0x280010))
#define TLBDLH (*(volatile int *)(0x280011))
#define TLBEFR (*(volatile int *)(0x280012))
#define TLBXON1 (*(volatile int *)(0x280014))
#define TLBXON2 (*(volatile int *)(0x280015))
#define TLBXOFF1 (*(volatile int *)(0x280016))
#define TLBXOFF2 (*(volatile int *)(0x280017))
#define TLBTCR (*(volatile int *)(0x280016))
#define TLBTLR (*(volatile int *)(0x0x280017))
#define TLBFIFO (*(volatile int *)(0x280017))
/*********************************************************************************
*外部設備寄存器及地址 *
*********************************************************************************
*1、外部UART的寄存器,及寄存器內容
**TL16C752B寄存器地址說明:
*UART的寄存器在IO空間的地址讀說明*/
#define rhr 0x0000 /*接收保持寄存器的地址,只讀*/
#define thr 0x0000 /*發送保持寄存器的地址,只寫*/
#define ier 0x0001 /*中斷使能寄存器的地址,讀寫*/
#define iir 0x0002 /*中斷標志寄存器的地址,只讀*/
#define fcr 0x0002 /*FIFO控制寄存器的地址,只寫*/
#define lcr 0x0003 /*線路控制寄存器的地址,讀寫*/
#define mcr 0x0004 /*MODEM控制寄存器的地址,讀寫*/
#define lsr 0x0005 /*線路狀態寄存器的地址,只讀*/
#define msr 0x0006 /*MODEM狀態寄存器的地址,只讀*/
#define spr 0x0007 /*暫存寄存器的地址,讀寫*/
/*復合尋址寄存器地址說明*/
#define dll 0x0000 /*低位除數寄存器的地址,讀寫*/
#define dlh 0x0001 /*高位除數寄存器的地址,讀寫*/
#define efr 0x0002 /*增強功能寄存器的地址,讀寫*/
#define xon1 0x0004
#define xon2 0x0005
#define xoff1 0x0006
#define xoff2 0x0007
#define tcr 0x0006 /*傳送寄存器*/
#define tlr 0x0007 /*觸發水平寄存器*/
#define frd 0x0007 /*FIFO準備好寄存器*/
/*UART通路地址*/
#define chanel_a 0x280008 /*A通路*/
#define chanel_b 0x280010 /*B通路*/
/*UART參數的設置*/
/*波特率設置*/
/*----Baud rate and divisor table:(input clok is 30.72MHz)----------*/
/*------------------TLDLH-------TLDLL-------------------\
B 1200 0x06 0x20
a 1800 0x04 0x2E
u 2400 0x03 0x20
d 3600 0x02 0x12
r 4800 0x01 0x90
a 7200 0x01 0x0E
t 9600 0x00 0xC8
e 19200 0x00 0x64
---------------------------------------------------------*/
#define UARTBAUD1200 0x0620
#define UARTBAUD4800 0x0190
#define UARTBAUD2400 0x0320
#define UARTBAUD9600 0x00C8
#define UARTBAUD19200 0x0064
#define UARTBAUD38400 0x0032
/*數據格式設置*/
#define data_w5 0x0000 /*數據長度為5*/
#define data_w6 0x0001 /*數據長度為6*/
#define data_w7 0x0002 /*數據長度為7*/
#define data_w8 0x0003 /*數據長度為8*/
#define data_s1 0x0000 /*數據停止位為1*/
#define data_s2 0x0004 /*數據停止位為1個半(數據長度為5)或2個*/
#define data_p 0x0008 /*設置較驗位*/
#define data_po 0x0008 /*設置奇較驗*/
#define data_pe 0x0018 /*設置偶較驗*/
#define data_parity 0x0020 /*設置較驗位*/
#define data_break 0x0040 /*設置當發送終止時,輸出為低*/
#define uart_parity data_p + data_pe
/*FIFO設置*/
#define fifo_disable 0x0000 /*禁止fifo*/
#define fifo_enable 0x0001 /*使能fifo*/
#define fifo_rreset 0x0002 /*復位接收fifo*/
#define fifo_xreset 0x0004 /*復位發送fifo*/
#define fifo_dma 0x0008 /*設置DMA方式*/
#define fifo_txdip8 0x0000 /*fifo深度為8個*/
#define fifo_txdip16 0x0010 /*fifo深度為16個*/
#define fifo_txdip32 0x0020 /*fifo深度為32個*/
#define fifo_txdip56 0x0030 /*fifo深度為56個*/
#define fifo_rxdip8 0x0000 /*fifo深度為8個*/
#define fifo_rxdip16 0x0040 /*fifo深度為16個*/
#define fifo_rxdip32 0x0080 /*fifo深度為56個*/
#define fifo_rxdip56 0x00b0 /*fifo深度為60個*/
#define UartLoop 0x0010 /*設置自閉環方式*/
#define UartLoop_NO 0x0000 /* 取消自閉環方式*/
/*UART中斷設置*/
#define uartint_rhr 0x0001 /*設置接收中斷*/
#define uartint_thr 0x0002 /*設置發送中斷*/
#define uartint_rls 0x0004 /*設置接收狀態中斷*/
#define uartint_msr 0x0008 /*設置MODEM狀態中斷*/
#define uart_sleep 0x0010 /*設置接收中斷*/
#define uartint_xoff 0x0020 /*設置xoff中斷*/
#define uartint_rts 0x0040 /*設置rts中斷*/
#define uartint_cts 0x0080 /*設置cts中斷*/
#define uart_enable 0x0008 /*使能UART中斷*/
#define uart_disable 0x0000 /*關閉UART中斷*/
/********************************************************************************/
/* 函數聲明 */
/********************************************************************************/
/******************************************************************************/
/* delay() - 延時一段時間 */
/* */
/* 參數: */
/* 無 */
/* */
/* 返回值: 無 */
/* */
/******************************************************************************/
void delay(void);
/******************************************************************************/
/* uart_open() - 打開相應的異步串口,獲得有效的句柄 */
/* */
/* 參數: */
/* uart:選擇要打開的異步串口 */
/* */
/* 返回值: 對應的有效句柄 */
/* 當返回值為0xFFFF時,為無效句柄 */
/* */
/******************************************************************************/
HANDLE uart_open(UartId uart);
/********************************************************************************/
/* */
/* 函數定義:uint _uart_write_reg(uint channel, uint reg,uint regdata) */
/* 功 能:串口初始化 */
/* */
/* 入口參數:A ---- channel:串口A或是串口B */
/* (SP+n) ---- 寄存器reg,如果是.far_mode模式則n為2,否則n為1 */
/* ---- 要寫入的數據regdata */
/* 出口參數:A ---- 讀回寄存器數據 */
/* 資源使用:AR0,B */
/* */
/********************************************************************************/
unsigned int uart_write_reg(HANDLE channel,unsigned int reg,unsigned int regdata);
/********************************************************************************/
/* */
/* 函數定義:uint _uart_read_reg(uint channel, uint reg) */
/* 功 能:串口初始化 */
/* */
/* 入口參數:A ---- channel:串口A或是串口B */
/* (SP+n) ---- 寄存器reg,如果是.far_mode模式則n為2,否則n為1 */
/* 出口參數:A ---- 讀回寄存器數據 */
/* 資源使用:AR0 */
/* */
/********************************************************************************/
unsigned int uart_read_reg(HANDLE channel, unsigned int reg);
/******************************************************************************/
/* uart_recive() - 串口接收,并設置相應的寄存器默認值 */
/* */
/* 參數: */
/* Channel: 有效的串口句柄 */
/* ReadLongth: 每次從緩沖區讀取的長度 */
/* rec_data: 緩沖區的首址 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
unsigned int uart_receive_single(HANDLE Channel);
/******************************************************************************/
/* uart_send_sigle() - 串口發送一個數據,并設置相應的寄存器默認值 */
/* */
/* 參數: */
/* Channel:有效的串口句柄 */
/* send_data: 要發送的數據 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
void uart_send_sigle(HANDLE Channel,unsigned int send_data);
/******************************************************************************/
/* uart_send() - 串口發送,并設置相應的寄存器默認值 */
/* */
/* 參數: */
/* Channel:有效的串口句柄 */
/* longth: 緩沖區的長度 */
/* send_data: 緩沖區的首址 */
/* */
/* 返回值 */
/* */
/******************************************************************************/
void uart_send(HANDLE Channel,unsigned int longth,unsigned int *send_data);
/******************************************************************************/
/* uart_setup() - 設置串口通訊的狀態
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -