CAN总线的实现-SJA1000实例

合集下载

单片机与SJA1000CAN控制器接口电路图

单片机与SJA1000CAN控制器接口电路图

单片机与SJA1000CAN控制器接口电路图单片机与SJA1000 CAN控制器接口电路图图2为C8051F020型单片机与SJA1000型控制器的硬件连接电路原理。

SJA1000占用了0x8000-0x80FF的外部RAM空间。

当单片机访问以上空间时片选信号会选中SJA1000。

C8051F020有高低2个外部存储器接口。

因此,SJA1000的AD0-AD7连接到C8051F020的高端口P7口,CS连接到基址为0x8000的外部存储器片选信号。

当C8051F020访问地址0x8000-0x80FF时,CPU可对SJA1000执行相应的读/写操作。

SJA1000的RD、WR和ALE分别与C8051F020的对应引脚相连,INT接C8051F020的INT0引脚,于是C8051F020可通过中断方式访问SJA1000。

SJA1000的复位信号RST为低电平有效。

C8051F020的AD0-AD7口用于地址/数据的输入/输出,将其配置为漏极开路方式,利用4.7kΩ上拉电阻器拉至5V。

通过设置数字交叉开关,将C8051F020的外部中断引脚配置到P2.7口。

CAN能够使用多种物理介质,例如双绞线和光纤等。

该设计方案采用双绞线。

信号以差分电压传送,2条信号线为CAN_H和CAN_L,静态时为2.5V,此时状态表示逻辑"1",也叫做"隐性"。

CAN_H比CAN_L高,表示逻辑"0",称为"显性",此时CAN_H=3.5V,CAN_L =1.5V。

TJA1050型CAN总线收发器是CAN协议控制器和物理总线之间的接口,CAN总线上二端节点须加60Ω电阻器和47nF电容器将信号吸收,以避免信号反射。

为了增强CAN总线节点的抗干扰能力,SJA1000的TX1与RX1通过6N137型高速光耦后与TJA1050相连。

这样就很好地实现了总线上各CAN节点间的电气隔离。

sja1000 can 驱动程序演示实验

sja1000 can 驱动程序演示实验

SJA1000 CAN驱动程序演示实验一.实验目的本驱动程序展示了如何在Small RTOS中编写SJA1000 的驱动程序。

通过调用CAN 程序库SJA1000_PEI.LIB 的基本函数,实现实验板上CAN 节点的初始化以及CAN 节点数据收发测试。

二.实验设备及器件PC 机一台DP-51PROC 单片机综合仿真实验仪一台CAN PARK 模块一台CAN 连接线一根三.实验步骤1、将CAN-bus PARK 插入到A6 区中,用导线连接A6 区的P1_IO2 到A2 区的P1 0,连接A6 区的P1_CS1 到A2 区的A15。

2、使用导线把A2 区的P16 和P17 分别于D5 区的SCL 和SDA 相连。

使用导线把D 5区的/RST 与VCC 相连。

3、由于本程序使用中断方式响应SJA1000 中断,故将A5 区的P1_INT 接到A2 区的INT0。

4、利用CAN 连接线将两台已经安装了CAN-Bus 模块的DP-51PROC 连接起来,以组成简单的CAN 网络实现CAN 的接收和发送。

5、本驱动程序已经将输出文件路径设置为“E:\Temp”,用户可自行更改输出文件路径。

将路径“E:\Temp”中的CAN. hex 文件下载到两台DP-51PROC 中运行。

四.实验参考程序主要部分/*******************************************************描述:独立的CAN 控制器SJA1000PeliCAN 在small rtos 中的应用示例*文件名: PELIRTOS.c*应用语言: KEIL C51*应用系统: small rtos*版本: V1.0*广州周立功单片机发展有限公司保留所有的版权****************************************************/#define _TIME_MODULE_H#define _SERIAL_H/********************************************************** 导入头文件******************************************************/#include "INCLUDES.h"#include "Sja1000_peli.h"sfr IPH=0xb7;sbit RESET_PIN=P1^0;// 验收代码/屏蔽寄存器的内容(4+4)uint8 xdata Send_CAN_Filter[8]={0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff};// 帧信息和标示码(1+4)分别对应TX,TX1,TX2,TX3,TX4uint8 xdata Send_CAN_Info_ID[3]={0xc7,0x0A,0x0B};uint8 xdata Recv_CAN_Info_ID[3];// 待发送数据(8)uint8 xdataSend_CAN_Data[13]={0xc7,0x0A,0x0B,0x04,0x05,0x06,0x07,0x08,0x07,0x0 8,0x07,0x08,0x08};uint8 xdata Recv_CAN_Data[14];uint8 xdata time_Counter=0;uint8 xdata BTR0,BTR1;uint16 xdata *p;uint8 xdata disp_buf[8];void CAN_Send(void);void display(void);void CAN_Rcv(void);void TimeSum(void);void Delay_ms(uint8 j);void SJA1000_Config_Normal(void);void Init(void){CKCON=1; //应用6clockTMOD = (TMOD & 0XF0) | 0X01;TCON=TCON|0x04; //MCU 的INT1 下降沿触发,INT0 电平触发TH0 = (65536 - (11059200 / 12) / 100) / 256;TL0 = (65536 - (11059200 / 12) / 100) % 256;TR0 = 1;ET0 = 1;TF0 = 0;}/************************************************************** ****函数名称:void CAN_Init(void)**功能描述:复位SJA1000,并设置其工作在正常模式************************************************************** ***/void CAN_Init(void){RESET_PIN=0; //将SJA1000 的复位线与P1.0 相连接Delay_ms(1);RESET_PIN=1; //控制P1.0 来实现SJA1000 的复位SJA_CS_Point=&CAN_SJA_BaseAdr;SJA1000_Config_Normal();WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000 接收中断EX0=1;}/************************************************************** ** 函数原型: void Delay_ms(uchar j)** 功能描述: 该函数用于不精确的延时。

sja1000_can控制器basiccan模块概要

sja1000_can控制器basiccan模块概要
CMR.1
AT
中止发送
无动作
1当前信息被发送
CMR.0 TR
发送请求
--
注并要求SJA1000向CAN总线发送该
帧时
将产生一个发送中断
中止传送位是在CPU要求当前传送暂停时使用的
传送一条紧急信息
要查看原始信息是否被成功发送不过
释放
可以通过设置释放接收缓冲器位为1来释放RXFIFO中当前信息的内存空间
BTR0.4 BRP.4波特率预设值4 × ×
总线定时0
BTR0.3 BRP.3波特率预设值3 × ×
BTR0.2 BRP.2波特率预设值2 × ×
BTR0.1 BRP.1波特率预设值1 × ×
BTR0.0 BRP.0波特率预设值0 × ×
BTR1.7 SAM采样× ×
BTR1.6 TSEG2.2时间段2.2 × ×
将清除状态寄存器中的接收缓冲器状态位
如果数据溢出位被置位
在释放接收缓冲器命令的
同时是可以发出清除数据溢出命令的
SJA1000进入睡眠模式
只要破坏这三种条件的其中一种
在复位模式中
2.3.3.3状态寄存器
状态寄存器对微控制器来说是只读存储器
CAN地址2

符号
名称
值功能
1
总线关闭
SJA1000加入总线活动
至少出现一个错误计数器满或超过
CPU报警限制
两个错误计数器都在报警限制以下SJA1000在传送信息
SJA1000正在接收信息
最近一次发送请求被成功处理
文档编号
CPU可以向发送缓冲器写信息
CPU不能访问发送缓冲器
1
溢出
SR.1
DOS

SJA1000 独立的CAN控制器应用指南-外文资料翻译

SJA1000 独立的CAN控制器应用指南-外文资料翻译

外文资料翻译译文SJA1000 独立的CAN控制器应用指南1 介绍SJA1000是一个独立的CAN控制器,它在汽车和普通的工业应用上有先进的特征。

由于它和PCA82C200 在硬件和软件都兼容,因此它将会替代PCA82C200。

SJA1000有一系列先进的功能适合于多种应用,特别在系统优化、诊断和维护方面非常重要。

本文是要指导用户设计基于SJA1000 的完整的CAN节点。

同时本文还提供典型的应用电路图和编程的流程图。

2 概述SJA1000 独立的CAN控制器有2个不同的操作模式:BasicCAN模式(和PCA82C200)兼容PeliCAN模式BasicCAN模式是上电后默认的操作模式。

因此,用PCA82C200开发的已有硬件和软件可以直接在SJA1000上使用,而不用作任何修改。

PeliCAN模式是新的操作模式,它能够处理所有CAN2.0B 规范的帧类型。

而且它还提供一些增强功能使SJA1000能应用于更宽的领域。

2.1 CAN 节点结构通常,每个CAN 模块能够被分成不同的功能块。

SJA1000使用[3] [4] [5]最优化的CAN收发器连接到CAN 。

收发器控制从CAN控制器到总线物理层或相反的逻辑电平信号。

上面一层是一个CAN 控制器,它执行在CAN规范[8]里规定的完整的CAN协议。

它通常用于报文缓冲和验收滤波,而所有这些CAN功能,都由一个模块控制器控制它负责执行应用的功能。

例如,控制执行器、读传感器和处理人机接口(MMI)。

如图1所示,SJA1000独立的CAN控制器通常位于微型控制器和收发器之间,大多数情况下这个控制器是一个集成电路。

图1 CAN模块装置2.2 结构图下图是SJA1000 的结构图图2 SJA1000的结构图根据CAN规范,CAN核心模块控制CAN帧的发送和接收。

接口管理逻辑负责连接外部主控制器,该控制器可以是微型控制器或任何其他器件。

经过SJA1000复用的地址/数据总线访问寄存器和控制读/写选通信号都在这里处理。

基于SJA1000的CAN总线接口设计

基于SJA1000的CAN总线接口设计

基于SJA1000的CAN总线接口设计一、SJA1000简介SJA1000是一种独立的CAN控制器,用于移动目标和一般工业环境中的控制器局域网络(CAN)。

它是Philips公司早期CAN控制器PCA82C200(BasICCAN)的替代品,而且增加了一种新的工作模式(PeliCAN),这种模式支持具有很多新功能的CAN2.0B协议。

SJA1000与微处理器的接口主要由8根数据和地址分时复用线完成:AD0~AD7、ALE/AS、、/E、、、MODE和,其中MODE为接口方式选择信号,可设置成Intel方式或Motorola方式。

区别在于:Intel模式下,处理器对SJA1000写时,用、作为读、写数据信号,ALE下降沿锁存地址(此时地址信号要保证基本的建立保持时间),仅在读、写数据时为低;Motorola模式下,读、写信号用区分,用/E选通数据(下降沿锁存),AS和CS类似于Intel的ALE和。

二、CAN控制器与DSP的接口设计方法SJA1000的数据和地址信号为分时复用,而DSP为数据、地址信号分离的结构,而且DSP不提供ALE信号,设计的关键就是DSP要把SJA1000的地址当成数据写入并同时产生ALE信号。

分析读写信号所要求的最短有效时间,由于读低电平到数据有效的时间最长为50ns,所以要保证读信号有效时间至少50ns,ADSP21062在用2个软等待时,其低电平时间为62.5ns(25ns/2+2乘以25ns),可以满足要求。

三、DSP的接口信号和时序与早期的处理器不同,DSP芯片的片外引脚都采用地址线和数据线分离的设计方法,不再使用地址数据分时复用线,也没有ALE信号,这样就给CAN控制器与DSP的接口带来一定困难,且不同的DSP外部引脚和时序也略。

基于SJA1000的CAN节点设计v1.0

基于SJA1000的CAN节点设计v1.0

基于SJA1000的CAN节点设计文件信息类别内容关键词SJA1000,CTM系列隔离CAN收发器基于SJA1000的CAN节点设计摘要修订历史版本日期原因Rev X1 2006-12-13 内部制定初稿Rev 1.0 2006-12-15 第一次发布目录1. 基于SJA1000的CAN节点设计 (3)1.1 硬件设计电路 (3)1.1.1收发器隔离电路设计 (3)1.1.2 CAN总线接口设计 (4)1.2 软件设计 (5)程序清单1.1 定义片选地址 (5)程序清单1.2 初始化SJA1000 (5)程序清单1.3 发送报文 (6)2. 应用实例 (7)3. 声明 (1)1.基于SJA1000的CAN节点设计1.1 硬件设计电路CAN总线是一种最有前途的现场总线,因其优异性能而在工业控制、汽车电子、安防等方面得到广泛应用。

设计CAN-bus通讯接口是很重要的一个环节,设备的正确运行与其密切相关。

如图 1.1给出了一个实际的CAN-bus通讯单元电路图,电路结构为:MCU(P89C52)+CAN控制器(SJA1000)+隔离CAN收发器(CTM Module)。

图 1.1 CAN-bus通讯单元原理图如图 1.1所示,整个系统电源采用+5V电源输入,上电复位芯片(CAT810L)可保证上电时正确的启动系统。

微处理器采用PHILIPS的P89C52单片机,该系列单片机是80C51微控制器的派生器件,采用先进的CMOS工艺制造,指令系统与80C51完全相同。

CAN控制器采用PHILIPS的SJA1000,SJA1000是一款独立的控制器,用于汽车和一般工业环境中的控制器局域网络。

它是PHILIPS半导体PCA82C200 CAN控制器(BasicCAN)的替代产品。

而且,它增加了一种新的工作模式(PeliCAN),这种模式支持具有很多新特性的CAN 2.0B 协议,是目前市面上用的最广的一款CAN控制器。

CAN总线实验报告

CAN总线实验报告

CAN总线实验报告实验一SJA1000初始化一、实验要求:正确完成对SJA1000初始化,初始化成功后用LED点亮,表示初始化完成;否则LED 不亮。

二、实验内容:1.实现SJA1000的初始化设置2.理解SJA1000的相关寄存器的设置。

三、实验系统硬件设计:图1是89C51与SJA1000连接图。

MCU与SJA1000连接图。

选择适合的电阻和电容。

此实验选择了51KR电阻与1UF电容,开机后给电容充电,电容电压由0V升至5V,SJA1000可靠复位。

I/O复位,由单片机某一I/O引脚控制SJA1000复位引脚,使单片机在可靠复位之后完成SJA1000的复位,避免时间偏差。

芯片复位,可以通过外围芯片进行复位。

四、实验系统软件设计程序开始采用宏定义,初始化开始。

设置模式寄存器进入复位模式;然后配置时钟分频寄存器(CDR)选择PeliCAN模式,关闭CLKOUT输出;然后是输出控制寄存器(OCR),再设置位定时(BTR0/BTR1)6MHz晶振,波特率30Kbps;然后配置验收滤波;最后再次设置模式寄存器推出复位状态并且设置单验收滤波,然后判断状态寄存器是否位OXOC以确认初始化是否成功,如果成功则点亮LED,否则重新初始化。

图1系统软件设计框图程序如下:MODE EQU 0DE00HCMR EQU 0DE01H ;命令寄存器SR EQU 0DE02H ;状态寄存器IR EQU 0DE03H ;中断寄存器IER EQU 0DE04H ;中断使能寄存器BTR0 EQU 0DE06H ;总线定时寄存器一BTR1 EQU 0DE07H ;总线定时寄存器二OCR EQU 0DE08H ;输出控制寄存器ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器ECC EQU 0DE0CH ;错误代码捕捉寄存器TXERR EQU 0DE0FH ;发送错误计数器ACR0 EQU 0DE10H ;验收代码寄存器0ACR1 EQU 0DE11H ; 1ACR2 EQU 0DE12H ; 2ACR3 EQU 0DE13H ; 3AMR0 EQU 0DE14H ;验收屏蔽寄存器0AMR1 EQU 0DE15H ; 1AMR2 EQU 0DE16H ; 2AMR3 EQU 0DE17H ; 3FIN EQU 0DE10H ;发送/接收帧信息ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二DATA1 EQU 0DE13H ;发送/接收数据首址RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器CDR EQU 0DE1FH ;时钟分频寄存器ORG 4000HJMP STARTORG 4080H;----------------------------------------------------------------START:MOV DPTR,#MODEMOV A,#01HMOVX @DPTR,AMOV DPTR,#IERMOV A,#0DHMOVX @DPTR,AMOV DPTR,#ACR0MOV A,#00HMOVX @DPTR,AMOV DPTR,#ACR1MOV A,#10HMOVX @DPTR,AMOV DPTR,#ACR2MOV A,#00HMOVX @DPTR,AMOV DPTR,#ACR3MOV A,#00HMOVX @DPTR,AMOV DPTR,#AMR0 MOV A,#00H MOVX @DPTR,AMOV DPTR,#AMR1 MOV A,#0FH MOVX @DPTR,AMOV DPTR,#AMR2 MOV A,#0FFH MOVX @DPTR,AMOV DPTR,#AMR3 MOV A,#0FFH MOVX @DPTR,AMOV DPTR,#BTR0 MOV A,#6DH MOVX @DPTR,AMOV DPTR,#BTR1 MOV A,#2AH MOVX @DPTR,AMOV DPTR,#OCR MOV A,#01CH MOVX @DPTR,AMOV DPTR,#TXERR MOV A,#00H MOVX @DPTR,AMOV DPTR,#MODE MOV A,#00H MOVX @DPTR,AMOV DPTR,#SR MOVX A,@DPTRCJNE A,#0CH,START CLR P1.2END五.频率计算:晶振6MHz,由实验运行截图可得BTR0=6DH, BTR1=2AH=2 46=2 46/ 6=46/3us设同步段为1个系统时钟周期,=1= (8 +2×1+1)=112=2= + + =14 =644/3usf=1/ =46.6kbps六.实验心得这次实验是第一次在试验台上做实验,刚去对操作台的布局及功能都不太熟悉,经过老师的讲解、演示,我们开始在操作台上操作练习,通过实践操作,对SJA1000模块以及模块的初始化有了详细的认识并且在以后的应用中会更熟练。

基于SJA1000的CAN总线控制系统的设计与实现

基于SJA1000的CAN总线控制系统的设计与实现

(铜陵学院工业控制网络小论文题目基于SJA1000的CAN总线控制系统的设计与实现~姓名张三院系电气工程学院)学号 XXXXXXXX班级 A/2017-05-19CAN-bus(Controller Area Network)即控制器局域网是国际上应用最广泛的现场总线之一。

最初CAN-bus被设计作为汽车环境中的微控制器通讯工具,用于在车载各电子控制装置ECU之间交换信息,从而形成汽车电子控制网络。

如今,CAN-bus作为一种技术先进、可靠性高、功能完善、成本合理的远程网络通讯控制方式,已被广泛应用到各个自动化控制系统中。

而且CAN-bus总线在通信能力、可靠性、实时性、灵活性、易用性、传输距离等方面较RS-485总线有着明显的优势。

因而用CAN总线取代RS-485总线将是大势所趋。

1 CAN总线的主要特性CAN总线与其它通信网的不同之处有二:一是报文传送中不包含目标地址,它是以全网广播为基础,各接收站根据报文中反映数据性质的标识符来过滤报文,该收的收下,不该收的弃而不用。

其好处是可在线上网下网、即插即用和多站接收;二是特别强化数据安全,可满足控制系统及其它较高数据要求的系统需求。

CAN具有以下主要技术特性:(1)CAN遵从ISO模型,采用了其中的物理层、数据链路层与应用层。

采用双绞线,通信速率最高可达到1 Mbps/40 m,直接传输距离最远可达10 kin/5 kbps。

同一段总线内最多可挂接110个设备。

?(2)CAN的信号传输采用短帧结构,每一帧有效字节数为8个。

因而传输时间短,受干扰的概率低。

当节点发生严重错误时,CAN可自动关闭该节点,同时切断与总线的联系,以使总线上其它节点不受影响,因此CAN总线具有很强的抗干扰能力。

(3)CAN可支持多主工作方式,网络上任一节点在任何时候均可主动向其它节点发送信息,同时也支持点对点、一点对多点和全局广播方式来接收/发送数据。

处于优先级低的节点会主动停止发送,以此来避免总线冲突。

基于SJA1000实现温度检测信息的CAN总线传输

基于SJA1000实现温度检测信息的CAN总线传输
P o a m bl R ol r gr m a e es uti n 1 Wi e o 一 Di t r gi a1
t e mo e e . h r m t r
冲 区 ,调 用发 送子 程序 ,等待 接收 中断 并读 取 接收缓 冲 区数据 ,如 果是 主节 点回复 的确 认 帧 则 该 节 点 , 单 片 机 进 入 低 功 耗 模 式 , 直
线 和物理总线之 间的 接 口,该 器件 对C N A 物 理 总 线 提 供 差 动 发送 能力 并对 C N A 控 调度室 车库 1 车库 2 车库 n 图2 整 体 工 作框 图 制 器 提 供 差 动 接 收 能 力 ,可 实现 将C N A : , 卜 节 点 与 C N 理 总 线 A物 _ I ・ 电气 隔 离 的 功 能 。 P A 2 2 0 应 用 最 C8C5是 广 泛 的C N 发 器 。 A收 P A8 C 0的 特 点 C 2 5 2 LL I. 甲 I H 翟 是 :① 高速度 ,波特 l 广 。。 。。 -_ 。—— 。 ] 言 率 可达 l b S M p ;② 支 持低 电流待机模式 , 图 3 单 个 模 块 电路 原 理 图 未 供 电 的 节 点 不 会 干 扰 总 线 ;③ 内部 斜 率 控 到由主节点再发来命令报文唤醒。 制 电路 以降低射 频干 扰 :④差 动接收 器具有 程 序 流 程 图如 下 : 宽共模 范围 ,有很 强的抗 电磁干扰 ( M )能 EI
值。
本模 块 的功能 是采集温 度信 息 ,并通过 基 于 S A 0 0 A 总 线 网络 将 信 息 传 输 至 其 J 1 0 的C N 它节 点 。当各个 从节 点的温度数 据异 常时 , 主 节 点 会 实 时 准 确 地 显 示 出该 信 息 ,进 而 进 行 管 理 或 报 警 。本 模 块 还 可 以进 行 传 感 器 扩 展和C N A 网络 扩展 ,根据实 际需要 只要在单片 机 端 口接 入 其 它 传 感 器 就 可 以用 来 采 集 相 应 的 参 数 , 同 时 如 将 终 端 节 点 的S A 0 0 信 程 J 10通 序改 配置为C N 关转发 程序 即可扩大C N A网 A 网 络容 量 。C N A 总线 是 非常 有前 途 的工业 级现 场总线 ,本 模块 可以广 泛应用 于工业 数据采 集、车库安防等领域。

CAN控制器SJA1000及其应用

CAN控制器SJA1000及其应用

摘要:介绍CAN控制器SJA1000的特点、内部结构以及SJA1000的寄存器结构及地址分配;CAN协议通信格式。

并以独立CAN控制器SJA1000为例,结合CAN协议说明了一种通用型CAN 总线的开发与设计。

关键词:CAN总线SJA1000单片机1SJA1000简介SJA1000是PHILIPS公司早期CAN控制器PCA82C200的替代品,功能更强,具有如下特点:①完全兼容PCA82C200及其工作模式,即BASICCAN模式;②具有扩展的接收缓冲器,64字节的FIFO结构;③支持CAN2.0B;④支持11位和29位识别码;⑤位速率可达1Mbit/s;⑥支持peliCAN模式及其扩展功能;⑦24MHz的时钟频率;⑧支持与不同微处理器的接口;⑨可编程的CAN输出驱动配置;⑩增强了温度范围(-40℃~+125℃)。

图1SJA1000内部结构2SJA1000内部结构SJA1000的内部结构如图1所示,主要由接口管理逻辑IML、信息缓冲器(含发送缓冲器TXB和接收缓冲器RXFIFO)、位流处理器BSP、接收过滤器ASP、位时序处理逻辑BTL、错误管理逻辑EML、内部振荡器及复位电路等构成。

IML接收来自CPU的命令,控制CAN寄存器的寻址并向控制提供中断信息及状态信息。

CPU的控制经IML把要发送的数据写入TXB,TXB中的数据由BSP 处理后经BTL输出到CANBUS。

BTL始终监视CANBUS,当检测到有效的信息头“隐性电平-控制电平”的转换时启动接收过程,接收的信息首先要由位流处理器BSP处理,并由ASP过滤,只有当接收的信息的识别码与ASP检验相符时,接收信息才最终被写入RXB或RXFIFO中。

RXFIFO最多可以缓存64字节的数据,该数据可被CPU读取。

EML负责传递层中调制器的错误管制,它接收BSP的出错报告,促使BSP和IML进行错误统计。

3SJA1000的寄存器结构及地址分配表1是工作在BASICCAN模式下的SJA1000的寄存器结构及地址分配表。

CAN总线控制器-SJA1000源程序(c语言)

CAN总线控制器-SJA1000源程序(c语言)
{
while(time--);
}
//------------------------------------------------------------------------------------------------------
//函数类别SJA1000基本操作
//函数名称CANREG_write
unsigned char IDL_R_DLC;
unsigned char Frame_Data[8];
}receive_BUF,send_BUF;
//------------------------------------------------------------------------------------------------------
//函数类别SJA1000基本操作
//函数名称setting_SJA_resetmode
//入口函数无
//出口函数无
//全局变量SJA_workmode
//操作寄存器控制寄存器〔地址00〕
//函数功能设置SJA工作在复位模式
//------------------------------------------------------------------------------------------------------
//函数类别SJA1000基本操作
//函数名称CANREG_read
//入口函数SJAREG_ADR
//出口函数SJAREG_data
//函数功能读SJA1000的寄存器
//------------------------------------------------------------------------------------------------------

项目二 汽车CAN总线技术基本原理(任务四SJA1000CAN控制器及其应用)

项目二 汽车CAN总线技术基本原理(任务四SJA1000CAN控制器及其应用)

0
接收中断使能 1
0
功能
使能 禁止 使能 禁止 使能 禁止 使能 禁止 使能 禁止 使能 禁止 使能 使能 使能 禁止
Peli_RXD: PUSH ACC PUSH PSW CLR EA ;//关CPU中断
RE6: MOV DPTR,#SJA_IR MOVX A,@DPTR ANL A,#01H CJNE A,#00H,RE7;接收中断 SJMP RE8
IR.3 DOS 溢出中 1 置位

复位
IR.2 EI 错误报 1 置位
警中断 0 复位
IR.1 TI 发送中 1 置位

0 复位
IR.0 RI 接收中 1 置位

0 复位
Peli_RXD: PUSH ACC PUSH PSW CLR EA ;//关CPU中断
RE6: MOV DPTR,#SJA_IR MOVX A,@DPTR ANL A,#01H CJNE A,#00H,RE7;接收中断 SJMP RE8
----
状态
----
3(IR) 中断
---
中断
---
4(IER) 中断使能
中断使能 中断使能 中断使能
5
保留(00H) ---
保留(00H) ---
6(BTR0) 总线定时0
---
总线定时0 总线定时0
7(BTR0) 总线定时1
---
总线定时1 总线定时1
8(OCR) 输出控制
---
输出控制 输出控制
接收缓存器 标识符RTR,DLC 字节1-8 时钟驱动器
10 11 12-19
20 21 22-29 31
7
6
测试方 同步 式

基于51单片机SJA1000 CAN通讯实现

基于51单片机SJA1000 CAN通讯实现
recbuf[reclength];void
UART_Init(void){SCON=0X50;TMOD”=0X20;TH1=0XFD;TL1=0XFD;TR1=1;
EA=1;ES=1;}voidUART_Send_Byte(unsignedcharch){SBUF=ch;
while(!TI);//等到发送完成中断标志位置1TI=0;}void
if((state&0x20)==0x20)UART_Send_String(“SJA1000CANBUSis
transmiting!\r\n”);}}
2uart.h
#ifndef__UART_H__#define__UART_H__#include“stdio.h”#include
“reg51.h”#definereclength8externbitrecfinish;externunsignedchar
char num){P1=table[num];}
4sja1000.h
#ifndef__SJA1000_H__#define__SJA1000_H__#include“string.h”#include
含有输入参数unsigned char t,无返回值unsignedchar是定义无符号字符变量,
其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度
如下T=tx2+5uS------------------------------------------------*/void
DelayUs2x(unsignedchart){while(--t);}/*------------------------------------------------

CAN总线的实现-SJA1000实例

CAN总线的实现-SJA1000实例

一、以下是我做的CAN节点的测试程序, 实现两个节点传送数据,程序主要分三部分SJA1000 的初始化,接收数据,发送数据./******************************************************函数原型:bit Sja_1000_Init(void)**功能:初始化SJA10000**入口参数: 无**返回值:0:初始化成功1:复位失败2: 测试sja1000失败3:设置失败4:设置验收滤波器失败5:设置波特率失败*****************************************************/unsigned char Sja_1000_Init(void){bit s;EA=0;s=BCAN_ENTER_RETMODEL();if (s==1) return 1;s=BCAN_CREATE_COMMUNATION();if (s==1) return 2;s=BCAN_SET_OUTCLK(0xc0);//Pelicanif (s==1) return 3;s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00);if (s==1) return 4;s=BCAN_SET_BANDRATE(CAN_BPS_1M);if (s==1) return 5;SJA_BCANAdr=REG_OCR ;*SJA_BCANAdr=0x1a;SJA_BCANAdr=REG_IER;*SJA_BCANAdr=0x03;s=BCAN_SET_CONTROL(0x08);if (s==1) return 6;EA=1;return 0;}}/*********************************************************************函数原型: bit BCAN_SET_OUTCLK( unsigned char Clock_Out) **参数说明: ** Clock_Out:存放时钟分频寄存器(CDR)的参数设置**返回值: ** 0 ;设置成功** 1 ;设置失败**说明:设置SJA1000的时钟分频。

SJA1000程序

SJA1000程序
MOV @R0, #02H
INC R0
MOV @R0, #08H
INC R0
MOV @R0, #05H
LCALL BCAN_CMD_PRG ;
RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN总线发送数据处理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOV R0, #SEND_DATA_BUF1
RCV_DATA_BUF9 DATA 058H
RCV_DATA_BUF10 DATA 059H
ERROR_STATUS DATA 07CH ;错误状态表示
TEST_DATA DATA 07FH ;测试发送数据
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV 3AH,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中断0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCAN_INT0:
push DPH
PUSH DPL
PUSH PSW ;PSW,ACC入栈
MOV A, TEST_DATA
INC R0
MOV @R0, A
MOV R0, #SEND_DATA_BUF1
LCALL BCAN_DATA_WRITE ;将要发送的数据送入发送缓冲区
LOOPER:
JNB RCV_GOOD,LOOPER2 ;sja1000成功接收一帧,通知CPU处理
CLR RCV_GOOD
LCALL RCVDATA_PRG

CAN总线学习笔记五:SJA1000硬件电路设计

CAN总线学习笔记五:SJA1000硬件电路设计

AN总线学习笔记五:SJA1000硬件电路设计首先对CAN总线控制器SJA1000的管脚我们必须熟悉。

下面是其各个管脚的功能参数。

各个管脚的符号功能什么的上面的表里介绍的很详细,我就不多废话了。

接着我们看SJA1000的这些管脚在实际电路中是怎么进行连接的,因为只谈SJA1000的硬件电路设计,所以就截一张PIAE提供的电路原理图里关于SJA1000的部分。

下面我们要具体解析这个电路图。

AD0-AD7是地址/数据复用总线。

因为这个电路是把SJA1000做外部RAM扩展了,所以它的电路连接也势必要符合外部RAM的连接要求。

(特权同学也是第一次接触单片机的外部存储器扩展应用,所以开始的时候也很是纳闷,然后拿起课本一阵恶补后才恍然大悟。

)先补一下外部扩展RAM的知识,然后再谈这个电路就容易多了:51单片机外部RAM的扩展最多是可以寻址64KB的,也就是最多可以有16条地址线来寻址,P0口是低八位地址扩展口,P2口是高八位地址扩展口。

如果外部RAM不需要用到全部16条地址线(SJA1000就只有8条地址线),那么只要把低位地址线和外部RAM的相应地址线连接,高位的地址线在寻址时都默认为1,比如这里的SJA1000,它的8条地址线是和P0口相连接的,所以对SJA1000的寄存器寻址时的地址应该是FF00H-FFFFH,但是为什么PIAE提供的程序里的地址定义却是FE00H-FEFFH呢?这就要讨论CS信号的连接问题了,我们知道,CS是片选输入信号,只有当它是低电平时才能访问SJA1000。

再看看它和谁连了?是P2.0口,正好是地址线高八位的最低位,如果按常理来说,寻址FF00H,那么P2.0就是高电平,SJA1000就不能被访问。

所以寻址FE00H时才选通SJA1000,这时才是SJA1000寄存器的地址。

上面讨论了寻址的问题,只是就事论事,如果还不理解,我建议找本书详细了解下单片机的外部存储器的扩展后就会明白的。

基于SJA1000的CAN总线测试程序

基于SJA1000的CAN总线测试程序
CONTROL)&0x01)!=0x01){SJA_mode=1;//置工作模式成功}else{SJA_mode=0;
//置工作模式失败}return(SJA_mode);}
/*****************************************************************
********/bitSetting_SJA1000_rate(void){bit
setting_success;while(Setting_SJA1000_resetmode()==0){
Setting_SJA1000_resetmode();//设置SJA工作在复位模式}
Write_SJA1000(REG_BTR0,SJA_BTR0);Write_SJA1000(REG_BTR1,SJA_BTR1);
connect_OK=0; //连接故障} return(connect_OK);}
/*****************************************************************
函数功能:设置SJA1000为工作模式*入口参数:无*出口参数:
SJA_mode************************************************************
******/bit Judge_SJA1000_connect(void){bit connect_OK=0;
Write_SJA1000(REG_TEST,0xAA); //写AA到测试寄存器(地址09)
if(Read_SJA1000(0x09)==0xAA){connect_OK=1;//连接正常}else{
return(SJAREG_data);}

can总线节点设计[整理版]

can总线节点设计[整理版]

一、摘要本实验介绍一种基于CAN总线控制器SJA1000的总线节点模块,包括SJA1000的部分重要寄存器的功能介绍,以及软件编程的实现。

,,,,,,,,,,,,,,,特点:1.可实现任意单片模块的互相通信,由于SJA1000兼容5V和3.3V的逻辑电平,且供电电压也为3.3V~5.6V,因而可以使基于逻辑供电5V和3.3V的系统能够很容易的挂在CAN总线网络上,解决模块之间的电平不兼容问题。

2.总线控制器宇驱动器之间利用6N137高速光耦隔离技术,使得网络上的各个模块与总线本身完全隔离,保证了总线的安全性,也保证了各模块之间的独立性。

当总线网络中含有大负载驱动时这点表现的尤为重要。

3.由于采用SJA1050作为总线驱动器,实现数据在总线网络里高速传输,最高速度可达到1Mbps。

二、CAN总线简介1,,,,,.CAN总线的特点,,,,,CAN(Controller,,,,,Area,,,,,Network局域控制网),,,,,总线由Bosch、Benz研究试验,于1986年2月正式提出,至1993年11月Bosch,,,,,CAN2.0成为国际标准(ISO11898)。

2000年CAN总线芯片年度销售超过1亿片,欧产轿车都至少装配一条CAN总线网络。

目前CAN总线的应用已从汽车、火车、轮船迅速扩展到机械工业、纺织机械、农用机械、机器人、数控机床、医疗器械、家用电器及传感器等领域。

其被公认为是最有前途的现场总线之一。

由于采用了许多新技术及独特的设计,CAN总线与一般的通讯总线相比,它的数据通讯具有突出的可靠性、实时性和灵活性。

其特点可概括如下:●CAN是到目前为止唯一有国际标准的现场总线。

●CAN为多主方式工作,网络上任一节点均可在任一时刻主动地向网络上其他节点发送信息,而不分主从。

●在报文标识符上,CAN上的节点分成不同的优先级,可满足不同的实时需要,优先级高的数据最多可在134μs内得到传输。

第七章 CAN总线控制器SJA1000

第七章 CAN总线控制器SJA1000

CAN总线收发接口电路82C250
• 82C250是CAN控制器与物理总线之间的 接口,它最初是为汽车高速通信(最高达 1Mbps)的应用而设计的。 • 器件可以提供对总线的差动发送和接收 功能。
CAN 总线的应用 CAN控制器SJA1000在系统中的位置
分布模块1
传感器 执行元件 MMI 模块控制器
新增功能:
– 标准结构和扩展结构报文的接收和发送; – 64字节的接收FIF0: – 标准和扩展帧格式都具有单/双接收滤波器(含接收 屏蔽和接收码寄存器); – 可进行读/写访问的错误计数器; – 可编程的错误报警限制; – 最近一次的错误代码寄存器; – 每一个CAN总线错误都可以产生错误中断; – 具有丢失仲裁定位功能的丢失仲裁中断; – 单发方式(当发生错误或丢失仲裁时不重发); – 只听模式(监听CAN总线,无应答,无错误标志; – 支持热插拔(无干扰软件驱动位速率检测); – 硬件禁止CSI参考模型中的两层:物理层 接受滤波、超载 和数据连路层
逻辑链路控制(LLC) 媒体访问控制(MAC) 物理信令(Physical Sisnal Lins, PSL) 物理媒体附件( Physical Attachment, PMA) 媒体接口(Medium Dependent Interface, MDI) 数据 链路 层
SJAl000在软件和引脚上都是与它的前—款 PCA82C200独立CAN控制器兼容的,在此基础上 增加了很多新的功能。为了实现软件兼容, SJAl000采用了两种工作方式: Basic CAN方式(PCA82C200兼容方式)和PeliCAN方 式(扩展特性方式)。工作方式通过时钟分频寄存 器中的CAN方式位来选择。 上电复位默认工作方式是Basic CAN方式,Basic CAN和PeliCAN方式的区别如下:在PeliCAN方式 下,SJAl000有一个重新设计的含很多新功能的 寄存器组。SJAl000包含PCA82C200中的所有位, 同时增加了一些新的功能位。PeliCAN方式支持 CAN2.0B协议规定的所有功能(29位的标识符)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、以下是我做的CAN节点的测试程序, 实现两个节点传送数据,程序主要分三部分SJA1000 的初始化,接收数据,发送数据./******************************************************函数原型:bit Sja_1000_Init(void)**功能:初始化SJA10000**入口参数: 无**返回值:0:初始化成功1:复位失败2: 测试sja1000失败3:设置失败4:设置验收滤波器失败5:设置波特率失败*****************************************************/unsigned char Sja_1000_Init(void){bit s;EA=0;s=BCAN_ENTER_RETMODEL();if (s==1) return 1;s=BCAN_CREATE_COMMUNATION();if (s==1) return 2;s=BCAN_SET_OUTCLK(0xc0);//Pelicanif (s==1) return 3;s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00);if (s==1) return 4;s=BCAN_SET_BANDRATE(CAN_BPS_1M);if (s==1) return 5;SJA_BCANAdr=REG_OCR ;*SJA_BCANAdr=0x1a;SJA_BCANAdr=REG_IER;*SJA_BCANAdr=0x03;s=BCAN_SET_CONTROL(0x08);if (s==1) return 6;EA=1;return 0;}}/*********************************************************************函数原型: bit BCAN_SET_OUTCLK( unsigned char Clock_Out) **参数说明: ** Clock_Out:存放时钟分频寄存器(CDR)的参数设置**返回值: ** 0 ;设置成功** 1 ;设置失败**说明:设置SJA1000的时钟分频。

该子程序只能用于复位模式*******************************************************************/ bit BCAN_SET_OUTCLK(unsigned char Clock_Out){SJA_BCANAdr=REG_CDR;*SJA_BCANAdr=Clock_Out;if(*SJA_BCANAdr != Clock_Out)return 1;elsereturn 0;}/******************************************************************** *函数原型: bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR 1,BCAN_ACR2,BCAN_ACR3, BCAN_AMR0, BCAN_AMR1, BCAN_AMR2, BCAN_AMR3 )*参数说明: ** BCAN_ACR(0-3):存放验收代码寄存器(ACR)的参数设置** BCAN_AMR(0-3):存放接收屏蔽寄存器(AMR)的参数设置**返回值: ** 0 ;设置成功** 1 ;设置失败**说明:设置CAN节点的通讯对象,允许接收的报文,是由AMR和ACR共同决定的. *********************************************************************/ bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_AC R2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3) {SJA_BCANAdr=REG_TxBuffer1;*SJA_BCANAdr=BCAN_ACR0; //写入参数SJA_BCANAdr=REG_TxBuffer2;*SJA_BCANAdr=BCAN_ACR1;SJA_BCANAdr=REG_TxBuffer3;*SJA_BCANAdr=BCAN_ACR2;SJA_BCANAdr=REG_TxBuffer4;*SJA_BCANAdr=BCAN_ACR3;//校验写入值if(*SJA_BCANAdr != BCAN_ACR3) return 1;SJA_BCANAdr=REG_TxBuffer5;*SJA_BCANAdr=BCAN_AMR0; //写入参数SJA_BCANAdr=REG_TxBuffer6;*SJA_BCANAdr=BCAN_AMR1;SJA_BCANAdr=REG_TxBuffer7;*SJA_BCANAdr=BCAN_AMR2;SJA_BCANAdr=REG_TxBuffer8;*SJA_BCANAdr=BCAN_AMR3;//校验写入值if(*SJA_BCANAdr != BCAN_AMR3) return 1;return 0;}/******************************************************************** ;*函数原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) * ;*返回值: *;* 0 ;波特率设置成功*;* 1 ;波特率设置失败*;* *;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MH z, *;* 其它晶体的频率的值的波特率,需自己计算。

该子程序只能用于* ;* 复位模式*;******************************************************************/ bit BCAN_SET_BANDRATE(unsigned int CAN_ByteRate){//将波特率的的预设值装入sja1000的总线定时器SJA_BCANAdr =REG_BTR0;*SJA_BCANAdr =CAN_ByteRate>>8; // 取CAN_ByteRate的高8位写入写入参数//校验写入值if(*SJA_BCANAdr !=(CAN_ByteRate>>8)) return 1;SJA_BCANAdr=REG_BTR1;*SJA_BCANAdr=CAN_ByteRate;//校验写入值if(*SJA_BCANAdr !=CAN_ByteRate) return 1;return 0;}/*********************************************************************函数原型: bit BCAN_SET_CONTROL(unsigend char CMD) **参数说明: 设置控制寄存器********************************************************************/ bit BCAN_SET_CONTROL(unsigned char CMD){unsigned char TempData;SJA_BCANAdr=REG_CONTROL; //SJA_BaseAdr+0x00 控制寄存器TempData= *SJA_BCANAdr;*SJA_BCANAdr=CMD;if (*SJA_BCANAdr == CMD)return 0;elsereturn 1;}/******************************************************************** *函数原型: bit BCAN_CREATE_COMMUNATION(void) **参数说明: 无**返回值: ** 0 ; 表示SJA1000接口正常** 1 ; 表示SJA1000与处理器接口不正常**说明:该函数用于检测CAN控制器的接口是否正常********************************************************************/ bit BCAN_CREATE_COMMUNATION(void){SJA_BCANAdr=REG_TEST;*SJA_BCANAdr=0xaa; //写入测试值if(*SJA_BCANAdr == 0xaa)return 0; //读测试正确elsereturn 1;}/****************************************************************** *函数原型: bit BCAN_ENTER_RETMODEL(void) **参数说明: 无**返回值: ** 0 ; 表示成功进入复位工作模式** 1 ; 表示不能进入复位工作模式** **说明: CAN控制器进入复位工作模式********************************************************************/ bit BCAN_ENTER_RETMODEL(void) //置位复位请求{unsigned char TempData;SJA_BCANAdr = REG_CONTROL;TempData= *SJA_BCANAdr;*SJA_BCANAdr=0x01; //置位复位请求if((*SJA_BCANAdr&0x01) == 1)return 0;elsereturn 1;}/******************************************************函数原型:void ex0_int(void) interrupt 0 //using 1**功能:中断接收函数**入口参数: 无**出口参数: RevceData[]数组**说明: 当sja1000 收到正确的报文时,会产生int中断*****************************************************/void ex0_int(void) interrupt 0 //using 1{unsigned char tt;SJA_BCANAdr=REG_INTERRUPT;if((*SJA_BCANAdr)&0x01) //产生了接收中断{SJA_BCANAdr=REG_RxBuffer1;tt=*SJA_BCANAdr;if ((tt&0x40)!=0x40) //数据帧= 为远程帧{memcpy(REG_RxBuffer6,RevceData,8);send_char_com(RevceData[1]);//以下代码是发送到串口send_char_com(RevceData[2]);send_char_com(RevceData[3]);send_char_com(RevceData[4]);send_char_com(RevceData[5]);send_char_com(RevceData[6]);send_char_com(RevceData[7]);send_char_com(RevceData[8]);}BCAN_CMD_PRG(4);//释放SJA1000接收缓冲区}}unsigned char BCAN_DATA_WRITE(unsigned char *SendDataBuf){unsigned char temp;SJA_BCANAdr = REG_STATUS;temp=*SJA_BCANAdr;if ((temp&0x08)==0) return 1; //上次发送未完成if ((temp&0x04)==0) return 2; //发送缓冲区是否锁定if ((temp&0x10)==0x10) return 3; //判断是否正在接收SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区1 memcpy(SJA_BCANAdr,SendDataBuf,13);BCAN_CMD_PRG(0x03);return 0;}bit BCAN_CMD_PRG(unsigned char cmd){SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器*SJA_BCANAdr=cmd; //启动命令字switch(cmd){case TR_CMD:return 0;break;case SRR_CMD:return 0;break;case AT_CMD:SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送return 0;elsereturn 1;break;case RRB_CMD:SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器if((*SJA_BCANAdr & 0x01)==1)return 1;elsereturn 0;break;case COS_CMD:SJA_BCANAdr = REG_STATUS;if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功return 0;elsereturn 1;break;default:return 1;break;}}主程序部分:void main(void){unsigned char temptt,ss;CS=0;Init_Cpu();EA=0;//initialize Sja1000ss=Sja_1000_Init();if (ss!=0)//初始化失败send_string_com("init fail!");elseEA=1; //初始化成功,开中断RECOK=0;send_data[0]=Send_CAN_Info_ID[0];send_data[1]=Send_CAN_Info_ID[1];send_data[2]=Send_CAN_Info_ID[2];send_data[3]=Send_CAN_Info_ID[3];send_data[4]=Send_CAN_Info_ID[4];while(1){SJA_BCANAdr = REG_STATUS;temptt=*SJA_BCANAdr;if ((temptt&0x40)==0x40){Sja_1000_Init();send_char_com(0xee);}if (RECOK==1){RECOK=0;SJA_BCANAdr = REG_STATUS;temptt=*SJA_BCANAdr;if((temptt&0x04)==0x04) //可以向发送缓冲器写数据{send_data[5]=Com_RecBuff[0];send_data[6]=Com_RecBuff[1];send_data[7]=Com_RecBuff[2];send_data[8]=Com_RecBuff[3];send_data[9]=Com_RecBuff[4];send_data[10]=Com_RecBuff[5];send_data[11]=Com_RecBuff[6];send_data[12]=Com_RecBuff[7];ss=BCAN_DATA_WRITE(send_data);if (ss==0) //发送正常send_char_com(0x11);else{send_char_com(0xFF);send_char_com(ss);SJA_BCANAdr= REG_ECC;send_char_com(*SJA_BCANAdr);}}}}}二、can总线通讯程序(c)sja1000●nnyt原创经典,如需更多帮助,请联系我:(短信联系,QQ详谈)QQ: 6 Email:●本人同时提供can实验开发板给初学者1 CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;2 提供详尽的源程序,可根据用户需求编写程序#include<REG52.H> //单片机头文件#include<SJA_nnyt_BCANCONF.H> //SJA存储器定义头文件#include<SJA_nnyt_BCANFUNC.C> //SJA子程序文件/*************************函数声明*******************************/ void Init_T0(void); //初始化单片机T0void Sja_1000_Init(void); //初始化SJA//******************************************************************* bit flag_sec; //发送命令标志unsigned char data send_data[10],rcv_data[10];//发送和接收数组unsigned char sec_data,second; //定时器记数变量,发送数据变量unsigned char data Tmod_data; //定时器T0工作方式变量unsigned char bdata flag_init; //中断寄存器数据保存变量sbit rcv_flag=flag_init^0; //接收中断标志sbit err_flag=flag_init^2; //错误中断标志sbit P2_0=P2^0;sbit P3_4=P3^4;sbit LED=P3^5; //指示灯//***********************************************************void ex0_int(void) interrupt 0 using 1 //外部中断0{SJA_BCANAdr=REG_INTERRUPT; //指针指向中断寄存器flag_init=*SJA_BCANAdr; //保持中断寄存器值}//***********************************************************void T0_int(void) interrupt 1 using 2 //定时器T0中断服务子程序{TR0=0; //关闭定时器T0sec_data--; //秒计时变量减一if(sec_data==0) //2.25秒时间到了吗?{sec_data=0x50; //重新赋值TH0=0x80;TL0=0x60;flag_sec=1; //设置标志位second++; //发送的数据加一}TR0=1; //启动定时器T0}//************************************************************void Init_T0(void) //初始化定时器0{Tmod_data=TMOD;Tmod_data&=0xf0;Tmod_data|=0x01;TMOD=Tmod_data; //定时器T0工作方式设置TH0=0x80;TL0=0x60; //定时器T0初值设置TR0=1; //开放定时器T0sec_data=0x20; //记数值设置second=0x00; //发送数据初始化清零}//***********************************************************void Sja_1000_Init(void){BCAN_ENTER_RETMODEL(); //进入复位BCAN_SET_BANDRATE(0x0b); //800KBCAN_SET_OBJECT(0xaa,0xff); //设置地址ID:557BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出BCAN_QUIT_RETMODEL(); //退出复位模式SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器*SJA_BCANAdr|=0x1E; //开放错误\接收\发送中断}//******************************************************************* void main(void){P2_0=0; //SJA1000退出硬件复位模式Sja_1000_Init(); //initialize Sja100Init_T0(); //initialize T0PX0=1; //外部中断0高优先级IT0=1; //开放T0中断EX0=1; //外部中断0开放ET0=1; //开放外部中断0EA=1; //开放全局中断P3_4=0; //点亮指示灯flag_init=0x00; //变量清零while(1){if(rcv_flag) //if there is receive interrupt{rcv_flag=0; //接收标志位清零BCAN_DATA_RECEIVE(rcv_data); //接收数据BCAN_CMD_PRG(0x04); //释放接收缓冲区}if(flag_sec){flag_sec=0; //发送位清零send_data[0]=0xAA; //发送数据到ID为550的节点send_data[1]=0x08; //发送数据帧,8个字节长度send_data[2]=0x05; //第一个字节内容为数据05Hsend_data[3]=second; //第二个字节内容为变量值BCAN_DATA_WRITE(send_data); //发送数据BCAN_CMD_PRG(0x01); //置位发送请求位LED=~LED;}if(err_flag) //错误中断{文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.err_flag=0; //错误标志位清零Sja_1000_Init(); //初始化SJA}}}11。

相关文档
最新文档