CAN学习小结_看起来做个毕业设计不错

本文介绍了CAN总线的基础知识及其在实际项目中的应用案例。重点讲解了如何利用飞利浦SJA1000 CAN控制器与8051微控制器进行通讯配置,包括初始化设置、发送及接收数据的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近心血来潮,学了CAN总线,据说是最有前途的现场总线          之一。EDN助学—CAN学习小组的老师们的无私奉献、http://group.ednchina.com/684/

 

大家经常采用RS232,RS485通讯方式,是因为它们简单!但是当你学会了CAN总线后,就知道CAN
总线比它们更简单!你会在以后的设计中毫不犹豫的采用CAN总线作为通讯方式!

采用独立can控制器飞利浦的SJA1000 can收发器采用PCA82C250T - (CAN controller interface )。微控制器采用8051(SJA1000作为51的外部ram使用)

 

为了看懂程序必须先看寄存器,sja1000寄存器那个复杂,看了老长时间才看出个大概,不过还好,sja1000作为51 的外部ram。直接像访问外部ram一样对寄存器进行操作就OK'

 

//CAN 初始化函数
void Init_CAN(void)
{
unsigned char bdata temp; //建立存储在bdata 中的临时变量temp
do
{
MODR=0x09; temp=MODR; //模式寄存器-设置复位模式而且单验收滤波模式
}
while(!(temp&0x01)); //判断
CDR=0x88; //时钟分频寄存器-设置PeliCAN 模式,Clock off 有效
BTR0=0x31; //总线时序寄存器-波特率为10kbps
BTR1=0x1c;
IER=0x01; //中断使能寄存器-接收中断使能
OCR=0xaa; //输出控制寄存器-借签...
CMR=0x04; //命令寄存器-释放RXFIF0
ACR0='C'; //接收代码寄存器-本节点地址位CAN0
ACR1='A';
ACR2='N';
ACR3=0x00;
AMR0=0x00; //接收屏蔽寄存器-无任何屏蔽
AMR1=0x00;
AMR2=0x00;
AMR3=0x03; //最后两位为无用位,必须设置为逻辑1
/*根据想要设置的模式而进行设置,这里设置了自检测模式*/
do
{
MODR=0x08; temp=MODR; //模式寄存器-推出复位模式,保持单验收滤波模式
}
while(temp&0x01); //判断...
}

******************************************************************************************

86
节点发送函数:
#include "reg52.h"
#include "sja1000.h"
unsigned char Txd_data;
//CAN 节点发送函数
void CAN_TXD(void)
{
unsigned char bdata temp;
do
{
temp=SR; //判断报文接收完毕?
}
while(temp&0x10); //SR.4=0 发送闲置,SR.4=1 发送状态中
do
{
temp=SR; //判断最后报文请求?
}
while(!(temp&0x08)); //SR.3=0 没有余报文请求,SR.3=1 还存在报文请求
do
{
temp=SR; //判断TXFIFO 是否锁定?
}
while(!(temp&0x04)); //SR.2=0 锁定,SR.2=1 开放
TBSR0=0x88; //ff=1 SFF 格式,DLC.3=1 数据长度8
TBSR1='C'; //目标节点地址CAN0
TBSR2='A';
TBSR3='N';
TBSR4=0x00;
TBSR5=Txd_data; //数据
TBSR6=0x00;
TBSR7=0x00;
TBSR8=0x00;
TBSR9=0x00;
TBSR10=0x00;
TBSR11=0x00;
TBSR12=0x00;
CMR=0x01; //命令寄存器-发送请求
}

 

*********************************************************************************

#include"reg52.h"
#include "sja1000.h"
unsigned char bdata temp;
unsigned char RX_buffer[13];
//节点接收函数
void CAN_RXD(void)
{
temp = IR;
if( temp & 0x01) //判断是否接收中断
{
RX_buffer[0] = RBSR; //读取RXFIFO
RX_buffer[1] = RBSR1;
RX_buffer[2] = RBSR2;
RX_buffer[3] = RBSR3;
RX_buffer[4] = RBSR4;
RX_buffer[5] = RBSR5;
RX_buffer[6] = RBSR6;
RX_buffer[7] = RBSR7;
RX_buffer[8] = RBSR8;
RX_buffer[9] = RBSR9;
RX_buffer[10] = RBSR10;
RX_buffer[11] = RBSR11;
RX_buffer[12] = RBSR12;
CMR = 0X04; //释放RXFIFO 中的空间
temp = ALC; //释放仲裁随时捕捉寄存器
temp = ECC; //释放错误代码捕捉寄存器
}
}
//单片机外部中断1
void Ir_EX1( void ) interrupt 2
{
void CAN_RXD(void); //调用接收函数
}

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/*CAN 总线SJA1000寄存器地址定义(用的是PeliCAN 模式,扩展帧EFF 模式)*/
#define uchar unsigned char
uchar xdata MODR _at_ 0xFE00; // 模式寄存器
uchar xdata CMR _at_ 0xFE01; // 命令寄存器
uchar xdata SR _at_ 0xFE02; // 状态寄存器
uchar xdata IR _at_ 0xFE03; // 中断寄存器
uchar xdata IER _at_ 0xFE04; // 中断使能寄存器
uchar xdata BTR0 _at_ 0xFE06; // 总线定时寄存器0 ;总线波特率的选择
uchar xdata BTR1 _at_ 0xFE07; // 总线定时寄存器1 ;总线波特率的选择
uchar xdata OCR _at_ 0xFE08; // 输出控制寄存器
uchar xdata ACR _at_ 0xFE10;//16;
uchar xdata ACR1 _at_ 0xFE11;//17;
uchar xdata ACR2 _at_ 0xFE12;//18;
uchar xdata ACR3 _at_ 0xFE13;//19; // 接收代码(0x16_0x19);接收过滤位选择*复位模式
uchar xdata AMR _at_ 0xFE14;//20;
uchar xdata AMR1 _at_ 0xFE15;//21;
uchar xdata AMR2 _at_ 0xFE16;//22;
uchar xdata AMR3 _at_ 0xFE17;//23; // 掩码(0x20_0x23); 接收过滤的选择*复位模式
uchar xdata CDR _at_ 0xFE1F;//31; // 时钟分频器
uchar xdata ALC _at_ 0xFE0B;//11; // 仲裁丢失捕捉寄存器
uchar xdata ECC _at_ 0xFE0C;//12; // 误码捕捉寄存器

