📄 can.h
字号:
//尾控控制命令ID18ff0c89(c7fe1912)
#define LOCAL_CMD_ADR0 0xc7
#define LOCAL_CMD_ADR1 0xfe
#define LOCAL_CMD_ADR2 0x19
#define LOCAL_CMD_ADR3 0x12
//尾控状态ID18ff0d2b(c7fe1a56)
#define LOCAL_STA_ADR0 0xc7
#define LOCAL_STA_ADR1 0xfe
#define LOCAL_STA_ADR2 0x1a
#define LOCAL_STA_ADR3 0x56
//尾控数据ID18ff1a89(c7fe3512)
#define LOCAL_DAT_ADR0 0xc7
#define LOCAL_DAT_ADR1 0xfe
#define LOCAL_DAT_ADR2 0x35
#define LOCAL_DAT_ADR3 0x12
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
CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;//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;
unsigned char can_comm_count=0;
unsigned char can_data_count=0;
unsigned char can_free_count=0;
unsigned long licheng=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; //设置本地ID18ff102b(c7fe2056)
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; //设置本地ID18ff0f8a(c7fe1f14)
IDR12 = LOCAL_CMD_ADR1;
IDR22 = LOCAL_CMD_ADR2;
IDR32 = LOCAL_CMD_ADR3;
TBPR2 = 0x05; //设置优先级别
CTFLG = 0x04; //启动发送
}
}
//***********************尾控数据CAN发送函数 ********
void CAN_DATA(void)//ID2
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x02; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
DLR1 = 0x08; //设置传送数据长度为8个字节。
DSR01 = CAN_DATA0.Byte; //传送本地状态数据
DSR11 = CAN_DATA1.Byte;
DSR21 = CAN_DATA2.Byte;
DSR31 = (unsigned char)(licheng>>16);//CAN_DATA3.Byte;
DSR41 = (unsigned char)(licheng>>8);//CAN_DATA4.Byte;
DSR51 = (unsigned char)licheng;//CAN_DATA5.Byte;
DSR61 = CAN_DATA6.Byte;
DSR71 = CAN_DATA7.Byte;
IDR01 = LOCAL_DAT_ADR0; //设置本地ID18ff1a89(c7fe3512)
IDR11 = LOCAL_DAT_ADR1;
IDR21 = LOCAL_DAT_ADR2;
IDR31 = LOCAL_DAT_ADR3;
TBPR1 = 0x05; //设置优先级别
CTFLG = 0x02; //启动发送
can_data_count=0;
}
else can_data_count--;
}
//******************** CAN接收中断子程序 OK**********************
void interrupt 20 CAN_Receive(void)
{
void CAN_YB(void);
void CAN_QKZC(void);
void CAN_ZKC(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;
if(VACC_WAKE==0) licheng=0;
}
else INC_WAKE=1;
//执行仪表CAN命令
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -