📄 sci.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 + -