⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc16is752.c

📁 sc16is752的底层驱动源程序! 包括所有的!
💻 C
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************
**                         TunnelerLamperEXcom                                **
**                         Device: SC16IS725                                  **
**                         Handson <2008.07.15>                               **
*******************************************************************************/
#include "def.h"									// 类型定义文件
#include "config.h"									// 配置头文件
#include "at24c02.h"								// at24c02驱动程序头文件
#include "sc16is752.h"
#include "uart0.h"									// uart0通讯程序头文件

#define uartSC16IS752A_rbuf_size		   512					// ChannelA接收缓冲区长度
#define uartSC16IS752A_tbuf_size		   256					// ChannelA发送缓冲区长度
#define uartSC16IS752B_rbuf_size		   512					// ChannelB接收缓冲区长度
#define uartSC16IS752B_tbuf_size		   256					// ChannelB发送缓冲区长度
// *** 全局变量定义 ***
//CHANEL A
volatile uchar uartSC16IS752A_rbuf[uartSC16IS752A_rbuf_size];	// ChannelA接收缓冲区(循环队列)
volatile uint  uartSC16IS752A_sptr;								// ChannelA接收缓冲区当前帧起始指针
volatile uint  uartSC16IS752A_rptr;								// ChannelA接收缓冲区读指针
volatile uint  uartSC16IS752A_wptr;								// ChannelA接收缓冲区写指针

volatile uint  uartSC16IS752A_head;								// uart0帧位置计数
volatile uint  uartSC16IS752A_flag;								// uart0帧接收标志
volatile uint  uartSC16IS752A_leng;								// uart0帧数据长度
volatile uint  uartSC16IS752A_aval;								// uart0帧有效标记
volatile uchar uartSC16IS752A_cksm;								// uart0帧总校验和
volatile uint  uartSC16IS752A_over;								// uart0超时计数器


volatile uchar uartSC16IS752A_tbuf[uartSC16IS752A_tbuf_size];	// uart0发送缓冲区(单队列)
volatile uint  uartSC16IS752A_tptr;								// uart0发送缓冲区读写指针
volatile uint  uartSC16IS752A_tlen;								// uart0发送数据长度
volatile uint  uartSC16IS752A_tsdy;								// uart0开始发送延时
volatile uint  uartSC16IS752A_tddy;								// uart0结束发送延时


volatile uchar uartSC16IS752A_ack_buff[256];					// 应答缓冲区
volatile uchar uartSC16IS752A_type;								// 第二设备种类
volatile uchar uartSC16IS752A_addr;								// 第二设备地址
volatile uchar uartSC16IS752A_cmmd;								// 命令码

volatile uint  uartSC16IS752A_prcy;								// 前一次通讯周期
volatile uchar uartSC16IS752A_cycl;								// 当前通讯周期

//CHANEL B
volatile uchar uartSC16IS752B_rbuf[uartSC16IS752A_rbuf_size];	// uart0接收缓冲区(循环队列)
volatile uint  uartSC16IS752B_sptr;								// uart0接收缓冲区当前帧起始指针
volatile uint  uartSC16IS752B_rptr;								// uart0接收缓冲区读指针
volatile uint  uartSC16IS752B_wptr;								// uart0接收缓冲区写指针

volatile uint  uartSC16IS752B_head;								// uart0帧位置计数
volatile uint  uartSC16IS752B_flag;								// uart0帧接收标志
volatile uint  uartSC16IS752B_leng;								// uart0帧数据长度
volatile uint  uartSC16IS752B_aval;								// uart0帧有效标记
volatile uchar uartSC16IS752B_cksm;								// uart0帧总校验和
volatile uint  uartSC16IS752B_over;								// uart0超时计数器


volatile uchar uartSC16IS752B_tbuf[uartSC16IS752A_tbuf_size];	// uart0发送缓冲区(单队列)
volatile uint  uartSC16IS752B_tptr;								// uart0发送缓冲区读写指针
volatile uint  uartSC16IS752B_tlen;								// uart0发送数据长度
volatile uint  uartSC16IS752B_tsdy;								// uart0开始发送延时
volatile uint  uartSC16IS752B_tddy;								// uart0结束发送延时


volatile uchar uartSC16IS752B_ack_buff[256];					// 应答缓冲区
volatile uchar uartSC16IS752B_type;								// 第二设备种类
volatile uchar uartSC16IS752B_addr;								// 第二设备地址
volatile uchar uartSC16IS752B_cmmd;								// 命令码