uchar xdata TBSR _at_ 0xFE10;//16; //TX 帧信息(标准帧、扩展帧)寄存器
uchar xdata TBSR1 _at_ 0xFE11;//17; //TX 帧信息(标准帧数据1、扩展帧识别码1)寄存器
uchar xdata TBSR2 _at_ 0xFE12;//18; //TX 帧信息(标准帧数据1、扩展帧识别码2)寄存器
uchar xdata TBSR3 _at_ 0xFE13;//19; //TX 帧信息(标准帧数据1、扩展帧识别码3)寄存器
uchar xdata TBSR4 _at_ 0xFE14;//20; //TX 帧信息(标准帧数据2、扩展帧识别码4)寄存器
uchar xdata TBSR5 _at_ 0xFE15;//21; //TX 帧信息(标准帧数据3、扩展帧数据1)寄存器
uchar xdata TBSR6 _at_ 0xFE16;//22; //TX 帧信息(标准帧数据4、扩展帧数据2)寄存器
uchar xdata TBSR7 _at_ 0xFE17;//23; //TX 帧信息(标准帧数据5、扩展帧数据3)寄存器
uchar xdata TBSR8 _at_ 0xFE18;//24; //TX 帧信息(标准帧数据6、扩展帧数据4)寄存器
uchar xdata TBSR9 _at_ 0xFE19;//25; //TX 帧信息(标准帧数据7、扩展帧数据5)寄存器
uchar xdata TBSR10 _at_ 0xFE1A;//26; //TX 帧信息(标准帧数据8、扩展帧数据6)寄存器
uchar xdata TBSR11 _at_ 0xFE1B;//27; //TX 帧信息(扩展帧数据7)寄存器
uchar xdata TBSR12 _at_ 0xFE1C;//28; //TX 帧信息(扩展帧数据8)寄存器


uchar xdata RBSR _at_ 0xFE10;//16; //RX 帧信息(标准帧、扩展帧)寄存器
uchar xdata RBSR1 _at_ 0xFE11;//17; //RX 识别码(标准帧、扩展帧)寄存器1
uchar xdata RBSR2 _at_ 0xFE12;//18; //RX 帧信息(标准帧、扩展帧)识别码2寄存器
uchar xdata RBSR3 _at_ 0xFE13;//19; //RX 帧信息(标准帧数据1、扩展帧识别码3)寄存器
uchar xdata RBSR4 _at_ 0xFE14;//20; //RX 帧信息(标准帧数据2、扩展帧识别码4)寄存器
uchar xdata RBSR5 _at_ 0xFE15;//21; //RX 帧信息(标准帧数据3、扩展帧数据1)寄存器
uchar xdata RBSR6 _at_ 0xFE16;//22; //RX 帧信息(标准帧数据4、扩展帧数据2)寄存器
uchar xdata RBSR7 _at_ 0xFE17;//23; //RX 帧信息(标准帧数据5、扩展帧数据3)寄存器
uchar xdata RBSR8 _at_ 0xFE18;//24; //RX 帧信息(标准帧数据6、扩展帧数据4)寄存器
uchar xdata RBSR9 _at_ 0xFE19;//25; //RX 帧信息(标准帧数据7、扩展帧数据5)寄存器
uchar xdata RBSR10 _at_ 0xFE1A;//26; //RX 帧信息(标准帧数据8、扩展帧数据6)寄存器
uchar xdata RBSR11 _at_ 0xFE1B;//27; //RX 帧信息(扩展帧数据7)寄存器
uchar xdata RBSR12 _at_ 0xFE1C;//28; //RX 帧信息(扩展帧数据8)寄存器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值