sja1000 can 驱动程序演示实验

合集下载

我的CAN总线SJA1000调试经历

我的CAN总线SJA1000调试经历

我的CAN总线SJA1000调试经历展开全文我的 CAN总线 SJA1000调试经历前几天学校实验室赶活,调试了SJA1000的CAN总线驱动,我所做的平台是在Intel PXA270的ARM处理器上面进行控制的,通过读写总线的方式进行控制的,期间对着SJA1000的databook查找了很多,期间调试时也走了不少的弯路,现在把调试心得一些经验在这里讲讲。

由于以前对CAN的驱动接触比较少,只是了解过它的物理特性和用途,所以下手点就是从databook这块着手的,于是先调试CAN的初始化配置,首先是通过CPU能够读写SJA1000的寄存器了,然后我从网上下了一个基于Linux内核的CAN驱动代码,往里一直添加,但最后发现这套代码写得太复杂了,可能本身自己对SJA1000的寄存器设置也不是很了解,没办法,看了大半天的databook,终于有些头绪想清楚该是怎样去控制了,从ZLG网站中下了一个BASIC模式下的参考例程,我看了一下,然后SJA的寄存器详细看了看(由于开始的时候比较忙,所以直到这个时候才算是仔细看了看SJA的内部,至于CAN 的基础协议我是根本没有看,这给我后面带来了极大的麻烦)。

然后就参考ZLG的程序开始写SJA的测试程序,那个程序写的很大,也比较完整,因为我想快点把CAN打通,于是弄了一个一千多行的程序,以前我的调试程序一般都很小的。

写好程序之后就开始测试,首先测试的是测试寄存器,然后一步步测试下去,在BASIC模式下所有的寄存器都正常,但是在发送的时候是总是不正常,启动发送之后就一直在发送,状态寄存器的标志位一直处在发送的状态下,然后就是报总线错误,不知道是怎么会事情,很郁闷,上网上的BBS看了一下。

其他人告诉我单个CAN节点发送是成功不了的,如果没有收到接受CAN 节点的应答,发送节点就会一直发送,直到超出错误计数器的允许值使得总线关闭。

这下我终于明白是怎么回事了,同时在精华区发现在peli模式下有ECC(错误寄存器),可以跟踪错误,于是开始改成用PeliCAN模式操作过程。

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)** 功能描述: 该函数用于不精确的延时。

独立CAN控制器SJA1000的C语言编程

独立CAN控制器SJA1000的C语言编程

SJA1000中断接收程序
unsigned char rx0; unsigned int rxide; unsigned char rxdata[8]; sbit rxsec=0; void receive interrupt 0 { unsigned char i; unsigned char *p; p=&rxide; rx0=RXEFF0; *p=RXEFF4; P++;
(ARM)设置 清零错误寄存器 中断使能寄存器(IER)设置 进入工作模式
SJA1000初始化程序
void sja1000_init( ) { MOD=0x09; CDR=0xc8;
OCR=0x1a; BTR0=0x??; BTR1=0x??; ACR0=0x??; ACR1=0x??; ACR2=0x??; ACR3=0x??;
ABSACC.H 提供的宏(Macro((unsigned char volatile code *) 0) #define DBYTE ((unsigned char volatile data *) 0) #define PBYTE ((unsigned char volatile pdata *) 0) #define XBYTE ((unsigned char volatile xdata *) 0) #define CWORD ((unsigned int volatile code *) 0) #define DWORD ((unsigned int volatile data *) 0) #define PWORD ((unsigned int volatile pdata *) 0) #define XWORD ((unsigned int volatile xdata *) 0)

CAN通信控制器SJA1000-精品课件

CAN通信控制器SJA1000-精品课件
BasicCAN模式——与PCA82C200兼容的模式 PeliCAN模式 ——扩展功能模, 复位默认模式是BasicCAN模式。
2 一般说明
➢ 两种封装形式: 一种为28引脚的塑质双列式封装(DIP28) 一种为28引脚的塑质小型线外封装(SO28)
15、我就像一个厨师,喜欢品尝食物。如果不好吃,我就不要它。2021年8月下午6时3分21.8.1518:03August 15, 2021
16、我总是站在顾客的角度看待即将推出的产品或服务,因为我就是顾客。2021年8月15日星期日6时3分16秒18:03:1615 August 2021
17、利人为利已的根基,市场营销上老是为自己着想,而不顾及到他人,他人也不会顾及你。下午6时3分16秒下午6时3分18:03:1621.8.15
9、我们的市场行为主要的导向因素,第一个是市场需求的导向,第二个是技术进步的导向,第三大导向是竞争对手的行为导向。21.8.1521.8.15Sunday, August 15, 2021
10、市场销售中最重要的字就是“问”。18:03:1618:03:1618:038/15/2021 6:03:16 PM
工业控制网络 (现场总线)
4.2 独立CAN控制器SJA1000
CAN控制器SJA1000的作用
实现网络层次结构中的数据链路层和物理层功能。
PHILIPS公司生产,是PCA82C200的升级产品
CAN控制器SJA1000在系统中的位置
分布模块1
传感器 执行元件
模块控制器
CAN控制器
TX
RX
CAN收发器
SJA1000的地址区包括控制段和报文缓冲器(发 送缓冲器和接收缓冲器,见表4-3 BasicCAN地址分配表 )。

can总线SJA1000的初始化相关实验

can总线SJA1000的初始化相关实验

实验一SJA1000的初始化一、实验目的:学习并完成SJA1000的初始化二、实验设备:EL-8051-III型单片机实验箱三、实验原理:SJA1000的初始化只有在复位模式下才可以进行,初始化主要包括工作方式的设置、接收滤波方式的设置、介绍屏蔽寄存器(AMR)和接收代码寄存器(ACR)的设置、波特率参数设置和中断允许寄存器(IER)的设置等。

在完成SJA1000的初始化设置以后,SJA1000就可以回到工作状态,进行正常的通信任务。

初始化流程:四、实验内容及步骤:初始化CAN节点,使SJA1000处在准备工作状态。

1.给试验箱换上CAN控制器;2.编写并编译初始化程序;3.下载程序并调试。

编写的程序如下:MODE EQU 0DE00H ;模式寄存器CMR 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 ;时钟分频寄存器DAMR EQU 40HDACR EQU 50HORG 4000HJMP STARTORG 4080HSTART:mov dptr,#modemov a,#01hmovx @dptr,amov dptr,#acr0mov a,#00hmovx @dptr,amov dptr,#acr1mov a,#60hmovx @dptr,amov dptr,#acr2mov a,#00hmovx @dptr,amov dptr,#acr3mov a,#00hmovx @dptr,amov dptr,#amr0mov a,#00hmovx @dptr,amov dptr,#amr1mov a,#0fhmovx @dptr,amov dptr,#amr2mov a,#0ffhmovx @dptr,amov dptr,#amr3mov a,#0ffhmovx @dptr,amov dptr,#btr0mov a,#01hmovx @dptr,amov dptr,#btr1mov a,#1chmovx @dptr,amov dptr,#ocrmov a,#0aahmovx @dptr,amov dptr,#cdrmov a,#89hmovx @dptr,amov dptr,#mode ;退出复位模式mov a,#00hmovx @dptr,amov dptr,#sr ;判断状态寄存器是否初始化成功,成功则点亮P1口的灯movx a,@dptrcjne a,#0ch,startmov P1,#00hend五、实验结果P1口连接的灯均亮了,外部存储器DE00H~DE30H的值为下图所示:六、实验心得。

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

CAN总线控制器-SJA1000源程序(c语言)
send_BUF.Frame_Data[0] = 0x11;
send_BUF.Frame_Data[1] = 0x22;
send_BUF.Frame_Data[2] = 0x33;
send_BUF.Frame_Data[3] = 0x44;
send_BUF.Frame_Data[4] = 0x55;
//函数类别延时
//函数名称delay
//入口函数无
//出口函数无
//函数功能延时
//------------------------------------------------------------------------------------------------------
void delay(unsigned char time)
//函数类别供调用子函数
//函数名称send_BUF_init
//入口函数无
//出口函数无
//函数功能对MCU内公共变量结构send_BUF赋初值
//-----------------------------------------------------------------------------------------------------
CAN总线控制器sja1000源程序
SJA1000是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN它是PHILIPS
半导体PCA82C200 CAN控制器BasicCAN的替代产品而且它增加了一种新的工作模式PeliCAN ,
这种模式支持具有很多新特性的CAN 2.0B协议。
1特性
和PCA82C200独立CAN控制器引脚兼容
void SJAconnect_judge(void)

基于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-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)

CAN-bus现场总线基础教程【第3章】CAN控制器驱动-SJA1000编程基础(9)

第3章 CAN 控制器驱动1.1 SJA1000编程基础1.1.1 MCU 访问SJA1000SJA1000使用并行总线接口与MCU 连接,对MCU 来说,SJA1000可以认为是1个外扩的RAM 芯片,51系列MCU 通过地址线、数据线和控制线与SJA1000连接,如图3.1所示。

AD[0:7]是低8位地址与数据总线复用的,MCU 在操作总线时,在该接口上先输出低8位地址线,然后再进行数据操作(读或写)。

SJA1000内部带有地址锁存器,由ALE 信号实现数据与地址的分离。

因为SJA1000的地址宽度为8位,所以寻址空间范围是0x00~0xFF 。

假如每个地址都对应一个寄存器,那么SJA1000最多支持256个寄存器。

而实际上SJA1000在BasicCAN (CAN2.0A )模式下只有32个寄存器,在FullCAN (CAN2.0B )模式下则有128个寄存器。

虽然SJA1000寄存器的访问地址会因为硬件设计不同而不同,但SJA1000内部寄存器的位置关系是固定的。

如果我们给SJA1000每个内部寄存器的地址都定义绝对地址(如程序清单3.1所示),那么在硬件设计发生变化时,特别是器件编址变化时,要修改的寄存器地址定义将会非常多。

为了提高驱动的可移植性,在实际访问SJA1000内部寄存器时,常采用基地址加偏移量的方式进行寄存器访问(如程序清单3.2所示)。

如果把SJA1000内部寄存器看做数组的话,那基地址就是这个数组的首地址,偏移量就是数组的下标,即成员在数组中的位置。

程序清单3.1 采用绝对编址的寄存器定义1 #define REG_CAN_MOD 0xA000 // 内部控制寄存器2 #define REG_CAN_CMR 0xA001 // 命令寄存器3 #define REG_CAN_SR 0xA002 // 状态寄存器4 #define REG_CAN_IR 0xA003 // 中断寄存器5 #define REG_CAN_IER0xA004// 中断使能寄存器6......程序清单3.2 采用基地址加偏移量方式的寄存器定义7 #define REG_BASE_ADD0xA000// SJA1000寄存器基地址 8 #defineREG_CAN_MOD 0x00 // 内部控制寄存器 9 #define REG_CAN_CMR 0x01 // 命令寄存器 10 #define REG_CAN_SR 0x02 // 状态寄存器 11 #define REG_CAN_IR 0x03 // 中断寄存器 12 #define REG_CAN_IER0x04// 中断使能寄存器13......通常MCU 的总线上会挂载很多器件,除了SJA1000外,可能还有RAM 和ROM 等器件。

项目二 汽车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
测试方 同步 式

CAN控制器SJA1000的控制模块BCAN_20020924

CAN控制器SJA1000的控制模块BCAN_20020924

清除数据溢出 释放接收缓冲器 中止传送 发送请求 总线状态 出错状态 发送状态 接收状态 发送完毕状态 发送缓冲器状态 数据溢出状态 接收缓冲器状态 保留 保留 保留 唤醒中断 数据溢出中断 错误中断 发送中断 接收中断 验收代码 验收屏蔽 ×同步跳转宽度1 同步跳转宽度0 波特率预设值5 波特率预设值4 波特率预设值3 波特率预设值2 波特率预设值1 波特率预设值0 采样 时间段2.2 时间段2.1 时间段2.0 时间段1.3 时间段1.2 时间段1.1 时间段1.0 输出控制晶体管P1 输出控制晶体管N1 输出控制极性1 输出控制晶体管P0 输出控制晶体管N0
2.3.3 各寄存器功能介绍 下面根据实际应用情况 具体介绍 BasicCAN 模式下 SJA1000 内部各寄存器的功能
2.3.3.1 控制寄存器(CR) 控制寄存器位于 SJA1000 寄存器区的 0 地址
如表 4 所示 表 4 控制寄存器各位的说明 CAN 地址 0
用于设置 SJA1000 访问模式和各种中断
SJA1000 提供 2 种封装 SO-28 和 DIP-28
AD6 1
AD7 2
ALE/AS 3
CS 4
RD/E 5
WR 6
CLKOUT 7 VSS1 8
XTAL1 9
SJA1000
XTAL2 10
MODE 11
VDD3 12 TX0 13
TX1 14
28 AD5 27 AD4 26 AD3 25 AD2 24 AD1 23 AD0 22 V DD1 21 V SS2 20 RX1 19 RX0 18 V DD2 17 RST 16 INT 15 V SS3
该软件分为 BasicCAN 软件模块和 PeliCAN 软件模块 本文仅介绍其中 BasicCAN 软件模块的使用方 法 BCAN 版本号 V1.0

基于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);}/*------------------------------------------------

SJA1000中CAN总线同步跳转宽度+波特率控制寄存器的设置

SJA1000中CAN总线同步跳转宽度+波特率控制寄存器的设置

转:SJA1000中CAN总线同步跳转宽度+波特率控制寄存器的设置SJA1000 CAN控制器对时序的设置真的一点也不马虎,到底是怎么样的不马虎法呢?这一篇笔记就让我们听听他的故事。

在总线时序寄存器0和1中,除了对总线的波特率可编程以外,还加了对采样位与同步跳转宽度位域的设置,我们一一的来探索吧:采样位,也就是对[采样]动作进行设置的标志位,在总线时序寄存器1的最高位,也就是SAM位。

当SAM为逻辑1时,采样的次数为3次,反之SAM为逻辑0,采样次数为1次。

这里就存在一个问题,那么什么时候才需要将SAM位置1呢?网络中有这样一个定义,当总线的波特率为中,低等级时,建议将SAM位置1,则当总线波特率为高时SAM位置为0,那么说得比较具体一点的,当总线波特率从100k起为高波特率,波特率从10k~99k之间为中波特率,波特率10k以下为低波特率。

(以上的波特率区分等级是从网络中得知的,见笑了)接下来要探索的就是同步跳转宽度位域,这个专业词听起来很像很可怖似的,但实际上只要明白后会发现到很容易理解的。

在CAN 2.0 协议里,CAN使用了同步跳转宽度位域来兼容不同波特率的总线,视觉化的说法就是说,除了本身设定的波特率以外,该波特率还有上限下界的容差值这些波特率的上限与下界容差换傻瓜的话来说,假设有一个节点将总线时序设置为10kbps,该节点除了支持目前与该它拥有同样总线时序的节点以外,该节点还支持接近总线时序容差值的节点,那么10kbps可以容差值可以假设为10.9kbps,11.2kbps, 9.2kbps , 8.5kbps ...等等,换另一句话来说就是,只要总线时序为10kbps的节点一设置(启动)同步跳转宽度位域,那么如果其他节点拥有总线时序为9.X kbps的话,都会被节点一相互兼容。

那么控制同步跳转宽度位域的寄存器就是总线时序寄存器0的最高两位,SJW.0与SJW.1同步跳转宽度位域的公式如下:Tsjw的值是系统时钟Tscl乘于SJW.0~1的设置。

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内得到传输。

现场总线实验指导书

现场总线实验指导书

现场总线实验指导书实验一SJA100实现双机通讯一、实验目的1.了解CAN总线的基本知识2.掌握CAN控制器SJA1000的使用方法3.掌握硬件及软件的设计方法二、实验设备PC机一台,TD-ACC+试验系统两套 +i386EX系统版两块三、实验原理及内容1.CAN总线单元中,SJA1000与控制计算机的接口2.实验原理将两台实验设备构成的CAN节点连到同一根CAN总线上,总线上的任意节点均可向其它节点发送报文,当某一节点收到另一节点的报文后,可将该报文在屏幕上显示。

发送报文采用按键启动方式,每按动一次按键,发送一帧报文。

报文结构采用扩展帧的格式共13个字节,位于CAN地址的16-28。

该实验采用固定通信速率50kbps,接收报文采用单滤波方式,为了试验程序的统一,将验收屏蔽寄存器AMR0-AMR3全部设定为FF(无关,不过滤)。

3.实验接线图如图1-1。

其中IRQ7表示内部主片8259的7号中断,用作接受报文中断。

图1-1 4.参考程序流程图如图1-2,1-3,1-4图1-2图1-3图1-4四、实验步骤1.参考流程图阅读程序,然后编译,链接,装在程序。

参考程序在CAN86目录下的FuncMain.C2.按照实验线路图1-1接线,将单次阶跃单元中的电位器旋至最大,检查无误后开启设备电源。

3.分别运行节点1和节点2的程序,两个节点可随时发送报文,每按动一次按键就启动报文发送,可在另一节点观测接受到的报文,检查接收的报文和发送的报文是否一致.五、思考题1.解释TxDataBuf缓冲区中数据的含义,特别是描述符区。

2.解释验收屏蔽寄存器代码和验收代码寄存器代码。

3.写出设置波特率为100k的语句。

4.写出设置验收滤波为双滤波模式的语句。

5.改变发送报文数据,观察接收方。

五、选做1、如何将双机通讯改为多机通讯,并增加广播功能(学生的AMR=FFFFFFFF)。

2、当TxDataBuf缓冲区中最后2个数据为‘OK’,在接收方的屏幕上显示出来。

1.实验目的掌握Linux系统SJA1000独立CAN控制器操作方法

1.实验目的掌握Linux系统SJA1000独立CAN控制器操作方法
收屏蔽码和验收代码的值应该如何设置。
广州致远电子有限公司
广州致远电子有限公司
MagicARM2410教学实验开发平台
6.实验步骤
(6)修改USBCAN-II的波特率
由于改变了波特率的值,所以在启动ZLGCANTest软件的时 候需要设置相应的波特率500K,设置界面如图。
广州致远电子有限公司
MagicARM2410教学实验开发平台
7.思考题
如果仅仅希望ID为0x00~0xFF的标准帧能够通过验收过滤器,那么验
广州致远电子有限公司
MagicARM2410教学实验开发平台
5.实验原理
(2)验收过滤器
对于标准帧而言, 11 位标识符和 RTR 位对应 ACR0 、 ACR1 、 AMR0 、 AMR1,其中 ACR1和 AMR1的低四位未使用。标准帧只有 11位标识符,数据场 的前两个字节也参与滤波, Data1 对应 ACR2 、 AMR2 , Data2 对应 ACR3 、 AMR3。参与滤波的数据字节不能作为一般用户数据使用。 若接收的标准帧为一个远程帧(RTR位为1),则只要标识符参与滤波即 可。若接收的标准帧是数据帧,且数据场长度少于 2 字节,则缺少的那部分数 据可以不用参与滤波。对扩展帧而言, 29位标识符和RTR位分别对应 4个 ACR 和4 个AMR,只是ACR3和AMR3的低2位未使用,实际上扩展帧的情况比标准 帧要更简单一些。无论是标准帧还是扩展帧,只有在符合上述条件的验收滤波 通过以后,滤波器才将该帧数据存入接收 FIFO 且置位 RBS (接收标志)标志。
CAN 的通信波特率范围在 5Kbps ~ 1Mbps 之间,通信距离从 40m~10Km,可适应不同的应用场合。通常,CAN的波特率在通 信过程中能够在一定范围内进行自我调整,所以各个厂商的 CAN 设备一般来说都能很好的兼容。

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的时钟分频。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)** 功能描述: 该函数用于不精确的延时。

在12M,6CLK 下,大约延时j*1ms************************************************************** */void Delay_ms(uint8 j){uint8 k,l;for(l=0;l<=j;l++){for(k=0;k<=250;k++){;}}}/************************************************************ ** 函数原型: void SJA1000_Config_Normal(void)** 功能描述: 对SJA1000 的正常模式的初始化配置************************************************************** */void SJA1000_Config_Normal(void){BTR0=0x00;BTR1=0x14; //设置为80k 波特率通信SJAEntryResetMode(); //进入复位模式WriteSJAReg(REG_CAN_CDR,0xc8); //配置时钟分频寄存器,选择PeliCAN 模式WriteSJAReg(REG_CAN_MOD,0x01); //配置模式寄存器,选择双滤波、正常模式WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器WriteSJAReg(REG_CAN_BTR0,BTR0); //配置总线定时器0WriteSJAReg(REG_CAN_BTR1,BTR1); //配置总线定时器1WriteSJAReg(REG_CAN_OCR,0x1a); //配置输出管脚SJAQuitResetMode(); //退出复位模式,进入工作模式}/*********************************************************** 函数原型: void CAN_Data_Send(void)** 功能描述: SJA1000 的单次发送子函数(注意在这个函数的末尾要置位接收中断)*************************************************************/ void CAN_Data_Send(void){// 发送数据WriteSJAReg(REG_CAN_IER,0x02); //使能SJA1000 发送中断位WriteSJARegBlock(16,Send_CAN_Data,13);WriteSJAReg(REG_CAN_CMR,1); //使能发送请求Delay_ms(10);WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000 接收中断}/************************************************************** ** 函数原型: void SJA1000_INT0 (void) interrupt 0** 功能描述: SJA1000 中断响应函数************************************************************** */void SJA1000_INT0(void) interrupt 0{OS_INT_ENTER();EX0 = 0;OSIntSendSignal(0); //无条件的令CAN 接收中断处理任务(CAN_Rcv ())处于就绪状态//由于CAN_Rcv ()的优先级最高,故中断退出后立刻执行CAN_Rcv ().OSIntExit();}void main(void){uint8 i ;OSInit();Init();CAN_Init();//初始化显示缓存for(i=0;i<8;i++){disp_buf[i]=31;}//创建任务OSTaskCreate(CAN_Rcv, NULL, 0);OSTaskCreate(display, NULL, 1);OSTaskCreate(CAN_Send, NULL, 2);OSTaskCreate(TimeSum, NULL, 3);while(1){PCON = PCON | 0x01; //令CPU 进入睡眠状态}}/************************************************************** *****键值发送任务************************************************************** ***/void CAN_Send(void){uint8 key_data;while(1){key_data = ZLG7290_GetKey();if(key_data){Send_CAN_Data[3] = key_data;CAN_Data_Send();disp_buf[4] = key_data % 10;disp_buf[5] = (key_data / 10) % 10;}OSWait(K_TMO,5);}}/************************************************************** ****显示任务************************************************************** ***/void display(void){while(1){OSWait(K_TMO,5);OS_ENTER_CRITICAL();ZLG7290_SendBuf(&disp_buf[0], 8);OS_EXIT_CRITICAL();}}/************************************************************** ***CAN 接收中断处理任务*********************************************************** ****/void CAN_Rcv(void){while(1){OSWait(K_SIG, 0); //挂起当前任务,等待唤醒信号if(ReadSJAReg(REG_CAN_IR)&0x01){//数据接收一定在释放缓冲区之前,释放后数据不确定ReadSJARegBlock(16,Recv_CAN_Data,13);WriteSJAReg(REG_CAN_CMR,4); //释放SJA1000 接收缓冲区disp_buf[0] = Recv_CAN_Data[3] % 10;disp_buf[1] = (Recv_CAN_Data[3] / 10) % 10;}EX0 = 1;}}/****************************************************** *计数任务************************************************************** */void TimeSum(void){while(1){OSWait(K_TMO, 5);disp_buf[7]++;if(disp_buf[7] > 9){disp_buf[7] = 0;}}}五.实验例程简析本驱动程序采用中断方式接收CAN 总线数据。

相关文档
最新文档