📄 main.c
字号:
/*******************************************************************
\poject 智能车底层驱动器(路由部分)
\author young
\author 北京理工大学
\version 1.1
\date 2009/5/3
* History:
2009/4/28 Start of aplication coding
*********************************************************************/
/* Include Files */
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
#include "Sci.h"
#include "Type.h"
#include "MSCAN08.h"
#include "MCU.h"
#pragma MESSAGE DISABLE C2705 /*Disable warning C2705 "possible loss of data"*/
/* Prototypes */
void MCUInit(void);
void SendMsg(void);
UINT8 CalCheck(UINT8*,UINT8,UINT8);
UINT8 Check(UINT8*,UINT8,UINT8);
void Device_decode(void);
/* Global Variables */
UINT8 CANTxData[3];
UINT8 SCITxData[9];
UINT16 CmdWheelAngle;
UINT8 CmdCarSpeed,CmdCarDir,CmdBreakRapid,StateSensor,CheckByHost;
UINT16 StateLeftAngle,StateRightAngle;
UINT8 StateCarSpeed,StateCarDir,StateBreakRapid,CheckByHub;
void main(void) {
MCUInit();/* System Initalization */
EnableInterrupts; /* enable interrupts */
for(;;) {/* Main Loop */
__RESET_WATCHDOG(); /* kicks the dog */
if (SciRxFlag==1){
Host_decode();//对工控机发送过来的数据进行解码
SendMsg();//对电机控制ECU发送指令
SciRxFlag=0;
}
if (CanRxFlag==1){
Device_decode();//对传感器部分ECU发送过来的数据进行解码
SciTxEnable;//100ms上发一次
CanRxFlag=0;
}
// Device_decode();//对传感器部分ECU发送过来的数据进行解码
} /* loop forever */
}
void MCUInit(void){
DisableInterrupts;
PCTL = 0x00; //禁止锁相环
CONFIG1=0x09; //初始化配置
CONFIG2=0x08; //MSCAN ENABLE ,SCI source =8M
MSCAN08Init();
SCIInit();
TIM1Init();
IOInit();
}
/*****************************************************************************
* SendMsg: 对电机控制ECU发送指令
* Input: None
* Output: None
* Parameters: None
*
****************************************************************************/
void SendMsg(void){//87 68 32 09 54
CANTxData[0]=CmdBreakRapid;
//CANTxData[1]=Check(CANTxData,0,1);
CAN_SendFrame(ID_Cmd_BreakRapid,DATA_FRAME,1,CANTxData);
delay(10);
CANTxData[0]=CmdWheelAngle>>8;
CANTxData[1]=CmdWheelAngle;
CANTxData[2]=StateSensor;
CANTxData[3]=CalCheck(CANTxData,0,2);
CAN_SendFrame(ID_Cmd_WheelAngle,DATA_FRAME,3,CANTxData);
delay(10);
CANTxData[0]=CmdCarSpeed;
CAN_SendFrame(ID_Cmd_CarSpeed,DATA_FRAME,1,CANTxData);
delay(10);
}
/*****************************************************************************
* Device_decode: 对传感器部分ECU发送过来的数据进行解码
* Input: None
* Output: None
* Parameters: None
*
****************************************************************************/
void Device_decode(void){
if (MessageID_Real==ID_State_CarSpeed){
StateCarSpeed=CAN_RX_Data[0];
}
if (MessageID_Real==ID_State_WheelAngle){
StateLeftAngle=(CAN_RX_Data[0]<<8)+CAN_RX_Data[1];
StateRightAngle=(CAN_RX_Data[2]<<8)+CAN_RX_Data[3];
}
if (MessageID_Real==ID_State_CarDir){
StateCarDir=CAN_RX_Data[0];
}
SCITxData[0]=0xFF;
SCITxData[1]=0xFF;
SCITxData[2]=StateLeftAngle>>8;
SCITxData[3]=StateLeftAngle;
SCITxData[4]=StateRightAngle>>8;
SCITxData[5]=StateRightAngle;
SCITxData[6]=StateCarSpeed;
SCITxData[7]=StateCarDir+(StateBreakRapid<1);
SCITxData[8]=CalCheck(SCITxData,0,7);
}
/*****************************************************************************
* Host_decode: 对工控机发送过来的数据进行解码
* Input: None
* Output: None
* Parameters: None
*
****************************************************************************/
void Host_decode(void){
if(Check(SciRxData,0,4)==RIGHT){
CmdWheelAngle=((SciRxData[0] & 0x07)<<7) | (SciRxData[1] & 0x7F);
CmdCarSpeed=SciRxData[2] & 0x7F;
CmdCarDir=SciRxData[3] & 0x01;
CmdBreakRapid=(SciRxData[3] & 0x02)>>1;
StateSensor=(SciRxData[3] & 0x08)>>3;
}
}
/*****************************************************************************
* CalCheck: 计算异或校验字节
* Input: data:数组指针 start:校验起始位 end:校验终止位
* Output: 返回得到的校验字节
* Parameters: None
*
****************************************************************************/
UINT8 CalCheck(UINT8* data,UINT8 start,UINT8 end){
UINT8 i=0,checkdata;
checkdata=*(data+start);
for(i=start+1;i<end+1;i++){
checkdata=checkdata^*(data+start+i);
}
return checkdata;
}
/*****************************************************************************
* Check: 验证校验字节
* Input: data:数组指针 start:校验起始位 end:校验终止位
* Output:返回校验结果
* Parameters: None
*
****************************************************************************/
UINT8 Check(UINT8* data,UINT8 start,UINT8 end){
UINT8 i=0,checkdata;
checkdata=*(data+start);
for(i=start+1;i<end+1;i++){
checkdata=checkdata^*(data+start+i);
}
if (checkdata==0x80){//忽略最高位
return RIGHT;
}
else return WRONG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -