//------------------------------------------------------------------------------
#ifndef AT16C554H
#define AT16C554H
//------------------------------------------------------------------------------
#include "timer.h"
#include "AT78E58BP.H"
#include "System.h"
#include "Asyn_422.H"
#include <intrins.h>
#include <string.h>
//------------------------------------------------------------------------------
// 常量定义
//------------------------------------------------------------------------------
#define PortNumber 4
#define SERIAL_STU_BUSY 0x01 // 串行口忙标志位,1为忙,0为空闲
#define SERIAL_STU_FREE 0x00
//------------------------------------------------------------------------------
// 波特率定义
//------------------------------------------------------------------------------
#define CY18432M
#ifdef CY18432M
#define B50 0x0900 // DLM 为高八位,DLL 为低八位
#define B300 0x0180
#define B600 0x00c0
#define B1200 0x0060
#define B2400 0x0030
#define B4800 0x0018
#define B9600 0x000c
#define B19200 0x0006
#define B38400 0x0003
#define B57600 0x0002
#define B115200 0x0001
#else
#define B200 0x0900 // DLM 为高八位,DLL 为低八位
#define B1200 0x0180
#define B2400 0x00c0
#define B4800 0x0060
#define B9600 0x0030
#define B19200 0x0018
#define B38400 0x000c
#define B76800 0x0006
#define B153600 0x0003
#define B230400 0x0002
#define B460800 0x0001
#endif
//------------------------------------------------------------------------------
// 16C554 内部寄存器定义
//------------------------------------------------------------------------------
#define RHR 0X00 // 接受数据保持寄存器, 只读
#define THR 0X00 // 发送数据保持寄存器, 只写
#define IER 0X01 // 中断允许寄存器, 只写
#define FCR 0X02 // FIFO 控制寄存器, 只写
#define ISR 0X02 // 中断状态寄存器, 只读
#define LCR 0X03 // 线控制寄存器, 只写
#define MCR 0X04 // MODEM 控制寄存器, 只写
#define LSR 0X05 // 线状态寄存器, 只读
#define MSR 0X06 // MODEM 状态寄存器, 只读
#define SPR 0X07 // 中间结果暂存寄存器, 可读写
#define DLL 0X00 // 波特率发生分频因子低八位,LCR bit7 为1, 可读写
#define DLM 0X01 // 波特率发生分频因子高八位,LCR bit7 为1, 可读写
#define FIFO_EN 0X01 // FIFO 使能命令字
#define FIFO_TRI_LEVEL_1 0X00 // FIFO 触发级别为1个字节
#define FIFO_TRI_LEVEL_4 0X40 // FIFO 触发级别为4个字节
#define FIFO_TRI_LEVEL_8 0X80 // FIFO 触发级别为8个字节
#define FIFO_TRI_LEVEL_14 0XC0 // FIFO 触发级别为14个字节
#define FIFO_DMA_MODE 0X08 // FIFO DMA 模式选择命令字
#define FIFO_CLEAR_RCVR 0X02 // 清除接受FIFO 中的内容数据
#define FIFO_CLEAR_XMIT 0X04 // 清除发送FIFO 中的内容数据
#define IER_MODEM_INT 0X08 // MODEM 状态中断屏蔽位
#define IER_RECEIVELINE_INT 0X04 // 接受线状态中断屏蔽位
#define IER_TRANSMITHOLD_INT 0X02 // 发送保持寄存器中断屏蔽位
#define IER_RECEIVEHOLD_INT 0X01 // 接受保持寄存器中断屏蔽位
#define LCR_WORD_LEN5 0X00 // 数据位长度为5
#define LCR_WORD_LEN6 0X01 // 数据位长度为6
#define LCR_WORD_LEN7 0X02 // 数据位长度为7
#define LCR_WORD_LEN8 0X03 // 数据位长度为8
#define LCR_STOP_LEN1 0X00 // 停止位长度为1
#define LCR_STOP_LEN2 0X04 // 停止位长度为2 注意: 当数据位为5时停止位为1.5位
#define LCR_PARITY_EN 0X08 // 校验位使能控制位
#define LCR_PARITY_EVEN 0X10 // EVEN偶校验设置位,默任情况下为奇校验ODD
#define LCR_PARITY_SET 0X20 // 奇偶校验强制设置位
#define LCR_OUT_BREAK 0X40 // TX输出BREAK信号
#define LCR_DIV_EN 0X80 // 允许发送波特率
#define LCR_DIV_Dis 0X00 // 禁止发送波特率
#define MCR_INTX_EN 0X08 // 中断引脚输出允许控制命令字
#define MCR_INTX_Dis 0X00 // 中断引脚输出禁止控制命令字
//------------------------------------------------------------------------------
// 16C554 中断事件定义
//------------------------------------------------------------------------------
#define EVENT_LSR 0X06 // LSR 状态寄存器事件
#define EVENT_LSR_RECEIVE 0X01 // 数据接受保存到保存寄存器或FIFO中
#define EVENT_LSR_OVERRUN 0X02 // 接受移位积存器中的数据发生覆盖错误事件
#define EVENT_LSR_PARITY 0X04 // 接受数据校验错误事件
#define EVENT_LSR_FRAMING 0X08 // 接受数据发生帧错误
#define EVENT_LSR_BREAK 0X10 // 接受到一个BREAK 事件
#define EVENT_LSR_TRANHOLDEMPTY 0X20 // 发送保持寄存器或FIFO 空事件允许装载数据
#define EVENT_LSR_TRANSMITEMPTY 0x40 // 发送器空事件
#define EVENT_LSR_FIFOERROR 0X80 // FIFO 中有错误数据
#define EVENT_RXRDY 0X04 // 数据接受就绪中断事件
#define EVENT_RXRDY_TIMEOUT 0X0C // 接受数据超时中断事件
#define EVENT_TXRDY 0X02 // 数据发送就绪中断事件
#define EVENT_MSR 0X00 // MODEM 状态中断事件
#define FIFO_SIZE 16
//-------------------------------------------------------------------------------------
// 16C554 各端口RAM映射
//-------------------------------------------------------------------------------------
#define STARTADDR_SERIAL1 0X0000 // 串行口通道1起始地址
#define STARTADDR_SERIAL2 0X0008 // 串行口通道2起始地址
#define STARTADDR_SERIAL3 0X0010 // 串行口通道3起始地址
#define STARTADDR_SERIAL4 0X0018 // 串行口通道4起始地址
//-------------------------------------------------------------------------------------
// 其它常量
//-------------------------------------------------------------------------------------
#define Init_16c554_Count 10
#define FREE_RESET 0
#define RESET 1
//-------------------------------------------------------------------------------------
// 多串口相关的数据结构
//-------------------------------------------------------------------------------------
typedef struct st_CommHandle
{
Uint RAMAddress_Map;
Uchar CommReceiveBuffer[CommMaxReceiveBuffer]; //串口接收缓冲区
Uchar CommSendBuffer[CommMaxSendBuffer]; //串口发送缓冲区
Uchar CommReceive_Head; //串口接收缓冲区头指针
Uchar CommReceive_Trail; //串口接收缓冲区尾指针
Uchar CommSend_Head; //串口发送缓冲区头指针
Uchar CommSend_Trail; //串口发送缓冲区尾指针
Uchar Comm_Stu; //串行口发送器忙标志数组
Uchar Comm_Priority; //串行口接受缓冲区数据处理优先级别数组
};//end struct
typedef struct st_CommHandle TCommHandle;
//-------------------------------------------------------------------------------------
// 多串口16C554 驱动程序公用函数
//-------------------------------------------------------------------------------------
extern bool Init_16c554(void);
extern void Port_open(Uchar PortID,Uint Baud);
extern void Port_close(Uchar PortID);
extern int Port_Receive(Uchar PortID,void *Buffer,int Count);
extern int Port_Send(Uchar PortID,void *Buffer,int Count);
//-------------------------------------------------------------------------------------
#endif
//-----