volatile uint  uartSC16IS752B_prcy;								// 前一次通讯周期
volatile uchar uartSC16IS752B_cycl;								// 当前通讯周期


//***********************************************************************************


void __irq IRQ_Eint3_COM34(void);
void WriteRegister(uchar Reg,uchar channel,uchar Value);
void ReadRegister(uchar Reg,uchar channel,uchar *RegValue);
void ReadData(uchar Reg,uchar channel,uchar *Value,uchar num);
void WriteData(uchar Reg,uchar channel,uchar *Value,uchar num);
uchar ISendByte(uchar sla,uchar c);
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar ISendStrExt(uchar sla,uchar *s,uchar no);
//uchar IRcvByte(uchar sla,uchar *c);
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
uchar IRcvStrExt(uchar sla,uchar *s,uchar no);
void Init_SC16IS752(void);
void RecvChannelA(void);
void RecvChannelB(void);
//**************************************************************************
void uartSC16IS752A_send_nack (void);
void uartSC16IS752A_ack (void);
void uartSC16IS752A_send (uint data_leng);
void uartSC16IS752A_sendst (void);
void uartSC16IS752A_SendToDrivers (uchar iport);
void Nint_SC16IS752A (uchar iport);

void uartSC16IS752B_send (uint data_leng);
void uartSC16IS752B_sendst (void);
void uartSC16IS752B_SendToDrivers (uchar iport);
//void testSend(void);//jumpingtest
/****************************************************************************
* 名称:Init_SC16IS752()
* 功能:SC16IS75X初始化。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Init_SC16IS752(void)
{
	IO0CLR = isDRE0|isDRE1;									// isDRE0=1-485发送/0-485收/ isDRE1=1-485发送/0-485收
	//*******************************
	uartSC16IS752A_sptr = 0x00;							// 复位uart0接收缓冲区当前帧起始指针
	uartSC16IS752A_rptr = 0x00;							// 复位uart0接收缓冲区读指针
	uartSC16IS752A_wptr = 0x00;							// 复位uart0接收缓冲区写指针

	uartSC16IS752A_head = 0x00;							// 复位uart0帧位置计数
	uartSC16IS752A_flag = 0x00;							// 复位uart0帧接收标志
	uartSC16IS752A_leng = 0x00;							// 复位uart0帧数据长度
	uartSC16IS752A_aval = 0x01;							// 复位uart0帧有效标记(有效)
	uartSC16IS752A_cksm = 0x00;							// 复位uart0帧校验和
	uartSC16IS752A_over =  100;							// 置uart0超时计数器初值: 50*1mS = 50mS

	uartSC16IS752A_tptr = 0x00;							// 复位uart0发送缓冲区读写指针
	uartSC16IS752A_tlen = 0x00;							// 复位uart0发送数据长度
	uartSC16IS752A_tsdy = 0;							// 复位uart0开始发送延时
	uartSC16IS752A_tddy = 0;							// 复位uart0结束发送延时
	//*******************************
	uartSC16IS752B_sptr = 0x00;							// 复位uart0接收缓冲区当前帧起始指针
	uartSC16IS752B_rptr = 0x00;							// 复位uart0接收缓冲区读指针
	uartSC16IS752B_wptr = 0x00;							// 复位uart0接收缓冲区写指针

	uartSC16IS752B_head = 0x00;							// 复位uart0帧位置计数
	uartSC16IS752B_flag = 0x00;							// 复位uart0帧接收标志
	uartSC16IS752B_leng = 0x00;							// 复位uart0帧数据长度
	uartSC16IS752B_aval = 0x01;							// 复位uart0帧有效标记(有效)
	uartSC16IS752B_cksm = 0x00;							// 复位uart0帧校验和
	uartSC16IS752B_over =  100;							// 置uart0超时计数器初值: 50*1mS = 50mS

	uartSC16IS752B_tptr = 0x00;							// 复位uart0发送缓冲区读写指针
	uartSC16IS752B_tlen = 0x00;							// 复位uart0发送数据长度
	uartSC16IS752B_tsdy = 0;							// 复位uart0开始发送延时
	uartSC16IS752B_tddy = 0;							// 复位uart0结束发送延时
	
	//*****ChannelA
	//set the Baudrate 
	WriteRegister(LCR,ChannelA,0x80);//bit7 enable
	WriteRegister(DLL,ChannelA,SC16_BAUD_4800_DLL);//9600bps
	WriteRegister(DLH,ChannelA,SC16_BAUD_4800_DLH);
	WriteRegister(LCR,ChannelA,0x03);		//8 bit,no parity,1 stop bits
	WriteRegister(FCR,ChannelA,0x06);		//reset FIFO
	WriteRegister(FCR,ChannelA,0x00);		//disable  FIFO	
	WriteRegister(IER,ChannelA,0x00); 		//enable RX/TX Interrupt
	
	//*****ChannelB
	//set the Baudrate
	WriteRegister(LCR,ChannelB,0x80);//bit7 enable
	WriteRegister(DLL,ChannelB,SC16_BAUD_4800_DLL);//9600bps
	WriteRegister(DLH,ChannelB,SC16_BAUD_4800_DLH);
	WriteRegister(LCR,ChannelB,0x03);		//8 bit,no parity,1 stop bits
	WriteRegister(FCR,ChannelB,0x06);		//reset FIFO
	WriteRegister(FCR,ChannelB,0x00);		//disable  FIFO	
	WriteRegister(IER,ChannelB,0x00); 		//enable RX/TX Interrupt
	

}
/****************************************************************************
* 名称:IRQ_Eint3_COM34()
* 功能:外部中断EINT3服务函数,SC16IS75X中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void    __irq IRQ_Eint3_COM34(void)
{  
	uchar temp,i;

	//ChannelA***************************************************************
	//ReadRegister(LSR,ChannelA,&temp);	//
	ReadRegister(IIR,ChannelA,&temp);	//
	if(!(temp&0X01))
	{
			
		switch(temp&0X3F)
		{

			case 0x06 ://接收器线状态错误
						break;
			case 0x0c ://接收器超时中断
						ReadRegister(RHR,ChannelA,&temp); // 读中断标志
						WriteRegister(FCR,ChannelA, 0X02);//Reset the RX FiFo
						break;
			case 0x04 ://RHR中断
						RecvChannelA();
						break;
			case 0x02 ://THR中断
						if (uartSC16IS752A_tlen!=0)							// 未发完
						{
							//uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
							WriteRegister(THR,ChannelA, uartSC16IS752A_tbuf[ uartSC16IS752A_tptr]); 	//发送数据
							uartSC16IS752A_tptr++;							// 缓冲区指针加1
							uartSC16IS752A_tlen--;							// 长度减1
						}
						else												// 发送完
						{
							//U0IER = 0x01;									// 关发送中断
							WriteRegister(IER,ChannelA,0X01);				// 关发送中断
							uartSC16IS752A_tptr = 0;						// 复位缓冲区指针
							uartSC16IS752A_tddy = 2;						// 置结束发送延时2mS
						}
						/*					
						//test
						WriteRegister(IER,ChannelA,0X01);				// 关发送中断					
						for (i=0; (i<15) && (uartSC16IS752A_tlen>0); i++)
						{
							WriteRegister(THR,ChannelA, uartSC16IS752A_tbuf[ uartSC16IS752A_tptr]); 	//发送数据
							uartSC16IS752A_tptr++;							// 缓冲区指针加1
							uartSC16IS752A_tlen--;							// 长度减1
						}
						uartSC16IS752A_tptr = 0;						// 复位缓冲区指针
						uartSC16IS752A_tddy = 2;						// 置结束发送延时2mS
						*/
						break;
			case 0x00 ://Modem中断
						break;
			case 0x30 ://输入脚状态变化
						break;
			case 0x10 ://接收的Xoff信号/特殊字符
						break;
			case 0x20 ://CTS\RTS 状态变化
						break;
			default :break;
		}
	}
	
	//ChannelB***************************************************************
	//ReadRegister(LSR,ChannelB,&temp);	//
	ReadRegister(IIR,ChannelB,&temp);	//
	if(!(temp&0X01))
	{
		switch(temp&0X3F)
		{
			case 0x06 ://接收器线状态错误
						break;
			case 0x0c ://接收器超时中断
						ReadRegister(RHR,ChannelB,&temp); // 读中断标志
						WriteRegister(FCR,ChannelB, 0X02);//Reset the RX FiFo
						break;
			case 0x04 ://RHR中断
						RecvChannelB();
						break;
			case 0x02 ://THR中断
			/*
						if (uartSC16IS752B_tlen!=0)							// 未发完
						{
							WriteRegister(THR,ChannelB, uartSC16IS752B_tbuf[ uartSC16IS752B_tptr]); 	//发送数据
							uartSC16IS752B_tptr++;							// 缓冲区指针加1
							uartSC16IS752B_tlen--;							// 长度减1
						}
						else												// 发送完
						{
							//U0IER = 0x01;									// 关发送中断
							WriteRegister(IER,ChannelB,0X01);				// 关发送中断
							uartSC16IS752B_tptr = 0;						// 复位缓冲区指针
							uartSC16IS752B_tddy = 2;						// 置结束发送延时2mS
						}*/
	//test
	WriteRegister(IER,ChannelB,0X01);				// 关发送中断					
	for (i=0; (i<15) && (uartSC16IS752B_tlen>0); i++)
	{
		WriteRegister(THR,ChannelB, uartSC16IS752B_tbuf[ uartSC16IS752B_tptr]); 	//发送数据
		uartSC16IS752B_tptr++;							// 缓冲区指针加1
		uartSC16IS752B_tlen--;							// 长度减1
	}
	uartSC16IS752B_tptr = 0;						// 复位缓冲区指针
	uartSC16IS752B_tddy = 2;						// 置结束发送延时2mS
							
						break;
			case 0x00 ://Modem中断
						break;
			case 0x30 ://输入脚状态变化
						break;
			case 0x10 ://接收的Xoff信号/特殊字符
						break;
			case 0x20 ://CTS\RTS 状态变化
						break;
			default :break;
		}
	}
	
	

   EXTINT = 0x08;						// 清除EINT1中断标志
   VICVectAddr = 0;						// 向量中断结束
}
/****************************************************************************
* 名称:RecvChannelA()
* 功能:外部中断EINT3。
* 入口参数:无
* 1.
****************************************************************************/
void RecvChannelA(void)
{
	uchar ch;
//	uchar i;
//	uchar getval[12];
	
	ReadRegister(RHR,ChannelA,&ch); 	//读取数据	
	if (uartSC16IS752A_over==0)			// 超时Xms
	{
		uartSC16IS752A_head = 0;						// 重新开始接收数据
		uartSC16IS752A_wptr = uartSC16IS752A_sptr;		// 接收缓冲区写指针返回
		uartSC16IS752A_cksm = 0;						// 复位校验和
		uartSC16IS752A_aval = 1;						// 当前帧有效
	}

	
	if (uartSC16IS752A_aval==1)								// 数据有效
	{
		uartSC16IS752A_cksm += ch;							// 计算校验和
		uartSC16IS752A_rbuf[uartSC16IS752A_wptr] = ch;		// 保存数据
		if (++uartSC16IS752A_wptr==uartSC16IS752A_rbuf_size) uartSC16IS752A_wptr = 0;	// 循环缓冲区写指针加1
		if (uartSC16IS752A_wptr==uartSC16IS752A_rptr) uartSC16IS752A_aval = 0;			// 数据覆盖, 当前帧无效
	}

	
	uartSC16IS752A_over = 100;								// 置超时时间初值: 50*1mS = 50mS
	uartSC16IS752A_head++;									// 通讯格式计数加1


	switch (uartSC16IS752A_head)
	{
		//01——0XF5		
		case 0x01:											// 数据帧第1字节
		{
			if (ch!=frame_hed1)								// 第1字节不为0xF5则丢弃
			{
				uartSC16IS752A_head = 0;					// 重新开始接收数据
				uartSC16IS752A_wptr = uartSC16IS752A_sptr;	// 接收缓冲区写指针返回
				uartSC16IS752A_cksm = 0;					// 复位校验和
				uartSC16IS752A_aval = 1;					// 当前帧有效
			}
			break;											// 退出case
		}
		//02——0X89
		case 0x02:											// 数据帧第2字节
		{
			if (ch!=frame_hed2)								// 第2字节不为0x89则丢弃
			{
				uartSC16IS752A_head = 0;					// 重新开始接收数据
				uartSC16IS752A_wptr = uartSC16IS752A_sptr;		// 接收缓冲区写指针返回
				uartSC16IS752A_cksm = 0;					// 复位校验和
				uartSC16IS752A_aval = 1;					// 当前帧有效
			}

			if (ch==frame_hed1)								// 该字节为数据帧第1字节
			{
				uartSC16IS752A_cksm += ch;					// 计算校验和
				uartSC16IS752A_rbuf[uartSC16IS752A_wptr] = ch;						// 保存数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -