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

📄 sci.c

📁 用Freescale的8位单片机做的RS232-CAN的通讯转换板.包含固件程序,原理图,PCB图和一个说明文件.
💻 C
字号:
#include "sci.h"
#include "mc68hc908gz32.h"
#include "main.h"
#include "time.h"



//协议  LEN DAT0 DAT1.......DAT(n) CRC
//   LEN = n + 1;
//   CRC = LEN + DAT0 + DAT1 + ....+ DAT(n)
//   Example : 03 23 23 10 59 
//	 Example : 00 00	//空数据包 特殊用途

volatile SCISTATESTR _SCISTATE;				//状态

unsigned char cSCIRecBuf[SCIMAXLENGTH];	//接收缓冲区,收到的数据会存在这里
unsigned char cSCIRecLen;				//接收到的数据长度
unsigned char cSCITraBuf[SCIMAXLENGTH];	//发送缓冲区,把要发送的数据存在这里
unsigned char cSCITraLen;				//需要传输的数据长度
unsigned char cSCITimer;
unsigned char startpos;
unsigned char cSCIRecTemp[SCIMAXLENGTH];//接收中断用缓冲区

extern __interrupt void SCIErrisr(void);
extern __interrupt void SCIRecisr(void);
extern __interrupt void SCITraisr(void);

//           Frequency of the SCI clock sourcer 
//	Band = -------------------------------------
//          64 * BPD * BD * (PD + PDFA)
//

void InitSCI(void)
{
	__RESET_WATCHDOG(); /* kicks the dog */
	cSCITraLen = 0;
	
					//  7     6     5     4     3     2    1     0
	SCPSC = 0x00;	//PDS2  PDS1  PDS0  PSSB4 PSSB3 PSSB2 PSSB1 PSSB0
	
	SCC1 = 0x044;	//Loops ENSCI TXINV   M   WAKE  ILTY  PEN   PTY
					//  0     1     0     0     0     1    0     0	  
	SCC2 = 0x02C;	//SCTIE TCIE  SCRIE ILIE  TE    RE    RWU   SBK
		            //  0     0     1     0    1      1    0     0  
	SCC3 = 0x00F;	//R8    T8    R     R     ORIE  NEIE  FEIE  PEIE
                    //  0    0     0     0     1      1     1     1
	SCBR = 0x030;	//LINT  LINR  SCP1  SCP0  R     SCR2  SCR1  SCR0
					//   9600pbs
	cSCITimer = 0;
	startpos = 0;
	SetTimer(Timer1,0);
}

void Timer1(void)		//主时钟信号 t = 10ms 
{
	unsigned char i;
	if(cSCITimer > 2)
	{
		LED1 = 0;
		if(startpos)
		{
			startpos = 0;
			SCIState_RecOverTime = 1;		//数据超时
		}
	}
	else
	{
		cSCITimer++;
	}
} 

__interrupt void SCIRecisr(void)
{
	static unsigned char len;			//接收数据的长度
	static unsigned char crc;			//校验和
	unsigned char i;
	unsigned char temp;
	
	temp = SCS1;

	cSCITimer = 0;
	
	if(0 == startpos)		//第一个数据
	{
		LED1 = 1;
		len = SCDR;
		if(len < 3)
			return;
		if(len > SCIMAXLENGTH + 2)
		{
			SCIState_RecError = 1;
			startpos = 0;
			return;
		}
		else
		{
			crc = len;
			startpos++;
			return;
		}
	}
	
	if( startpos >= len - 1)		//数据接收完成
	{
		if(crc == SCDR)
		{
			if(SCIState_RecFull)	//发生数据
			{
				SCIState_RecOver = 1;	//数据溢出
			}
			else						//正确收到一个数据包
			{
				for(i = 0; i < len - 2; i++)
				{
					cSCIRecBuf[i] = cSCIRecTemp[i];
				}
			}
			SCIState_RecFull = 1;
			cSCIRecLen = len - 2;
			LED1 = 0;
			startpos = 0;
		}
		else
		{
			SCIState_RecCRC = 1;	//数据校验错误
			startpos = 0;
		}
	}
	
	else						//在接收数据
	{
		temp = SCDR;
		cSCIRecTemp[startpos - 1] = temp;
		crc += temp;
		startpos++;
		return;
	}

}

__interrupt void SCITraisr(void)
{
	static unsigned char uSendedNum = 0;		//已经发送了的数据
	static unsigned char crc = 0;
	static unsigned char temp;
	
	if(uSendedNum == 0)
	{
		LED2 = 1;
		temp = SCS1;
		temp = cSCITraLen + 2;
		SCDR = temp;
		crc = temp ;
		uSendedNum++;
		return;
	}
	
	if(uSendedNum <= cSCITraLen )	//发送数据
	{
		temp = SCS1;
		temp = cSCITraBuf[uSendedNum - 1];
		SCDR = temp;
		crc += temp;
		uSendedNum++;
		return;
	}
	else	//发送校验
	{
		temp = SCS1;
		SCDR = crc;
		cSCITraLen = 0;
		uSendedNum = 0;
		crc = 0;
		SCC2_SCTIE = 0;	//禁中断
		LED2 = 0;
		SCIState_TranEmpty = 1;
		return;		
	}
}

__interrupt void SCIErrisr(void)
{
	
}

void SCISendMsg(char *pMsg,char nLen)	//发送消息
{
	char i;
	while(SCIState_TranEmpty);
	for(i = 0; i < nLen; i++)
	{
		cSCITraBuf[i] = pMsg[i];
	}

	SCIState_TranEmpty = 0;
	SCC2_SCTIE = 1;		//置发送标志,开始发送数据
}

⌨️ 快捷键说明

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