首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CAN总线的通信问题

//控制命令ID18ff0f8a(c7fe1f14)
#define LOCAL_CMD_ADR0 0xc7
#define LOCAL_CMD_ADR1 0xfe
#define LOCAL_CMD_ADR2 0x1f
#define LOCAL_CMD_ADR3 0x14
//状态ID18ff102b(c7fe2056)
#define LOCAL_STA_ADR0 0xc7
#define LOCAL_STA_ADR1 0xfe
#define LOCAL_STA_ADR2 0x20
#define LOCAL_STA_ADR3 0x56

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_Transmit(void)
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x01; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
TB0DLR = 0x08; //设置传送数据长度为8个字节。

TB0DSR0 = CAN_STR0.Byte; //传送本地状态数据
TB0DSR1 = CAN_STR1.Byte;
TB0DSR2 = CAN_STR2.Byte;
TB0DSR3 = CAN_STR3.Byte;
TB0DSR4 = CAN_STR4.Byte;
TB0DSR5 = CAN_STR5.Byte;
TB0DSR6 = CAN_STR6.Byte;
TB0DSR7 = CAN_STR7.Byte;

TB0IDR0 = LOCAL_STA_ADR0; //设置本地ID
TB0IDR1 = LOCAL_STA_ADR1;
TB0IDR2 = LOCAL_STA_ADR2;
TB0IDR3 = LOCAL_STA_ADR3;

TB0TBPR = 0x05; //设置优先级别
CTFLG = 0x01; //启动发送
}
}

//***********************CAN命令执行函数********
void CAN_comm(void)//ID1
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x04; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
TB2DLR = 0x08; //设置传送数据长度为8个字节。

TB2DSR0 = CAN_CMD0.Byte; //传送本地状态数据
TB2DSR1 = CAN_CMD1.Byte;
TB2DSR2 = CAN_CMD2.Byte;
TB2DSR3 = CAN_CMD3.Byte;
TB2DSR4 = CAN_CMD4.Byte;
TB2DSR5 = CAN_CMD5.Byte;
TB2DSR6 = CAN_CMD6.Byte;
TB2DSR7 = CAN_CMD7.Byte;

TB2IDR0 = LOCAL_CMD_ADR0; //设置本地ID
TB2IDR1 = LOCAL_CMD_ADR1;
TB2IDR2 = LOCAL_CMD_ADR2;
TB2IDR3 = LOCAL_CMD_ADR3;

TB2TBPR = 0x05; //设置优先级别
CTFLG = 0x04; //启动发送
}
}
//******************** CAN接收中断子程序 OK**********************
void interrupt CAN_Receive(void)
{
volatile unsigned char ID_ADDS0;
volatile unsigned char ID_ADDS1;
volatile unsigned char ID_ADDS2;
volatile unsigned char ID_ADDS3;
ID_ADDS0 = RBIDR0; //读标识符寄存器0(0~3)
ID_ADDS1 = RBIDR1; //读标识符寄存器0(0~3)
ID_ADDS2 = RBIDR2; //读标识符寄存器0(0~3)
ID_ADDS3 = RBIDR3; //读标识符寄存器0(0~3)

if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x01 && ID_ADDS3==0x10)
{
//CAN_SWITCH_COMR0.Byte=RBDSR0; //转存接受缓冲数据段寄存器0(0~7)
CAN_SWITCH_COMR1.Byte=RBDSR1; //转存接受缓冲数据段寄存器1
CAN_SWITCH_COMR2.Byte=RBDSR2; //转存接受缓冲数据段寄存器2
CAN_SWITCH_COMR3.Byte=RBDSR3; //转存接受缓冲数据段寄存器3
CAN_SWITCH_COMR4.Byte=RBDSR4; //转存接受缓冲数据段寄存器4
//CAN_SWITCH_COMR5.Byte=RBDSR5; //转存接受缓冲数据段寄存器5
//CAN_SWITCH_COMR6.Byte=RBDSR6; //转存接受缓冲数据段寄存器6
CAN_SWITCH_COMR7.Byte=RBDSR7; //转存接受缓冲数据段寄存器7
}

else if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x27 && ID_ADDS3==0x16)
{
CAN_FORMER2_COMR0.Byte=RBDSR0;
CAN_FORMER2_COMR1.Byte=RBDSR1;
CAN_FORMER2_COMR2.Byte=RBDSR2;
}

CRFLG = 0x01; //清缓冲满标志(接受标志寄存器)
}
欢迎大家到汽车电子群2838085!
让我们推动中国汽车前进!
这是我的 用的好好的啊
欢迎大家到汽车电子群2838085!
让我们推动中国汽车前进!
返回列表