📄 main.c
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ32.h> /* include peripheral declarations */
#include <stdio.h>
#include "system.h"
#include "can.h"
#include "main.h"
#include "sci.h"
#include "time.h"
int nTime;
extern unsigned char cSCIRecBuf[]; //接收缓冲区,收到的数据会存在这里
extern unsigned char cSCITraBuf[]; //发送缓冲区,把要发送的数据存在这里
extern unsigned char cSCITraLen; //发送数据长度寄存器
extern unsigned char cSCIRecLen;
extern unsigned char bCANState;
void main(void)
{
CONFIG1_COPD = 1; //禁止看门狗
/* include your code here */
InitSystem();
InitTimer();
InitSCI();
InitCAN();
EnableInterrupts;
PTA = 0x000;
Delay(500);
LED0 = 1;
Delay(500);
LED1 = 1;
LED0 = 0;
Delay(500);
LED2 = 1;
LED1 = 0;
Delay(500);
LED3 = 1;
LED2 = 0;
Delay(500);
LED3 = 0;
nTime = 0;
for(;;) //main loop
{
if(nTime > 10000)
{
LED0 = !LED0;
nTime = 0;
}
else
{
nTime++;
}
if(SCIState_RecFull) //SCI有数据到达
{
Communication(cSCIRecBuf,cSCIRecLen);
SCIState_RecFull = 0;
}
if(SCIState_RecCRC)
{
cSCITraBuf[0] = 'E'; //错误
cSCITraBuf[1] = 'C';
cSCITraBuf[2] = 'R';
cSCITraBuf[3] = 'C';
cSCITraBuf[4] = ' ';
cSCITraBuf[5] = 'E';
cSCITraBuf[6] = '\n';
cSCITraLen = 7;
SCC2_SCTIE = 1;
SCIState_RecCRC = 0;
}
if(SCIState_RecOverTime)
{
cSCITraBuf[0] = 'E'; //错误
cSCITraBuf[1] = 'O';
cSCITraBuf[2] = 'V';
cSCITraBuf[3] = 'E';
cSCITraBuf[4] = 'R';
cSCITraBuf[5] = 'T';
cSCITraBuf[6] = 'I';
cSCITraBuf[7] = 'M';
cSCITraBuf[8] = 'E';
cSCITraBuf[9] = '\n';
cSCITraLen = 10;
SCC2_SCTIE = 1;
SCIState_RecOverTime = 0;
}
if(SCIState_RecOver)
{
cSCITraBuf[0] = 'E'; //错误
cSCITraBuf[1] = 'O';
cSCITraBuf[2] = 'V';
cSCITraBuf[3] = 'E';
cSCITraBuf[4] = 'R';
cSCITraBuf[5] = '\n';
cSCITraLen = 6;
SCC2_SCTIE = 1;
SCIState_RecOver = 0;
}
if(CRFLG_RXF) //CAN有数据到达
{
cSCITraBuf[0] = 'R'; //CAN发送的数据
cSCITraBuf[1] = RBIDR0;
cSCITraBuf[2] = RBIDR1;
cSCITraBuf[3] = RBIDR2;
cSCITraBuf[4] = RBIDR3;
cSCITraBuf[5] = RBDSR0;
cSCITraBuf[6] = RBDSR1;
cSCITraBuf[7] = RBDSR2;
cSCITraBuf[8] = RBDSR3;
cSCITraBuf[9] = RBDSR4;
cSCITraBuf[10] = RBDSR5;
cSCITraBuf[11] = RBDSR6;
cSCITraBuf[12] = RBDSR7;
cSCITraLen = (RBDLR & 0x0F) + 5;
SCC2_SCTIE = 1;
CRFLG = 0x01; //清RXF标志
LED3 = 0; //指示要发送数据
CANState_RecFull = 0;
}
__RESET_WATCHDOG(); /* kicks the dog */
}
/* loop forever */
}
void Communication(char *p,char nLen)
{
switch(p[0])
{
case 'S': //发送CAN消息
CanSendMsg(p + 1,nLen - 1);
break;
case 'V': //读取硬件版本
if(cSCIRecLen == 1)
{
cSCITraBuf[0] = 'V';
cSCITraBuf[1] = 'H';
cSCITraBuf[2] = '1';
cSCITraBuf[3] = '.';
cSCITraBuf[4] = '0';
cSCITraBuf[5] = '0';
cSCITraBuf[6] = 0;
cSCITraLen = 7;
LED2 = 0;
SCC2_SCTIE = 1;
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'V';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'F': //读取软件版本
if(cSCIRecLen == 1)
{
cSCITraBuf[0] = 'V';
cSCITraBuf[1] = 'S';
cSCITraBuf[2] = '1';
cSCITraBuf[3] = '.';
cSCITraBuf[4] = '0';
cSCITraBuf[5] = '0';
cSCITraBuf[6] = 0;
cSCITraLen = 7;
LED2 = 0;
SCC2_SCTIE = 1;
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'F';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'B': //设置CAN速率
if(cSCIRecLen == 2)
{
CBTR0 = cSCIRecBuf[1];
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'B';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'C': //读取CAN速度
if(cSCIRecLen == 1)
{
cSCITraBuf[0] = 'C';
cSCITraBuf[1] = CBTR0;
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'C';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'T': //开始通讯
if(cSCIRecLen == 1)
{
CMCR0 = 0x000; //MSCAN08 正常.
while(!CMCR0_SYNCH); //等待同步
CRIER = 0x000; //
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'T';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'P': //停止通讯
if(cSCIRecLen == 1)
{
CMCR0_SFTRES = 0x001; //软复位
while(!CMCR0_SFTRES); //等待进入复位状态
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'P';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'M': //设置MASK
if(cSCIRecLen == 10)
{
CIDAR0 = cSCIRecBuf[1];
CIDAR1 = cSCIRecBuf[2];
CIDAR2 = cSCIRecBuf[3];
CIDAR3 = cSCIRecBuf[4];
CIDMR0 = cSCIRecBuf[5];
CIDMR1 = cSCIRecBuf[6];
CIDMR2 = cSCIRecBuf[7];
CIDMR3 = cSCIRecBuf[8];
LED2 = 0;
SCC2_SCTIE = 1;
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'M';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
case 'N': //读取MASK
if(cSCIRecLen == 1)
{
cSCITraBuf[0] = 'N';
cSCITraBuf[1] = CIDAR0;
cSCITraBuf[2] = CIDAR1;
cSCITraBuf[3] = CIDAR2;
cSCITraBuf[4] = CIDAR3;
cSCITraBuf[5] = CIDMR0;
cSCITraBuf[6] = CIDMR1;
cSCITraBuf[7] = CIDMR2;
cSCITraBuf[8] = CIDMR3;
cSCITraLen = 9;
LED2 = 0;
SCC2_SCTIE = 1;
}
else
{
cSCITraBuf[0] = 'E';
cSCITraBuf[1] = 'N';
cSCITraLen = 2;
LED2 = 0;
SCC2_SCTIE = 1;
}
break;
default:
break;
}
}
void Delay(unsigned int uTime)
{
unsigned char i;
for(;uTime ; uTime--)
{
__RESET_WATCHDOG();
for(i = 0; i < 200; i++)
__asm NOP
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -