📄 can.h
字号:
//中控控制命令ID18ff138b(c7fe2716)
#define LOCAL_CMD_ADR0 0xc7
#define LOCAL_CMD_ADR1 0xfe
#define LOCAL_CMD_ADR2 0x27
#define LOCAL_CMD_ADR3 0x16
//中控状态ID18ff132b(c7fe2856)
#define LOCAL_STA_ADR0 0xc7
#define LOCAL_STA_ADR1 0xfe
#define LOCAL_STA_ADR2 0x28
#define LOCAL_STA_ADR3 0x56
sys_data_type CAN_FLAGS;
#define VACC_WAKE CAN_FLAGS.Bit.BIT0
#define INC_WAKE CAN_FLAGS.Bit.BIT1
#define can_yb_flag CAN_FLAGS.Bit.BIT2
#define can_qkz_flag CAN_FLAGS.Bit.BIT3
sys_data_type CAN_STR0,CAN_STR1,CAN_STR2,CAN_STR3,CAN_STR4,CAN_STR5,CAN_STR6,CAN_STR7, //CAN状态寄存器0~7
CAN_CMD0,CAN_CMD1,CAN_CMD2,CAN_CMD3,CAN_CMD4,CAN_CMD5,CAN_CMD6,CAN_CMD7; //CAN命令寄存器0~7
sys_data_type CAN_YB0,CAN_YB1,CAN_YB2,CAN_YB3,CAN_YB4,CAN_YB5,CAN_YB6,CAN_YB7, //仪表命令CAN接收缓存
CAN_QKZC0,CAN_QKZC1,CAN_QKZC2,CAN_QKZC3,CAN_QKZC4,CAN_QKZC5,CAN_QKZC6,CAN_QKZC7, //前控左命令CAN接收缓存
CAN_QKZS0,CAN_QKZS1,CAN_QKZS2,CAN_QKZS3,CAN_QKZS4,CAN_QKZS5,CAN_QKZS6,CAN_QKZS7, //前控左状态CAN接收缓存
CAN_QKYC0,CAN_QKYC1,CAN_QKYC2,CAN_QKYC3,CAN_QKYC4,CAN_QKYC5,CAN_QKYC6,CAN_QKYC7, //前控右命令CAN接收缓存
CAN_QKYS0,CAN_QKYS1,CAN_QKYS2,CAN_QKYS3,CAN_QKYS4,CAN_QKYS5,CAN_QKYS6,CAN_QKYS7, //前控右状态CAN接收缓存
CAN_ZKC0,CAN_ZKC1,CAN_ZKC2,CAN_ZKC3,CAN_ZKC4,CAN_ZKC5,CAN_ZKC6,CAN_ZKC7, //中控命令CAN接收缓存
CAN_ZKS0,CAN_ZKS1,CAN_ZKS2,CAN_ZKS3,CAN_ZKS4,CAN_ZKS5,CAN_ZKS6,CAN_ZKS7, //中控状态CAN接收缓存
CAN_WKC0,CAN_WKC1,CAN_WKC2,CAN_WKC3,CAN_WKC4,CAN_WKC5,CAN_WKC6,CAN_WKC7, //尾控命令CAN接收缓存
CAN_WKS0,CAN_WKS1,CAN_WKS2,CAN_WKS3,CAN_WKS4,CAN_WKS5,CAN_WKS6,CAN_WKS7, //尾控状态CAN接收缓存
CAN_WKD0,CAN_WKD1,CAN_WKD2,CAN_WKD3,CAN_WKD4,CAN_WKD5,CAN_WKD6,CAN_WKD7; //尾控数据CAN接收缓存
unsigned char can_comm_count=0;
unsigned char can_free_count=0;
//***********************MSCAN初始化子程序 OK************************
static void Init_MSCAN08(void)
{
CMCR0 = 0x01; //CAN模块为软复位状态
CMCR1 = 0x00; //时钟源为外部晶体/2 2M
//CMCR1 = 0x04; //时钟源为外部晶体/2 2M
CBTR0 = 0x80;
//SJW1,SJW0,10,3个周期同步。100000,20分频,为100KC。10100000 A0H
CBTR1 = 0xfa; //1,3个采样位,0000000,分频为0,波特率为100K
CIDAC = 0x00; //接收滤波为32位滤波,击中事件使用1个字节
//标识符号验收寄存器0~3
CIDAR0 = 0x00; //滤波使它接收一帧08B7D8D2(45BFB1A4)
CIDAR1 = 0x00;
CIDAR2 = 0x00;
CIDAR3 = 0x00;
//标识符屏蔽寄存器0~3
CIDMR0 = 0xFF;
CIDMR1 = 0xFF;
CIDMR2 = 0xFF;
CIDMR3 = 0xFF; //不进行过滤
CMCR0 = 0x00; //把CAN模块设置为数据输入输出状态
//while(CMCR0_SYNCH==0){;} //等待同步
CRIER = 0x01; //CAN接收中断使能
}
//*********************尾控状态CAN发送函数 OK**********************
void CAN_STR(void)
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x01; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
DLR0 = 0x08; //设置传送数据长度为8个字节。
DSR00 = CAN_STR0.Byte; //传送本地状态数据
DSR10 = CAN_STR1.Byte;
DSR20 = CAN_STR2.Byte;
DSR30 = CAN_STR3.Byte;
DSR40 = CAN_STR4.Byte;
DSR50 = CAN_STR5.Byte;
DSR60 = CAN_STR6.Byte;
DSR70 = CAN_STR7.Byte;
IDR00 = LOCAL_STA_ADR0; //设置本地ID
IDR10 = LOCAL_STA_ADR1;
IDR20 = LOCAL_STA_ADR2;
IDR30 = LOCAL_STA_ADR3;
TBPR0 = 0x05; //设置优先级别
CTFLG = 0x01; //启动发送
}
}
//***********************CAN命令执行函数********
void CAN_CMD(void)//ID1
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x04; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
DLR2 = 0x08; //设置传送数据长度为8个字节。
DSR02 = CAN_CMD0.Byte; //传送本地状态数据
DSR12 = CAN_CMD1.Byte;
DSR22 = CAN_CMD2.Byte;
DSR32 = CAN_CMD3.Byte;
DSR42 = CAN_CMD4.Byte;
DSR52 = CAN_CMD5.Byte;
DSR62 = CAN_CMD6.Byte;
DSR72 = CAN_CMD7.Byte;
IDR02 = LOCAL_CMD_ADR0; //设置本地ID
IDR12 = LOCAL_CMD_ADR1;
IDR22 = LOCAL_CMD_ADR2;
IDR32 = LOCAL_CMD_ADR3;
TBPR2 = 0x05; //设置优先级别
CTFLG = 0x04; //启动发送
}
}
//******************** CAN接收中断子程序 OK**********************
void interrupt 20 CAN_Receive(void)
{
void CAN_YB(void);
void DOOR_OUT(void);
void CAN_QKZC(void);
unsigned char REC_ID0,REC_ID1,REC_ID2,REC_ID3;
REC_ID0=REC_IDR0;
REC_ID1=REC_IDR1;
REC_ID2=REC_IDR2;
REC_ID3=REC_IDR3;
//仪表ID18FF0088(C7FE0110)
if(REC_ID2==0x01&&REC_ID3==0x10&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_YB0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//点火锁ON 点火锁S 排气制动 洗涤电机
CAN_YB1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//雨刮间歇 雨刮低速 雨刮高速 左转向
CAN_YB2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//右转向 喇叭 小灯一档 远光灯
CAN_YB3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//近光灯 前雾灯 自动润滑 前门
CAN_YB4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//后门 NC NC NC
CAN_YB5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_YB6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//0~7系统电压
CAN_YB7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//0~7雨刮间歇时长
//紧急报警唤醒
if(CAN_YB1.Bit.BIT6==0&&CAN_YB1.Bit.BIT7==0&&CAN_YB2.Bit.BIT0==0&&CAN_YB2.Bit.BIT1==0) INC_WAKE=0;
else INC_WAKE=1;
//执行仪表CAN命令
DOOR_OUT();
if(VACC_WAKE||INC_WAKE) CAN_YB();
can_yb_flag=0;
}
//前控左命令ID18ff128b(c7fe2516)
else if(REC_ID2==0x25&&REC_ID3==0x16&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_QKZC0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//电源开关 彩灯1开关 彩灯2开关 司机灯开关
CAN_QKZC1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//厢灯开关1 厢灯开关2 厢灯开关3 冷启动开关
CAN_QKZC2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//电视开关 除霜低速 除霜高速 离合器开关
CAN_QKZC3.Byte=REC_DSR3;
//D0D1D2 D3D4D5 D6D7
//左后视镜 右后视镜 阅读灯开关
CAN_QKZC4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//踏步灯开关 后雾灯开关 NC NC
CAN_QKZC5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKZC6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKZC7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
//电源唤醒
if(CAN_QKZC0.Bit.BIT0==1&&CAN_QKZC0.Bit.BIT1==0) VACC_WAKE=1;
else VACC_WAKE=0;
//执行前控左CAN命令
if(VACC_WAKE||INC_WAKE) CAN_QKZC();
can_qkz_flag=0;
}
/* //前控左状态ID18ff132b(c7fe2656)
else if(REC_ID2==0x26&&REC_ID3==0x56&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_QKZS0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//左前小灯 示廓灯组 左近光灯 前左转向灯
CAN_QKZS1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//左远光灯 顶踏步灯 开关有效电源 电子钟显示线
CAN_QKZS2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//车内辅助灯 蜂鸣器 顶灯1 顶灯2
CAN_QKZS3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//顶灯3 左前雾灯 空调控制电源司机灯
CAN_QKZS4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//彩灯1 彩灯2 换气扇电源 左镜加热器
CAN_QKZS5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//阅读灯左路 阅读灯右路 开关背光电源 电子钟变光线
CAN_QKZS6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//电视机 电子钟记忆线 卫生间有人指示 左后视镜电机
CAN_QKZS7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
//前控右命令ID18ff138b(c7fe2716)
else if(REC_ID2==0x27&&REC_ID3==0x16&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_QKYC0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//前门开关 NC 后门开关 NC
CAN_QKYC1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//前围门开 前围门关 镜加热开关 屈膝开关
CAN_QKYC2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC 辅助灯开关
CAN_QKYC3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//雨刮到位 电/气喇叭转换 ABS工作状态 NC
CAN_QKYC4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//缓速器工作信号输入 ASR指示灯输入 ABS指示灯输入 NC
CAN_QKYC5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKYC6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKYC7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
//前控右状态ID18ff182b(c7fe2856)
else if(REC_ID2==0x28&&REC_ID3==0x56&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_QKYS0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//右前小灯 开关背光电源 右近光灯 前右转向灯
CAN_QKYS1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//右远光灯 洗涤电机 右前雾灯 右镜加热器
CAN_QKYS2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//监视器电源 ABS ON档电源 雨刮高速 雨刮低速
CAN_QKYS3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//前门电磁阀开 前门电磁阀关 除霜电机高速 除霜电机低速
CAN_QKYS4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//音响电源 行驶记录仪电源 开关有效电源 缓速器控制电源输出
CAN_QKYS5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//右后视镜电机 倒档信号 NC NC
CAN_QKYS6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKYS7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
//中控命令ID18ff0f8a(c7fe1f14)
else if(REC_ID2==0x1f&&REC_ID3==0x14&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_ZKC0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//后门防夹开关 后踏步灯开关 卫生间有人开关 手制动开关
CAN_ZKC1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//左行李仓灯1开关 左行李仓灯2开关 左行李仓灯3开关 左行李仓灯4开关
CAN_ZKC2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//右行李仓灯1开关 右行李仓灯2开关 右行李仓灯3开关 右行李仓灯4开关
CAN_ZKC3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//刹车开关 NC NC NC
CAN_ZKC4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//0~7气压1
CAN_ZKC5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//0~7气压2
CAN_ZKC6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//0~7燃油
CAN_ZKC7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//润滑压力开关 低气压开关1 低气压开关2 燃油低开关
}
//中控状态ID18ff102b(c7fe2056)
else if(REC_ID2==0x20&&REC_ID3==0x56&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_ZKS0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//侧左转向灯1 侧左转向灯2 侧右转向灯1 侧右转向灯2
CAN_ZKS1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//左标志灯1 左标志灯2 左标志灯3 右标志灯1
CAN_ZKS2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//右标志灯2 右标志灯3 左轮边灯 右轮边灯
CAN_ZKS3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//左行李仓灯1 左行李仓灯2 左行李仓灯3 左行李仓灯4
CAN_ZKS4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//右行李仓灯1 右行李仓灯2 右行李仓灯3 右行李仓灯4
CAN_ZKS5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//前门底踏步灯 中门底踏步灯 屈膝电磁阀1 屈膝电磁阀2
CAN_ZKS6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//气喇叭 电喇叭 后门电磁阀开 后门电磁阀关
CAN_ZKS7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//卫生间电源 NC NC NC
}
*/ //尾控命令ID18ff0c89(c7fe1912)
else if(REC_ID2==0x19&&REC_ID3==0x12&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_WKC0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//润滑压力开关 机油压力开关 机油旁通开关 过热开关
CAN_WKC1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//空滤器堵塞开关 水位传感器 NC NC
CAN_WKC2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//后启动开关 发动机仓灯开关 倒车开关 空档开关
CAN_WKC3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//安全开关 油门开关 充电信号 NC
CAN_WKC4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//0~7机油压力
CAN_WKC5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//0~7水温
CAN_WKC6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//0~7预热温度
CAN_WKC7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
/* //尾控状态ID18ff0d2b(c7fe1a56)
else if(REC_ID2==0x1a&&REC_ID3==0x56&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_WKS0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//排气制动电磁阀 发动机仓灯 左倒车灯 右倒车灯
CAN_WKS1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//左后雾灯 右后雾灯 电磁开关 预热继电器
CAN_WKS2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//左后小灯 右后小灯 启动继电器 自动润滑电机
CAN_WKS3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//牌照灯组 空调电容箱电源 左标志灯4 左标志灯5
CAN_WKS4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//右标志灯4 右标志灯5 左刹车灯 右刹车灯
CAN_WKS5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//后左转向灯 后右转向灯 车速传感器电源 熄火器正
CAN_WKS6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//熄火器反 熄火电磁阀 NC NC
CAN_WKS7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
//尾控数据ID18ff1a89(c7fe13512)
else if(REC_ID2==0x35&&REC_ID3==0x12&&REC_ID0==0xc7&&REC_ID1==0xfe)
{
CAN_WKD0.Byte=REC_DSR0;
//D0D1 D2D3 D4D5 D6D7
//0~7转速高位
CAN_WKD1.Byte=REC_DSR1;
//D0D1 D2D3 D4D5 D6D7
//0~7转速低位
CAN_WKD2.Byte=REC_DSR2;
//D0D1 D2D3 D4D5 D6D7
//0~7车速
CAN_WKD3.Byte=REC_DSR3;
//D0D1 D2D3 D4D5 D6D7
//0~7里程小计高位
CAN_WKD4.Byte=REC_DSR4;
//D0D1 D2D3 D4D5 D6D7
//0~7里程小计中位
CAN_WKD5.Byte=REC_DSR5;
//D0D1 D2D3 D4D5 D6D7
//0~7里程小计低位
CAN_WKD6.Byte=REC_DSR6;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_WKD7.Byte=REC_DSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
}
*/
CRFLG=0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -