没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
can总线的通信硬软件源码总线的通信硬软件源码
本文主要介绍can总线的通信原理以及硬软件源码,感兴趣的朋友可以看看。
CAN通讯的优点在此就不多说了,10公里,5Kb/s的速度是能保证的。
第一步:硬件环境的建立。
这里采用的是SJA1000作为总线控制器,CTM8251模块作为总线驱动器。MCU采用的是MEGA16:利用I/O口模拟数据总
线,当然也可以使用有总线的MCU:MCS-51,MEGA8515等。
原理图如下:
第二步:SJA1000的控制
首先阅读下SJA1000的手册,基本了解下SJA1000的结构,主要是寄存器方面的。还要了解下CAN总线方面的东西:
BasicCAN,PeliCAN,远程帧,数据帧等等……
SJA1000工作之前需要配置一下,才能正常工作,没有经过配置的SJA1000回拉坏总线的:组成网络的时候,如果其中有的
SJA1000没有正确配置,这个设备会干扰总线,使其它设备的数据发送不出去。
怎么才能控制SJA1000呢,请看下面的SJA1000读写的时序图:
写的时序
根据时序要求,可以利用I/O口模拟总线了:
//**************************读SJA1000*************************//
uintRead_SJA1000(uintaddress)
{
uchardata;
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();
returndata;
}
//**************************写SJA10000*************************//
voidWrite_SJA1000(uintaddress,uintdata)
{asm("nop");
//uinttemp1,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复位初始化********************//
voidCAN_Init(void)
{uchari_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=0FFH
Write_SJA1000(CAN_AMR1,0x00);//配置验收屏蔽AMR1=000H
Write_SJA1000(CAN_AMR2,0xff);//配置验收屏蔽AMR2=0FFH
Write_SJA1000(CAN_AMR3,0x00);//配置验收屏蔽AMR3=000H
Write_SJA1000(CAN_ACR1,0x00);//配置验收代码ACR1=0:广播
Write_SJA1000(CAN_ACR3,addr);//配置验收代码ACR3=地址
Write_SJA1000(CAN_BTR0,0x7f);//配置总线定时--5kbps
Write_SJA1000(CAN_BTR1,0xff);
Write_SJA1000(CAN_OCR,0x1a);//配置输出控制
Write_SJA1000(CAN_EWLR,0xff);//配置错误报警限制为255
do
{
Write_SJA1000(CAN_MOD,0x00);//进入工作模式双滤波
剩余10页未读,继续阅读
资源评论
weixin_38531630
- 粉丝: 2
- 资源: 887
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功