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

📄 st16c2552.c

📁 TIDSP2407的CAN总线例程
💻 C
字号:
#include <main.h>
#include "ex.h"
//-----------------------------------------------------------------------------
// A15=1,A14=0
// A0---A0
// A1---A1
// A2---A2
// A3---CHSL(1=LCD,0=PROFIBUS)
// IOPA3---RESET
#define ST16_RESET	PADATDIR |= 0x0808
#define ST16_WORK	PADATDIR &= ~0x08
ioport U16 port8008;
ioport U16 port8009;
ioport U16 port800a;
ioport U16 port800b;
ioport U16 port800c;
ioport U16 port800d;
ioport U16 port800e;
ioport U16 port800f;
ioport U16 port8000;
ioport U16 port8001;
ioport U16 port8002;
ioport U16 port8003;
ioport U16 port8004;
ioport U16 port8005;
ioport U16 port8006;
ioport U16 port8007;
//-----------------------------------------------------------------------------
#define ST16_LCD_RHR_THR	port8008
#define ST16_LCD_IER		port8009
#define ST16_LCD_FCR_ISR	port800a
#define ST16_LCD_LCR		port800b
#define ST16_LCD_MCR		port800c
#define ST16_LCD_LSR		port800d
#define ST16_LCD_MSR		port800e
#define ST16_LCD_SPR		port800f
#define ST16_LCD_DLL		port8008
#define ST16_LCD_DLM		port8009
#define ST16_PRO_RHR_THR	port8000
#define ST16_PRO_IER		port8001
#define ST16_PRO_FCR_ISR	port8002
#define ST16_PRO_LCR		port8003
#define ST16_PRO_MCR		port8004
#define ST16_PRO_LSR		port8005
#define ST16_PRO_MSR		port8006
#define ST16_PRO_SPR		port8007
#define ST16_PRO_DLL		port8000
#define ST16_PRO_DLM		port8001
//-----------------------------------------------------------------------------
/*
+------------------------------------------------------------------------------+
	函 数 名  	: st16_init()
	功能描述	: st16c2552的初始化
	函数原形	: void st16_init()
	参数说明	: 
	支持资源	: 
	作    者	: 桂林
	最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_init()//375k-8-N-1
{
	ST16_WORK;
	ST16_RESET;delay_ms(1);
	ST16_WORK;
	
	ST16_LCD_IER 		= 0x01;
	ST16_LCD_FCR_ISR 	= 0x0f;
	delay_ms(1);
	ST16_LCD_FCR_ISR 	= 0x09;
	ST16_LCD_LCR		= 0x83;
	
	ST16_LCD_DLL		= 0x04;	ST16_LCD_DLM		= 0x00;//0x0004=375k
	//ST16_LCD_DLL		= 0x0d;	ST16_LCD_DLM		= 0x00;//0x000d=115.2k
	
	ST16_LCD_DLM		= 0x00;
	ST16_LCD_LCR		= 0x03;

	ST16_PRO_IER 		= 0x01;
	ST16_PRO_FCR_ISR 	= 0x0f;
	delay_ms(1);
	ST16_LCD_FCR_ISR 	= 0x09;
	ST16_PRO_LCR		= 0x83;
	ST16_PRO_DLL		= 0x04;//0x04=375k
	ST16_PRO_DLM		= 0x00;
	ST16_PRO_LCR		= 0x03;
	
	XINT1CR				= 0x05;
	XINT2CR				= 0x05;
}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: st16_lcd_tx()
	功能描述	: st16_lcd_tx向LCD发送数据
	函数原形	: void st16_lcd_tx(U16 len,U16 *p)
	参数说明	: len=数据长度;*p数据指针(低8位有效)
	支持资源	: len + d1...dn + CRC
	作    者	: 桂林
	最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_lcd_tx(U16 len,U16 *p)
{
	U16 tempi=0,crc=0;
	
	while((ST16_LCD_LSR & 0x20)==0);
	ST16_LCD_RHR_THR = len;
	for(tempi=0;tempi<len;tempi++)
	{
		while((ST16_LCD_LSR & 0x20)==0);
		ST16_LCD_RHR_THR = *p;
		crc += *p++;
	};
	while((ST16_LCD_LSR & 0x20)==0);
	ST16_LCD_RHR_THR = crc;
}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: st16_pro_tx()
	功能描述	: st16_pro_tx向PROFIBUS发送数据
	函数原形	: void st16_pro_tx(U16 len,U16 *p)
	参数说明	: len=数据长度;*p数据指针(低8位有效)
	支持资源	: len + d1...dn + CRC(低8位有效)
	作    者	: 桂林
	最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
void st16_pro_tx(U16 len,U16 *p)
{
	U16 tempi=0,crc=0;
	
	while((ST16_PRO_LSR & 0x20)==0);
	ST16_PRO_RHR_THR = len;
	for(tempi=0;tempi<len;tempi++)
	{
		while((ST16_PRO_LSR & 0x20)==0);
		ST16_PRO_RHR_THR = *p;
		crc += *p++;
	};
	while((ST16_PRO_LSR & 0x20)==0);
	ST16_PRO_RHR_THR = crc;
}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: XINT1_ISR()
	功能描述	: XINT1_ISR,ST16_LCD中断处理函数
	函数原形	: interrupt void XINT1_ISR()
	参数说明	: 
	支持资源	: len + d1...dn + CRC
	作    者	: 桂林
	最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
interrupt void XINT1_ISR()
{
//	XINT1CR |= 0x8000;
//	if((ST16_LCD_FCR_ISR & 0x0f)==4)//rx ok
//	{
//		rxbuf[0] = ST16_LCD_RHR_THR;
//		while((ST16_LCD_LSR & 0x20)==0);ST16_LCD_RHR_THR = rxbuf[0]+1;
//	};
//	EnableINT;

//----------------------------------------------------
	static U16 tempi=0,tempcrc=0;
	U16 tempbuf=0;
	
	XINT1CR |= 0x8000;
	if((ST16_LCD_FCR_ISR & 0x0f)==4)//rx ok
	{
		tempbuf = 0x00ff&ST16_LCD_RHR_THR;
		switch(GVAR.GS.LCD)
		{
			case LENGTH:{
							if(tempbuf!=0)
							{
								GVAR.GAB.LCD[0]=tempbuf;
								GVAR.GS.LCD=DATA;
							};
							break;
						};
			case DATA:{
							GVAR.GAB.LCD[1+tempi]=tempbuf;
							tempcrc+=tempbuf;
							if((tempi++)>=GVAR.GAB.LCD[0]) 
								GVAR.GS.LCD=PARITY;
							break;
						};
			case PARITY:{
							GVAR.GS.LCD=LENGTH;
							if((tempcrc&0x00ff)==tempbuf)
								GVAR.GA.LCD_ASK=1;
							break;
						};
			default:{GVAR.GS.LCD=LENGTH;break;};
		};
	};
	EnableINT;
//----------------------------------------------------

}
/*
+------------------------------------------------------------------------------+
	函 数 名  	: XINT2_ISR()
	功能描述	: XINT2_ISR,ST16_PRO中断处理函数
	函数原形	: interrupt void XINT2_ISR()
	参数说明	: 
	支持资源	: len + d1...dn + CRC
	作    者	: 桂林
	最后更改日期: 2003-02-12
+------------------------------------------------------------------------------+
*/
interrupt void XINT2_ISR()
{
//	XINT2CR |= 0x8000;
//	if((ST16_PRO_FCR_ISR & 0x0f)==4)//rx ok
//	{
//		rxbuf[1] = ST16_PRO_RHR_THR;
//		while((ST16_PRO_LSR & 0x20)==0);ST16_PRO_RHR_THR = rxbuf[1]+1;
//	};
//	EnableINT;
//----------------------------------------------------
	static U16 tempi=0,tempcrc=0;
	U16 tempbuf=0;
	
	XINT2CR |= 0x8000;
	if((ST16_PRO_FCR_ISR & 0x0f)==4)//rx ok
	{
		tempbuf = 0x00ff&ST16_PRO_RHR_THR;
		switch(GVAR.GS.PROFIBUS)
		{
			case LENGTH:{
							GVAR.GAB.PROFIBUS[0]=tempbuf;
							GVAR.GS.PROFIBUS=DATA;
							break;
						};
			case DATA:{
							GVAR.GAB.PROFIBUS[1+tempi]=tempbuf;
							tempcrc+=tempbuf;
							if((tempi++)>=GVAR.GAB.PROFIBUS[0]) 
								GVAR.GS.PROFIBUS=PARITY;
							break;
						};
			case PARITY:{
							GVAR.GS.PROFIBUS=LENGTH;
							if((tempcrc&0x00ff)==tempbuf)
								GVAR.GA.PROFIBUS_ASK=1;
							break;
						};
			default:{GVAR.GS.PROFIBUS=LENGTH;break;};
		};
	};
	EnableINT;
//----------------------------------------------------

}


⌨️ 快捷键说明

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