如何一步一步建立CAN通讯
CAN通讯的优点在此就不多说了,10公里,5Kb/s的速度是能保证的。第一步:硬件环境的建立。这里采用的是SJA1000作为总线控制器,CTM8251模块作为总线驱动器。MCU采用的是MEGA16:利用I/O口模拟数据总线,当然也可以使用有总线的MCU:MCS-51,MEGA8515等。原理图如下:第二步:SJA1000的控制首先阅读下SJA1000的手册,基本了解下SJA1000的结构,主要是寄存器方面的。还要了解下CAN总线方面的东西:BasicCAN,Peli CAN,远程帧,数据帧等等……SJA1000工作之前需要配置一下,才能正常工作,没有经过配置的SJA1000回拉坏总线的:组成网络的时候,如果其中有的SJA1000没有正确配置,这个设备会干扰总线,使其它设备的数据发送不出去。怎么才能控制SJA1000呢,请看下面的SJA1000读写的时序图:写的时序根据时序要求,可以利用I/O口模拟总线了://**************************读SJA1000*************************//uint Read_SJA1000(uint address){uchar data;asm("nop");ALE_off;WR_on;RD_on;CAN_cs_on;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址 //再次输出地址,确保一致。asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;RD_off;asm("nop");//delay5us(2);asm("nop");DDRA=0x00; //数据口为输入PORTA=0xff; //上拉asm("nop");data=PINA; //获得数据asm("nop");//delay5us(1);RD_on;CAN_cs_on;asm("nop");//delay5us(2);//dog();return data;}//**************************写SJA10000*************************//void Write_SJA1000(uint address,uint data){ asm("nop");//uint temp1,temp2;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址CAN_cs_on;ALE_off;WR_on;RD_on;asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址 再次输出地址,确保数据准确asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;WR_off;asm("nop");//delay5us(1);asm("nop");//DDRA=0xff;PORTA=data; //输出数据asm("nop");//delay5us(2);WR_on;PORTA=data; //再次输出数据,取保一致CAN_cs_on;asm("nop");//delay5us(2);asm("nop");//dog();}现在可以读写SJA1000了。配置SJA1000需要使SJA1000进入复位模式,然后对一些寄存器写入数据。在这里,CAN使用Pelican模式,速率为5K,双滤波工作,//*************************CAN复位初始化********************//void CAN_Init(void){ uchar i_temp=0,j_temp=0;CLI();//Read_SJA1000(CAN_IR); //读中断寄存器,清除中断位Write_SJA1000(CAN_MOD,0x01);while(!(Read_SJA1000(CAN_MOD)&0x01))//保证进入复位模式,bit0.0不为1,再写CAN_MOD{Write_SJA1000(CAN_MOD,0x01);dog();}Write_SJA1000(CAN_CDR,0xc8); //配置时钟分频寄存器-Pelican,CBP=1,//关闭TX1中断与时钟输出Write_SJA1000(CAN_AMR0,0xff); //配置验收屏蔽AMR0=0FFHWrite_SJA1000(CAN_AMR1,0x00); //配置验收屏蔽AMR1=000HWrite_SJA1000(CAN_AMR2,0xff); //配置验收屏蔽AMR2=0FFHWrite_SJA1000(CAN_AMR3,0x00); //配置验收屏蔽AMR3=000HWrite_SJA1000(CAN_ACR1,0x00); //配置验收代码ACR1=0:广播Write_SJA1000(CAN_ACR3,addr); //配置验收代码ACR3=地址Write_SJA1000(CAN_BTR0,0x7f); //配置总线定时--5kbpsWrite_SJA1000(CAN_BTR1,0xff);Write_SJA1000(CAN_OCR,0x1a); //配置输出控制Write_SJA1000(CAN_EWLR,0xff); //配置错误报警限制为255do{Write_SJA1000(CAN_MOD,0x00); //进入工作模式双滤波dog();}while((Read_SJA1000(CAN_MOD))&0x01); // 确认复位标志是否被删除Write_SJA1000(CAN_TXB+4,ID3); //配置发送缓冲区的ID3-Write_SJA1000(CAN_IER,0x07); //配置SJA10000中断-错误报警/发送/接收中断SEI();}在这之前,需要获取设备的地址,就是读取拨码开关各个脚的电平。需要注意的是,SJA1000使用的是双滤波模式,响应地址有:广播的:0x00,还有自己的地址:0x**。为什么要这么做呢,一个系统中,主机的地址一般是0X00,从机地址从0X01开始,这里面如果有两个从机的地址一样,就很可能产生一些混乱。从机一旦多了起来,查找地址相同的设备就有些麻烦了。在程序的初始化的时候,进行SJA1000的配置。第三部:工作程序接下来,做的工作就是CAN试发送,别小看这个试发送,这可是解决地址重复的问题的哦,还能检测CAN网络是否正常。//****************CAN第一次发送 通讯地址测试2e*****************//void CAN_first_send(void){ //uchar add_temp=0;uchar a_temp=0;uchar SR_temp;asm("nop"); //延时NET_LED_on; //打开网络灯do{a_temp=Read_SJA1000(CAN_SR);//读CAN_SR,直到SR.2=1:CPU可以发送数据dog();}while(!(a_temp&0x04))CLI(); //关CAN中断,即总中断Write_SJA1000(CAN_TXB+0,0xc0); //发送远程帧0xc0Write_SJA1000(CAN_TXB+1,0x00); //发送转接器地址Write_SJA1000(CAN_TXB+2,addr); //发送传感器地址Write_SJA1000(CAN_TXB+3,0x2e); //发送命令码0x2eWrite_SJA1000(CAN_TXB+4,ID3); //发送ID3Write_SJA1000(CAN_CMR,0x01); //启动发送,//网络故障错误在中断中处理,短接H、L,按复位,先亮绿灯,后黄灯亮asm("nop");//SEI();}SJA1000的中断引脚接到MEGA16的INT1上,需要在程序初始化的时候,配置一些INT1,使MCU能响应SJA1000的中断。数据发送前,点亮网络指示灯,什么时候熄灭它呢,在发送中断中熄灭它。下面看看MCU对SJA1000中断的一些处理:在这里只处理:接收中断、发送中断、总线关闭中断。#pragma interrupt_handler can_int:3void can_int(void){asm("nop");CAN_IR_temp=Read_SJA1000(CAN_IR); //读取中断寄存器if(CAN_IR_temp&0x01) //接收中断{Get_RXB_temp();if(RxBuffer[0]==0x80) //地址测试数据帧{reload(); //数据帧中有和自己相同的地址}if(RxBuffer[0]==0xc0) // 远程帧则释放接收缓冲区{type=RxBuffer[3]; //读命令码//处理命令码if(type==0x30){ if(type==0x34){CAN_now_value_send();type=0;} //传瞬时值数据if (type==0x27){reload(); type=0;}//装置复位if(type==0x2e){active();type=0;} //通讯地址测试}Write_SJA1000(CAN_CMR,0x04); //释放接收缓冲区}if(CAN_IR_temp&0x02) //发送中断{NET_LED_off; //关闭网络灯ERR_LED_off; //关闭故障灯CANBE_JSQ=0; //复位总线关闭计数器asm("nop");}if(CAN_IR_temp&0x04) //错误报警中断(仅有总线关闭处理){ //读状态寄存器,SR.7总线关闭:CAN控制器不参与总线活动CAN_SR_temp=Read_SJA1000(CAN_SR);if(CAN_SR_temp&0x80){CANBE_JSQ=CANBE_JSQ+1; //关闭次数加1if(CANBE_JSQ
关键词: CAN通讯硬件环
您可能也感兴趣:
为您推荐
隔离险受不少年轻人推崇 不仅看理赔条款还要看免责条款
北京发布社保对账单公告 4月起可查询电子版个人缴费信息
广东启动车险市场专项整治行动 保护消费者合法权益
排行
最近更新
- 如何一步一步建立CAN通讯
- 2020民营银行概念股票有哪些?2020民营银行概念股票一览
- 山水比德网上申购中签号出炉 300844山水比德中签号查询
- 2021年医药电商概念股一览,医药电商概念股票有哪些
- 2021年小金属股票有那些?小金属概念龙头股一览
- 长江经济带上市公司有哪些?长江经济带概念股票介绍
- 食用油上市公司有哪些?食用油概念股龙头一览
- 11月11日金属铜概念行情及资金流向查询
- 自己动手DIY制作LED显示屏
- 无损检测工艺概述
- ISim你不得不知的技巧
- avr单片机流水灯汇编程序及电路图
- 酷比魔方U30GT双核豌豆拆解
- 逗号科技完成数千万A+轮融资,加速推进决策优化算法行业应用...
- 铁路RFID上市公司有哪些?相关上市公司龙头一览
- 食品安全股票的龙头有哪些,食品安全概念股一览
- 2021年运输板块龙头股有哪些?运输概念股一览
- 土壤修复行业股票有哪些?土壤修复概念股名单
- 碧水源(300070)董事长介绍
- 高通滤波器原理
- 老板,示波器多少钱一斤?
- 3D打印机把制造PCB变得越来越简单!
- “拿着高薪去创业”走红! 万兴科技副总裁3月13日开启招聘直播
- 专访零转创始人马遥:与其创造无用的需求,不如赋能有用的闲置
- 3.8女神节,日日顺供应链以定制化方案吹响女性健身消费时代号角
- 专访零转创始人马遥:与其创造无用的需求,不如赋能有用的闲置
- 陕西省将加大财政投入力度 推动农业保险持续“扩面”
- 山西出台24条工作措施 解决个体工商户急难愁盼问题
- 广东华兴银行佛山分行开展妇女节主题活动 ---三月八日华兴与...
- 山西焦煤与山西大学、大地控股签订合作协议 推进产学研用一体化