📄 can.h
字号:
//08系列for auto
//扩展数据帧
//适用合客CAN报文
///////////////
#define CAN_YB_C 0x33
#define CAN_QKZ_C 0x35
#define CAN_QKZ_S 0x64
#define CAN_QKY_C 0x39
#define CAN_QKY_S 0x68
#define CAN_ZK_C 0x3A
#define CAN_ZK_S 0x6A
#define CAN_WK_C 0x3C
#define CAN_WK_S 0x6C
#define CAN_WK_D 0x90
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sys_data_type CAN_JLY0,CAN_JLY1,CAN_JLY2,CAN_JLY3,CAN_JLY4,CAN_JLY5,CAN_JLY6,CAN_JLY7; //行使记录仪CAN数据缓存
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数据缓存
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sys_data_type CAN_FLAG;
#define canid_error CAN_FLAG.Bit.BIT0 //接受ID不符,error=1
#define cantr_error CAN_FLAG.Bit.BIT1 //发送ID错,error=1
#define vcc_wakeup_flag CAN_FLAG.Bit.BIT7 //1有效
#define door_wakeup_flag CAN_FLAG.Bit.BIT6 //1有效
#define door1_flag CAN_FLAG.Bit.BIT5
#define door2_flag CAN_FLAG.Bit.BIT4
#define jly_ture_flag CAN_FLAG.Bit.BIT2
#define jly_err_flag CAN_FLAG.Bit.BIT3
//ID寄存器说明
/*#define TB0IDR0 IDR00
#define TB0IDR1 IDR10
#define TB0IDR2 IDR20
#define TB0IDR3 IDR30
#define TB0DLR DLR0
#define TB0DSR0 DSR00
#define TB0DSR1 DSR10
#define TB0DSR2 DSR20
#define TB0DSR3 DSR30
#define TB0DSR4 DSR40
#define TB0DSR5 DSR50
#define TB0DSR6 DSR60
#define TB0DSR7 DSR70
#define TB0TBPR TBPR0
*/
#define RBIDR0 REC_IDR0
#define RBIDR1 REC_IDR1
#define RBIDR2 REC_IDR2
#define RBIDR3 REC_IDR3
#define RBDSR0 REC_DSR0
#define RBDSR1 REC_DSR1
#define RBDSR2 REC_DSR2
#define RBDSR3 REC_DSR3
#define RBDSR4 REC_DSR4
#define RBDSR5 REC_DSR5
#define RBDSR6 REC_DSR6
#define RBDSR7 REC_DSR7
/////
//读取CAN相关的状态量
sys_data_type door_status;
//
void yb_step_first(void);
void cs_step_count(void);
void zs_step_count(void);
void at24_init(void);
ulong licheng=0;
ulong licheng_temp0=0,licheng_temp1=0,licheng_temp2=0;
uint temp_licheng=0;
//控制器MSCAN初始化
void init_mscan(void){
CMCR0=0x01; //模块控制寄存器0:CAN模块为软复位状态
//.4=CMCR0_SYNCH同步状态位/1=同步
//.3=CMCR0_TLNKEN与定时器连接使能/1=连接
//.2=CMCR0_SLPAK休眠模式应答位/1=休眠
//.1=CMCR0_SLPRQ休眠模式请求位/1=请求休眠
//.0=CMCR0_SFTRES软复位/1=处于软复位--一般先进入休眠再进软复位
CMCR1=0x00; //模块控制寄存器1:
//.2=CMCR1_LOOPB回送自检/1=启用回送自检
//.1=CMCR1_WUPM唤醒控制/1=启用低通
//.0=CMCR1_CLKSRC时钟源选择/1=CGMOUT/0=外晶振除2
CBTR0=0x80; //总线定时寄存器0
//同步跳转宽度SJW[7,6],预定标器BRP[5..0]
CBTR1=0xfa; //总线定时寄存器1:/20
//.7=CBTR1_SAMP采样方式/1=3次/0=1次
//时间段2[6..4]时间段1[3..0]
CIDAC=0x00; //标识符验收控制寄存器:单32位,
//验收模式IDAM[5..4],验收匹配IDHIT[1..0]/读取状态
//标识符验收寄存器
CIDAR0=0xc7;
CIDAR1=0xfe;
CIDAR2=0x00;
CIDAR3=0x00;
//标识符屏蔽寄存器
CIDMR0=0xff;
CIDMR1=0xff;
CIDMR2=0xff;
CIDMR3=0xff;
CMCR0=0x00; //正常状态
///////////
asm(nop);
CRIER=0x01; //接收中断使能
//唤醒中断WUPIE,接收器警告中断RWRNIE,发送器警告中断TWRNIE,
//接收器被动错误中断RERRIE,发送器被动错误中断TERRIE
//总线关闭中断BOFFIE,溢出中断OVRIE,接收器已满中断RXFIE
//CRFLG中断相应的标志位
//发送中断复位为禁止
//CTFLG发送相应标志位
}
/////////////
//发至记录仪
void can_tr_jly(void){
unsigned char temp,temp0;
temp=CTFLG;
temp0=temp&0x04;
if(temp0!=0){//发送缓存2为空
DLR2=0x08; //设置传送数据长度为8个字节。
DSR02=CAN_JLY0.Byte; //传送本地数据
DSR12=CAN_JLY1.Byte;
DSR22=CAN_JLY2.Byte;
DSR32=CAN_JLY3.Byte;
DSR42=CAN_JLY4.Byte;
DSR52=CAN_JLY5.Byte;
DSR62=CAN_JLY6.Byte;
DSR72=CAN_JLY7.Byte;
IDR02=0xc7; //行使记录仪(C7FE2456)
IDR12=0xfe;
IDR22=0x24;
IDR32=0x56;
TBPR2=0x05; //设置优先级别
CTFLG=0x04; //启动发送及TXE2
}
}
/////////////
//CAN发送数据 can_tr(CAN_YB_C);
void can_tr(unsigned char select){
unsigned char temp,temp0;
temp=CTFLG;cantr_error=0;
temp0=temp&0x01;
if(temp0!=0){//发送缓存0为空
if(select==CAN_YB_C){//仪表
DLR0=0x08; //设置传送数据长度为8个字节。
DSR00=CAN_YB0.Byte; //传送本地数据
DSR10=CAN_YB1.Byte;
DSR20=CAN_YB2.Byte;
DSR30=CAN_YB3.Byte;
DSR40=CAN_YB4.Byte;
DSR50=CAN_YB5.Byte;
DSR60=CAN_YB6.Byte;
DSR70=CAN_YB7.Byte;
IDR00=0xc7; //仪表控制ID18FF0110(C7FE0110)
IDR10=0xfe;
IDR20=0x01;
IDR30=0x10;
TBPR0=0x05; //设置优先级别
CTFLG=0x01; //启动发送及TXE0=0
/////
}
else{cantr_error=1;}
}
else{cantr_error=1;}
}
/////////////
//CAN接收中断
void interrupt 20 can_receive(void){
unsigned char can_rec_id0,can_rec_id1,can_rec_id2,can_rec_id3;
can_rec_id0=RBIDR0;
can_rec_id1=RBIDR1;
can_rec_id2=RBIDR2;
can_rec_id3=RBIDR3;
canid_error=0;
if(can_rec_id0==0xc7 && can_rec_id1==0xfe){
//can_wakeup_flag=1; //CAN有接收
//仪表控制ID18FF0088(C7FE0110)//以小括号内为准
/*if(can_rec_id2==0x01 && can_rec_id3==0x10){
CAN_YB0.Byte=RBDSR0;
//D0D1 D2D3 D4D5 D6D7
//点火锁ON 点火锁S 排气制动 洗涤电机
CAN_YB1.Byte=RBDSR1;
//D0D1 D2D3 D4D5 D6D7
//雨刮间歇 雨刮低速 雨刮高速 左转向
CAN_YB2.Byte=RBDSR2;
//D0D1 D2D3 D4D5 D6D7
//右转向 喇叭 小灯一档 远光灯
CAN_YB3.Byte=RBDSR3;
//D0D1 D2D3 D4D5 D6D7
//近光灯 前雾灯 自动润滑 前门
CAN_YB4.Byte=RBDSR4;
//D0D1 D2D3 D4D5 D6D7
//后门 NC NC NC
CAN_YB5.Byte=RBDSR5;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_YB6.Byte=RBDSR6;
//D0D1 D2D3 D4D5 D6D7
//0~7系统电压
CAN_YB7.Byte=RBDSR7;
//D0D1 D2D3 D4D5 D6D7
//0~7雨刮间歇时长
//执行相关位判断
}
//前控左命令ID18ff128b(c7fe2516)
else */if(can_rec_id2==0x25 && can_rec_id3==0x16){
CAN_QKZC0.Byte=RBDSR0;
//D0D1 D2D3 D4D5 D6D7
//电源开关 彩灯1开关 彩灯2开关 司机灯开关
CAN_QKZC1.Byte=RBDSR1;
//D0D1 D2D3 D4D5 D6D7
//厢灯开关1 厢灯开关2 厢灯开关3 冷启动开关
CAN_QKZC2.Byte=RBDSR2;
//D0D1 D2D3 D4D5 D6D7
//电视开关 除霜低速 除霜高速 离合器开关
CAN_QKZC3.Byte=RBDSR3;
//D0D1D2 D3D4D5 D6D7
//左后视镜 右后视镜 NC
CAN_QKZC4.Byte=RBDSR4;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKZC5.Byte=RBDSR5;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKZC6.Byte=RBDSR6;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
CAN_QKZC7.Byte=RBDSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
//执行相关位判断
//电源唤醒
if(CAN_QKZC0.Bit.BIT0==1 && CAN_QKZC0.Bit.BIT1==0) vcc_wakeup_flag=1;
else vcc_wakeup_flag=0;
CAN_JLY0.Bit.BIT0=CAN_QKZC0.Bit.BIT0;
CAN_JLY0.Bit.BIT1=CAN_QKZC0.Bit.BIT1; //电源状态
}
//前控左状态ID18ff132b(c7fe2656)
else if(can_rec_id2==0x26 && can_rec_id3==0x56){
CAN_QKZS0.Byte=RBDSR0;
//D0D1 D2D3 D4D5 D6D7
//左前小灯 示廓灯组 左近光灯 前左转向灯
CAN_QKZS1.Byte=RBDSR1;
//D0D1 D2D3 D4D5 D6D7
//左远光灯 顶踏步灯 开关有效电源电子钟显示线
CAN_QKZS2.Byte=RBDSR2;
//D0D1 D2D3 D4D5 D6D7
//车内辅助灯蜂鸣器 顶灯1 顶灯2
CAN_QKZS3.Byte=RBDSR3;
//D0D1 D2D3 D4D5 D6D7
//顶灯3 左前雾灯 空调控制电源司机灯
CAN_QKZS4.Byte=RBDSR4;
//D0D1 D2D3 D4D5 D6D7
//彩灯1 彩灯2 换气扇电源 左镜加热器
CAN_QKZS5.Byte=RBDSR5;
//D0D1 D2D3 D4D5 D6D7
//阅读灯左路阅读灯右路 开关背光电源电子钟变光线
CAN_QKZS6.Byte=RBDSR6;
//D0D1 D2D3 D4D5 D6D7
//电视机 电子钟记忆线左后视镜电机NC
CAN_QKZS7.Byte=RBDSR7;
//D0D1 D2D3 D4D5 D6D7
//NC NC NC NC
//执行相关位判断
}
//前控右命令ID18ff138b(c7fe2716)
else if(can_rec_id2==0x27 && can_rec_id3==0x16){
CAN_QKYC0.Byte=RBDSR0;
//D0D1 D2D3 D4D5 D6D7
//前门开关 NC 后门开关 NC
CAN_QKYC1.Byte=RBDSR1;
//D0D1 D2D3 D4D5 D6D7
//前围门开 前围门关 镜加热开关 屈膝开关
CAN_QKYC2.Byte=RBDSR2;
//D0D1 D2D3 D4D5 D6D7
//阅读灯开关踏步灯开关 后雾灯开关 辅助灯开关
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -