?? 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 + -