📄 sub_mc33984.h
字号:
sys_data_type MC33984_fault1,MC33984_fault2,MC33984_fault3,MC33984_fault4;
unsigned char fault1_count[8],fault2_count[8],fault3_count[5];//,fault4_count[5]; //故障清除计数器
sys_data_type _SUB_FLAGS1;
#define xidi_flag _SUB_FLAGS1.Bit.BIT0
#define rain_stop _SUB_FLAGS1.Bit.BIT1
#define rain_int _SUB_FLAGS1.Bit.BIT2
#define int_clk _SUB_FLAGS1.Bit.BIT3
#define door_close _SUB_FLAGS1.Bit.BIT4
#define door_open _SUB_FLAGS1.Bit.BIT5
#define door_flag _SUB_FLAGS1.Bit.BIT6
#define rain_brush _SUB_FLAGS1.Bit.BIT7
unsigned char door_count=0;
unsigned char xidi_count=0;
unsigned char xidi_rain=0;
unsigned char stop_count=0;
unsigned int int_count=0;
unsigned char int_time=0;
//////////////////////////////////////////////////////////////
//定义: void FAULT_STA(void) //
//描述: 判断故障,根据故障组织报文 //
//////////////////////////////////////////////////////////////
void FAULT_STA(void)
{
if(fault_ok) //已检测
{
if(MC33984_STATUS0.Bit.BIT0==0||MC33984_STATUS0.Bit.BIT7==1||MC33984_STATUS0.Byte==0x01||(MC33984_STATUS0.Bit.BIT4&&MC33984_STATUS0.Bit.BIT5)||((MC33984_STATUS0.Bit.BIT4||MC33984_STATUS0.Bit.BIT5)&&MC33984_STATUS0.Bit.BIT3)) MC33984_STATUS0.Byte=0x00;
//故障位为0(无故障)、通道位为1(通道错误)、故障码为0x01(无故障现象)、高过流与低过流并存、短路与开路并存,通道0检测无效
if(MC33984_STATUS1.Bit.BIT0==0||MC33984_STATUS1.Bit.BIT7==0||MC33984_STATUS1.Byte==0x81||(MC33984_STATUS1.Bit.BIT4&&MC33984_STATUS1.Bit.BIT5)||((MC33984_STATUS1.Bit.BIT4||MC33984_STATUS1.Bit.BIT5)&&MC33984_STATUS1.Bit.BIT3)) MC33984_STATUS1.Byte=0x80;
//故障位为0(无故障)、通道位为0(通道错误)、故障码为0x81(无故障现象)、高过流与低过流并存、短路与开路并存,通道0检测无效
if(MC33984_STATUS0.Bit.BIT0) //HS0有故障?
{
if(MC33984_STATUS0.Bit.BIT3) //开路
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT0=1;CAN_STR0.Bit.BIT1=0;MC33984_fault1.Bit.BIT0=1;break;} //右前小灯
case 1: {CAN_STR0.Bit.BIT4=1;CAN_STR0.Bit.BIT5=0;MC33984_fault1.Bit.BIT2=1;break;} //右近光灯
case 2: {CAN_STR1.Bit.BIT0=1;CAN_STR1.Bit.BIT1=0;MC33984_fault1.Bit.BIT4=1;break;} //右远光灯
case 3: {CAN_STR1.Bit.BIT4=1;CAN_STR1.Bit.BIT5=0;MC33984_fault1.Bit.BIT6=1;break;} //右前雾灯
case 4: {CAN_STR2.Bit.BIT0=1;CAN_STR2.Bit.BIT1=0;MC33984_fault2.Bit.BIT0=1;break;} //监视器电源
case 5: break;//{CAN_STR2.Bit.BIT4=1;CAN_STR2.Bit.BIT5=0;MC33984_fault2.Bit.BIT2=1;break;} //雨刮高速
case 6: {CAN_STR3.Bit.BIT0=1;CAN_STR3.Bit.BIT1=0;MC33984_fault2.Bit.BIT4=1;break;} //前门电磁阀开
case 7: {CAN_STR3.Bit.BIT4=1;CAN_STR3.Bit.BIT5=0;MC33984_fault2.Bit.BIT6=1;break;} //除霜电机高速
case 8: {CAN_STR4.Bit.BIT0=1;CAN_STR4.Bit.BIT1=0;MC33984_fault3.Bit.BIT0=1;break;} //音响电源
case 9: {CAN_STR4.Bit.BIT4=1;CAN_STR4.Bit.BIT5=0;MC33984_fault3.Bit.BIT2=1;break;} //开关有效电源
case 10: break;
case 11: {CAN_STR5.Bit.BIT2=1;CAN_STR5.Bit.BIT3=0;MC33984_fault3.Bit.BIT6=1;break;} //倒档信号
}
}
else if(MC33984_STATUS0.Bit.BIT4||MC33984_STATUS0.Bit.BIT5) //短路
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT0=0;CAN_STR0.Bit.BIT1=1;MC33984_fault1.Bit.BIT0=1;break;} //右前小灯
case 1: {CAN_STR0.Bit.BIT4=0;CAN_STR0.Bit.BIT5=1;MC33984_fault1.Bit.BIT2=1;break;} //右近光灯
case 2: {CAN_STR1.Bit.BIT0=0;CAN_STR1.Bit.BIT1=1;MC33984_fault1.Bit.BIT4=1;break;} //右远光灯
case 3: {CAN_STR1.Bit.BIT4=0;CAN_STR1.Bit.BIT5=1;MC33984_fault1.Bit.BIT6=1;break;} //右前雾灯
case 4: {CAN_STR2.Bit.BIT0=0;CAN_STR2.Bit.BIT1=1;MC33984_fault2.Bit.BIT0=1;break;} //监视器电源
case 5: {CAN_STR2.Bit.BIT4=0;CAN_STR2.Bit.BIT5=1;MC33984_fault2.Bit.BIT2=1;break;} //雨刮高速
case 6: {CAN_STR3.Bit.BIT0=0;CAN_STR3.Bit.BIT1=1;MC33984_fault2.Bit.BIT4=1;break;} //前门电磁阀开
case 7: {CAN_STR3.Bit.BIT4=0;CAN_STR3.Bit.BIT5=1;MC33984_fault2.Bit.BIT6=1;break;} //除霜电机高速
case 8: {CAN_STR4.Bit.BIT0=0;CAN_STR4.Bit.BIT1=1;MC33984_fault3.Bit.BIT0=1;break;} //音响电源
case 9: {CAN_STR4.Bit.BIT4=0;CAN_STR4.Bit.BIT5=1;MC33984_fault3.Bit.BIT2=1;break;} //开关有效电源
case 10: break;
case 11: {CAN_STR5.Bit.BIT2=0;CAN_STR5.Bit.BIT3=1;MC33984_fault3.Bit.BIT6=1;break;} //倒档信号
}
}
else if(MC33984_STATUS0.Bit.BIT6) //过热
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT0=1;CAN_STR0.Bit.BIT1=1;MC33984_fault1.Bit.BIT0=1;break;} //右前小灯
case 1: {CAN_STR0.Bit.BIT4=1;CAN_STR0.Bit.BIT5=1;MC33984_fault1.Bit.BIT2=1;break;} //右近光灯
case 2: {CAN_STR1.Bit.BIT0=1;CAN_STR1.Bit.BIT1=1;MC33984_fault1.Bit.BIT4=1;break;} //右远光灯
case 3: {CAN_STR1.Bit.BIT4=1;CAN_STR1.Bit.BIT5=1;MC33984_fault1.Bit.BIT6=1;break;} //右前雾灯
case 4: {CAN_STR2.Bit.BIT0=1;CAN_STR2.Bit.BIT1=1;MC33984_fault2.Bit.BIT0=1;break;} //监视器电源
case 5: {CAN_STR2.Bit.BIT4=1;CAN_STR2.Bit.BIT5=1;MC33984_fault2.Bit.BIT2=1;break;} //雨刮高速
case 6: {CAN_STR3.Bit.BIT0=1;CAN_STR3.Bit.BIT1=1;MC33984_fault2.Bit.BIT4=1;break;} //前门电磁阀开
case 7: {CAN_STR3.Bit.BIT4=1;CAN_STR3.Bit.BIT5=1;MC33984_fault2.Bit.BIT6=1;break;} //除霜电机高速
case 8: {CAN_STR4.Bit.BIT0=1;CAN_STR4.Bit.BIT1=1;MC33984_fault3.Bit.BIT0=1;break;} //音响电源
case 9: {CAN_STR4.Bit.BIT4=1;CAN_STR4.Bit.BIT5=1;MC33984_fault3.Bit.BIT2=1;break;} //开关有效电源
case 10: break;
case 11: {CAN_STR5.Bit.BIT2=1;CAN_STR5.Bit.BIT3=1;MC33984_fault3.Bit.BIT6=1;break;} //倒档信号
}
}
}
if(MC33984_STATUS1.Bit.BIT0) //HS1有故障?
{
if(MC33984_STATUS1.Bit.BIT3) //开路
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT2=1;CAN_STR0.Bit.BIT3=0;MC33984_fault1.Bit.BIT1=1;break;} //开关背光电源
case 1: {CAN_STR0.Bit.BIT6=1;CAN_STR0.Bit.BIT7=0;MC33984_fault1.Bit.BIT3=1;break;} //前右转向灯
case 2: break;//{CAN_STR1.Bit.BIT2=1;CAN_STR1.Bit.BIT3=0;MC33984_fault1.Bit.BIT5=1;break;} //洗涤电机
case 3: {CAN_STR1.Bit.BIT6=1;CAN_STR1.Bit.BIT7=0;MC33984_fault1.Bit.BIT7=1;break;} //右镜加热器
case 4: {CAN_STR2.Bit.BIT2=1;CAN_STR2.Bit.BIT3=0;MC33984_fault2.Bit.BIT1=1;break;} //ABS ON档电源
case 5: break;//{CAN_STR2.Bit.BIT6=1;CAN_STR2.Bit.BIT7=0;MC33984_fault2.Bit.BIT3=1;break;} //雨刮低速
case 6: {CAN_STR3.Bit.BIT2=1;CAN_STR3.Bit.BIT3=0;MC33984_fault2.Bit.BIT5=1;break;} //前门电磁阀关
case 7: {CAN_STR3.Bit.BIT6=1;CAN_STR3.Bit.BIT7=0;MC33984_fault2.Bit.BIT7=1;break;} //除霜电机低速
case 8: {CAN_STR4.Bit.BIT2=1;CAN_STR4.Bit.BIT3=0;MC33984_fault3.Bit.BIT1=1;break;} //行驶记录仪电源
case 9: {CAN_STR4.Bit.BIT6=1;CAN_STR4.Bit.BIT7=0;MC33984_fault3.Bit.BIT3=1;break;} //缓速器控制电源输出
case 10: break;
case 11: break;
}
}
else if(MC33984_STATUS1.Bit.BIT4||MC33984_STATUS1.Bit.BIT5) //短路
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT2=0;CAN_STR0.Bit.BIT3=1;MC33984_fault1.Bit.BIT1=1;break;} //开关背光电源
case 1: {CAN_STR0.Bit.BIT6=0;CAN_STR0.Bit.BIT7=1;MC33984_fault1.Bit.BIT3=1;break;} //前右转向灯
case 2: {CAN_STR1.Bit.BIT2=0;CAN_STR1.Bit.BIT3=1;MC33984_fault1.Bit.BIT5=1;break;} //洗涤电机
case 3: {CAN_STR1.Bit.BIT6=0;CAN_STR1.Bit.BIT7=1;MC33984_fault1.Bit.BIT7=1;break;} //右镜加热器
case 4: {CAN_STR2.Bit.BIT2=0;CAN_STR2.Bit.BIT3=1;MC33984_fault2.Bit.BIT1=1;break;} //ABS ON档电源
case 5: {CAN_STR2.Bit.BIT6=0;CAN_STR2.Bit.BIT7=1;MC33984_fault2.Bit.BIT3=1;break;} //雨刮低速
case 6: {CAN_STR3.Bit.BIT2=0;CAN_STR3.Bit.BIT3=1;MC33984_fault2.Bit.BIT5=1;break;} //前门电磁阀关
case 7: {CAN_STR3.Bit.BIT6=0;CAN_STR3.Bit.BIT7=1;MC33984_fault2.Bit.BIT7=1;break;} //除霜电机低速
case 8: {CAN_STR4.Bit.BIT2=0;CAN_STR4.Bit.BIT3=1;MC33984_fault3.Bit.BIT1=1;break;} //行驶记录仪电源
case 9: {CAN_STR4.Bit.BIT6=0;CAN_STR4.Bit.BIT7=1;MC33984_fault3.Bit.BIT3=1;break;} //缓速器控制电源输出
case 10: break;
case 11: break;
}
}
else if(MC33984_STATUS1.Bit.BIT6) //过热
{
switch(fault_count)
{
case 0: {CAN_STR0.Bit.BIT2=1;CAN_STR0.Bit.BIT3=1;MC33984_fault1.Bit.BIT1=1;break;} //开关背光电源
case 1: {CAN_STR0.Bit.BIT6=1;CAN_STR0.Bit.BIT7=1;MC33984_fault1.Bit.BIT3=1;break;} //前右转向灯
case 2: {CAN_STR1.Bit.BIT2=1;CAN_STR1.Bit.BIT3=1;MC33984_fault1.Bit.BIT5=1;break;} //洗涤电机
case 3: {CAN_STR1.Bit.BIT6=1;CAN_STR1.Bit.BIT7=1;MC33984_fault1.Bit.BIT7=1;break;} //右镜加热器
case 4: {CAN_STR2.Bit.BIT2=1;CAN_STR2.Bit.BIT3=1;MC33984_fault2.Bit.BIT1=1;break;} //ABS ON档电源
case 5: {CAN_STR2.Bit.BIT6=1;CAN_STR2.Bit.BIT7=1;MC33984_fault2.Bit.BIT3=1;break;} //雨刮低速
case 6: {CAN_STR3.Bit.BIT2=1;CAN_STR3.Bit.BIT3=1;MC33984_fault2.Bit.BIT5=1;break;} //前门电磁阀关
case 7: {CAN_STR3.Bit.BIT6=1;CAN_STR3.Bit.BIT7=1;MC33984_fault2.Bit.BIT7=1;break;} //除霜电机低速
case 8: {CAN_STR4.Bit.BIT2=1;CAN_STR4.Bit.BIT3=1;MC33984_fault3.Bit.BIT1=1;break;} //行驶记录仪电源
case 9: {CAN_STR4.Bit.BIT6=1;CAN_STR4.Bit.BIT7=1;MC33984_fault3.Bit.BIT3=1;break;} //缓速器控制电源输出
case 10: break;
case 11: break;
}
}
}
fault_count++; //故障计数器+1
if(fault_count>11) fault_count=0; //故障计数器最大为9
fault_ok=0; //清故障检测完成标志
}
}
/////////////////////////////////////////////////////////////
//定义: void OUT_STA(void)
//描述: 本地命令,执行操作
/////////////////////////////////////////////////////////////
void OUT_STA(void)
{
if(SP_status.Bit.BIT0)
{
if(MC33984_fault1.Bit.BIT7) MC33984_OUT[3].Bit.BIT2=0; //无故障开 右镜加热器
else MC33984_OUT[3].Bit.BIT2=1;
}
else MC33984_OUT[3].Bit.BIT2=0;
}
/////////////////////////////////////////////////////////////
//定义: void DOOR_OUT(void)
//描述: 接收仪表CAN命令,执行前门操作
/////////////////////////////////////////////////////////////
void DOOR_OUT(void)
{
//前门开关-开
if(CAN_YB3.Bit.BIT6==1&&CAN_YB3.Bit.BIT7==0)
{
door_close=1;
if(door_open)
{
door_count=0; //工作1s
door_flag=1;
door_open=0;
if(MC33984_fault2.Bit.BIT4) MC33984_OUT[6].Byte=0x1a; //无故障开 前门电磁阀开线
else MC33984_OUT[6].Byte=0x1b;
}
}
//前门开关-关
else if(CAN_YB3.Bit.BIT6==0&&CAN_YB3.Bit.BIT7==1)
{
door_open=1;
if(door_close)
{
door_close=0;
if(MC33984_fault2.Bit.BIT5) MC33984_OUT[6].Byte=0x1a; //无故障开 前门电磁阀关线
else MC33984_OUT[6].Byte=0x1e;
door_count=0; //工作1s
door_flag=1;
}
}
}
/////////////////////////////////////////////////////////////
//定义: void CAN_YB(void)
//描述: 接收仪表CAN命令,执行操作
/////////////////////////////////////////////////////////////
void CAN_YB(void) //513
{
//小灯一档、前雾灯开关
if((CAN_YB2.Bit.BIT4==1&&CAN_YB2.Bit.BIT5==0)||(CAN_YB3.Bit.BIT2==1&&CAN_YB3.Bit.BIT3==0))
{
if(MC33984_fault1.Bit.BIT0) MC33984_OUT[0].Bit.BIT0=0; //无故障开 右前小灯
else MC33984_OUT[0].Bit.BIT0=1;
if(MC33984_fault1.Bit.BIT1) MC33984_OUT[0].Bit.BIT2=0; //无故障开 开关背光电源
else MC33984_OUT[0].Bit.BIT2=1;
asm nop
}
else
{
MC33984_OUT[0].Byte=0x1a; //关
}
//前雾灯开关
if(CAN_YB3.Bit.BIT2==1&&CAN_YB3.Bit.BIT3==0)
{
if(MC33984_fault1.Bit.BIT6) MC33984_OUT[3].Bit.BIT0=0; //无故障开 右前雾灯
else MC33984_OUT[3].Bit.BIT0=1;
}
else MC33984_OUT[3].Bit.BIT0=0;
//远光灯开关
if(CAN_YB2.Bit.BIT6==1&&CAN_YB2.Bit.BIT7==0)
{
if(MC33984_fault1.Bit.BIT2) MC33984_OUT[1].Bit.BIT0=0; //无故障开 右近光灯
else MC33984_OUT[1].Bit.BIT0=1;
if(MC33984_fault1.Bit.BIT4) MC33984_OUT[2].Bit.BIT0=0; //无故障开 右远光灯
else MC33984_OUT[2].Bit.BIT0=1;
}
else
{
MC33984_OUT[2].Bit.BIT0=0;
//近光灯开关
if(CAN_YB3.Bit.BIT0==1&&CAN_YB3.Bit.BIT1==0)
{
if(MC33984_fault1.Bit.BIT2) MC33984_OUT[1].Bit.BIT0=0; //无故障开 右近光灯
else MC33984_OUT[1].Bit.BIT0=1;
}
else MC33984_OUT[1].Bit.BIT0=0;
}
//右转向开关
if(CAN_YB2.Bit.BIT0==1&&CAN_YB2.Bit.BIT1==0)
{
if(MC33984_fault1.Bit.BIT3) MC33984_OUT[1].Bit.BIT2=0; //无故障开 前右转向灯
else MC33984_OUT[1].Bit.BIT2=1;
}
else MC33984_OUT[1].Bit.BIT2=0;
//雨刮间歇
/* if(CAN_YB1.Bit.BIT0==1&&CAN_YB1.Bit.BIT1==0)
{
xidi_flag=0;
xidi_count=0;
xidi_flag=0;
rain_brush=1;
if(rain_int==0) {
rain_int=1;
rain_stop=1;
stop_count=0;
MC33984_OUT[5].Byte=0x1e;
int_count=0;int_time=2;
}
if(rain_int==0)
{
stop_count=0; //到位检测延时计数器
int_time=CAN_YB7.Byte; //雨刮间歇时长
int_count=0;
//asm nop
//rain_int=1; //设雨刮间歇启动标志
rain_stop=1; //设雨刮到位信号检测标志
//间歇时长计数器清零
if(MC33984_fault2.Bit.BIT3) MC33984_OUT[5].Byte=0x1a; //无故障开 雨刮低速
else MC33984_OUT[5].Byte=0x1e;
asm nop
}
else
{
if(int_time!=CAN_YB7.Byte) //时长变化
{
int_time=CAN_YB7.Byte; //保存时长
if(MC33984_OUT[5].Byte==0x1a&&int_count>=int_time) //雨刮停止且间歇时长计数器不小于间歇时长
{
rain_stop=1; //设雨刮到位信号检测标志
stop_count=0; //到位检测延时计数器
int_count=0; //间歇时长计数器清零
if(MC33984_fault2.Bit.BIT3) MC33984_OUT[5].Byte=0x1a; //无故障开 雨刮低速
else MC33984_OUT[5].Byte=0x1e;
}
}
}
rain_brush=1;
//rain_int=1;
rain_brush=1;
}
//雨刮高速
else */if(CAN_YB1.Bit.BIT4==1&&CAN_YB1.Bit.BIT5==0)
{
rain_int=0;
xidi_count=0;
rain_int=0;
rain_brush=1;
if(MC33984_fault2.Bit.BIT2) MC33984_OUT[5].Byte=0x1a; //无故障开 雨刮高速
else MC33984_OUT[5].Byte=0x1b;
xidi_flag=0;
}
//雨刮低速
else if(CAN_YB1.Bit.BIT2==1&&CAN_YB1.Bit.BIT3==0)
{
rain_brush=1;
rain_int=0;
xidi_flag=0;
if(MC33984_fault2.Bit.BIT3) MC33984_OUT[5].Byte=0x1a; //无故障开 雨刮低速
else MC33984_OUT[5].Byte=0x1e;
xidi_count=0;
}
else if(CAN_YB1.Bit.BIT0==0&&CAN_YB1.Bit.BIT1==0)
{
rain_int=0;
if(MC33984_OUT[5].Byte==0x1b&&MC33984_fault2.Bit.BIT3==0) MC33984_OUT[5].Byte=0x1e; //禁止雨刮由高速直接停止
if(SGH_status.Bit.BIT4&&xidi_flag==0) MC33984_OUT[5].Byte=0x1a;
rain_brush=0;
}
//洗涤电机
if(CAN_YB0.Bit.BIT6==1&&CAN_YB0.Bit.BIT7==0)
{
if(MC33984_fault1.Bit.BIT5) MC33984_OUT[2].Bit.BIT2=0; //无故障开 洗涤电机
else MC33984_OUT[2].Bit.BIT2=1;
if(rain_brush==0&&rain_int==0) //雨刮无动作
{
if(xidi_count==10) //0.5s
{
xidi_flag=1;
if(MC33984_fault2.Bit.BIT3) MC33984_OUT[5].Byte=0x1a; //无故障开 雨刮低速
else MC33984_OUT[5].Byte=0x1e;
}
else xidi_count++;
xidi_rain=0;
}
}
else
{
xidi_count=0;
MC33984_OUT[2].Bit.BIT2=0;
if(xidi_flag) //标志为1,雨刮在工作
{
if(xidi_rain==0) //检测第一次雨刮到位信号
{
if(SGH_status.Bit.BIT4) xidi_rain++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -