CAN控制器 SJA1000中断
- 格式:ppt
- 大小:1.83 MB
- 文档页数:14
SJA1000的错误中断处理SJA1000的错误处理好似还是⽐较复杂的的啦,下⾯是我⾃⼰的⼀些理解,有不对之处还请各位⼤虾多多指点啊!SJA1000的错误有:仲裁丢失;数据溢出;总线错误;错误状态有:错误主动(Error Active)错误被动 (Error Passive)总线关闭;错误中断:总线错误中断;仲裁丢失中断;错误消极中断;数据溢出中断;错误报警中断;涉及到的寄存器:状态寄存器(SR);中断寄存器(IR);中断使能寄存器(EIR);仲裁丢失捕捉寄存器(ALC);错误代码捕捉寄存器(ECC);错误报警限制寄存器(EWLR);TX错误计数寄存器(TXERR);RX错误计数寄存器(RXERR);处理中断当然是从中断寄存器说起了;中断寄存器:只说和错误有关的位啦;IR.7:BEI 总线错误中断;当CAN控制器检测到总线错误且中断使能寄存器(EIR)中的BEIE被置位时此位被置位当前的错误代码可以通过错误代码捕捉寄存器(ECC)获得;其中可以分为:位错误;格式错误;填充错误;其它错误;IR.6:ALI 仲裁丢失中断;当CAN控制器丢失仲裁,变为接收器和中断使能寄存器的ALIE为被置位时,此位被置位当前仲裁丢失的位置可以通过读仲裁丢失捕捉寄存器(ALC)获得;IR.5:EPI 错误消极中断;当CAN控制器到达错误消极状态(Error Passive)(⾄少⼀个错误计数器超过协议规定的值127)或从错误消极状态(Error Passive)⼜进⼊错误活动状态(Error Active)以及中断寄存器的EPIE位被置位时此位被置1IR.3:DOI 数据溢出中断;数据溢出状态位(状态寄存器的SR.1位 DOS)有0-1 跳变且中断寄存器的DOIE位被置位时此位被置1IR.2 EI 错误报警中断;错误状态位(状态寄存器的SR.6位 ES)和总线状态位(状态寄存器的SR.7位 BS)的改变和中断寄存器的EIE位被置位时此位被置1影响错误状态位的有:1,错误计数器⾄少有⼀个错误计数器满2,超过错误报警限制寄存器(EWLR)设置的值时错误状态位被置位;报警中断。
我的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)。
它是PHILIPS半导体PCA82C200 CAN控制器(BasicCAN)的替代产品。
而且,它增加了一种新的工作模式(PeliCAN),这种模式支持具有很多新特性的CAN 2.0B协议。
特性
和PCA82C200独立CAN控制器引脚兼容;
和PCA82C200独立CAN控制器电气兼容;
PCA82C200模式(即默认的BasicCAN模式);
扩展的接收缓冲器(64字节、先进先出FIFO);
和CAN2.0B协议兼容(PCA82C200兼容模式中的
无源扩展帧);
同时支持11位和29位识别码;
位速率可达1Mbits/s;
PeliCAN模式扩展功能:
--可读/写访问的错误计数器
--可编程的错误报警限制
--最近一次错误代码寄存器
--对每一个CAN总线错误的中断
--具体控制位控制的仲裁丢失中断
--单次发送(无重发)
--只听模式(无应答、无主动的出错标志)
--支持热插拔(软件实现的位速率检测)
--验收滤波器扩展(4字节代码,4字节屏蔽)
--自身信息接收(自接收请求)
24MHz时钟频率;
对不同微处理器的接口;
可编程的CAN输出驱动器配置;
增强的环境温度范围(-40-+125℃)。
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程序给你提供一些思路1、sja1000初始化2、发送子程序3、中断方式接收下面是一些程序段你参考下(已用于产品)/**********SJA1000初始化***********//void Init_SJA1000(void){uchar state;uchar ACRR[4]={0XAA,0XFF,0X22,0X11};// 接收代码寄存器uchar AMRR[4]={0xff,0xff,0xff,0xff};// 接收屏蔽寄存器//uchar AMRR[4]={0x00,0x00,0xff,0xff};// 接收屏蔽寄存器do// 使用do--while语句确保进入复位模式{MODR = 0x09; // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器state = MODR;}while( !(state & 0x01) );// 对SJA1000部分寄存器进行初始化设置CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CANBTR0 = 0x04;//0x31; // 总线定时寄存器0 ;总线波特率设定BTR1 = 0x1c;//0x1c; // 总线定时寄存器1 ;总线波特率设定IER = 0x01; // IER.0=1--接收中断使能;IER.1=0--关闭发送中断使能OCR = 0xaa; // 配置输出控制寄存器CMR = 0x04; // 释放接收缓冲器ACR0 = ACRR[0];// 初始化接收代码寄存器ACR1 = ACRR[1];ACR2 = ACRR[2];ACR3 = ACRR[3];AMR0 = AMRR[0];// 初始化接收屏蔽寄存器AMR1 = AMRR[1];AMR2 = AMRR[2];AMR3 = AMRR[3];do// 使用do--while语句确保退出复位模式{MODR = 0x08; //MOD.3=0--双滤波器模式state = MODR;}while( state & 0x01 );}////////////////////////////////////////**********CAN发送数据到CAN-Bus***********//void CAN_TXD(void){uchar state;//初始化标示码头信息TX_buffer[0] = 0x88; //.7=0--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节// TX_buffer[1] = 0xFF; //本帧信息的ID//TX_buffer[2] = 0xFF;TX_buffer[3] = 0xFF;TX_buffer[4] = 0xFF;do //查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行{state = SR; //SR为SJA1000的状态寄存器}while( state & 0x10 ); //SR.4=1 正在接收,等待do //查询SJA1000是否处于发送完毕状态{state = SR;}while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1do //查询发送缓冲器状态{state = SR;}while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。
SJA1000在CAN总线系统节点的应用摘要:介绍CAN总线控制器SJA1000;给出其在CAN总线系统节点中的应用方法、节点电路原理图及初始化程序;针对用户SJA1000容易出现的问题进行了解说。
关键词:CAN总线SJA1000 节点单片机CAN 总线是德国Bosch公司20世纪80年代初,为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发一种串行数据通信协议。
1993年11月,ISO正式颁布了道路交通运载工具,进行数据信息交换用的高速通信控制局部网(CAN)的国际标准(ISO11898)。
PHILIPS、Intel、MOTOROLA等公司出品了很多支持CAN协议的集成芯片,如82526、SJA1000、68HC05X4/X16/X32和具有片内CAN的电磁兼容微控制器P8XCE598、16位微控制器87C196CA/CB等。
下面介绍PHILIPS半导体公司推出的CAN总线控制器SJA1000,并给出其应用实例。
1 CAN总线控制器SJA1000芯片介绍SJA1000是一种独立的CAN总线控制器。
PHILIPS半导体公司将它作为PCA82C200 CAN 控制器(Basic CAN)的替代产品。
SJA1000增加了一种新的工作模式(Peli CAN),这种模式支持具有很多新特性的CAN 2.0B协议。
1.1 SJA1000引脚介绍图1是SJA1000引脚图。
SJA1000具有28个引脚,下面对部分引脚进行介绍。
MODE:模式选择输入,1(高电平)=Intel模式;0(低电平)=Motorola模式。
TX0、TX1:从CAN输出驱动器0,1输出到物理总线上。
RX0、RX1:从物理CAN总线输入到SJA1000的输入比较器。
INT:中断输出,用于中断微控制器。
INT在内部中断寄存器各位都置位时,低电平有效。
INT是开漏输出。
CLKOUT:SJA1000产生的提供给微控制器的时钟输出信号,时钟信号来源于内部振荡器且通过编程驱动,时钟控制寄存器的时钟关闭位可禁止该引脚。
SJA1000简介2010-3-17 5:57:00PCA82C250提供对总线的差动发送和对CAN控制器的差动接收功能,也增大了通信距离,提高了系统的瞬间抗干扰能力,保护总线,降低射频干扰(RF I),实现了热防护等功能。
发送子程序负责节点报文的发送,由CAN控制器SJA 1000独立完成,将命令寄存器里的发送请求标志置位,即可发送SJA1000发送缓冲区中的报文。
CAN总线及CAN控制器SJA1000简介CAN总线最初是德国Bosch公司在1986 年为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种支持分布式实时控制系统的串行数据通讯总线。
CAN总线与其它通信网的显著不同之处在于:(1)报文传送中不包含目标地址,它是以全网广播为基础,各接收站根据报文中反映数据性质的标识符过滤报文,该收的收下,不收的弃用。
其好处是可线上网下网、即插即用和多站接收。
(2)特别强化了对数据安全性的关注,满足控制系统及其它较高数据要求的系统需求。
另外CAN总线采用短帧结构,借助接收滤波的多地址帧传送,受干扰概率低,每帧信息都有CRC校验及其它检错措施。
响应远程数据请求,配置灵活,具有全系统的数据相容性。
节点数主要取决于总线驱动电路,目前最多可达110个节点。
CAN总线符合ISO11898标准,通信速率高,最大传输速率可达1Mb it/S,最大传输距离为10km,传输介质可为双绞线。
基于CAN总线以上的特点,把它应用于系统分布比较分散且需要在同一总线上挂接多个节点的场合是非常适合的。
目前广泛流行的CAN总线器件有两大类:一类是独立的CAN控制器,如PhilipS公司的PCA82C200,SJA1000及Intel82256/82257等;另一类是带有在片CAN的微控制器,如P8XC582等。
其中Philips公司的PCA82C200是符合CAN 2. 0A协议的总线控制器,SJA1000是它的替代产品,它是应用于汽车和一般工业环境的独立CAN总线控制器。
一、以下是我做的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的时钟分频。
摘要:介绍can控制器sja1000的特点、内部结构以及sja1000的寄存器结构及地址分配;can协议通信格式。
并以独立can控制器sja1000为例,结合can协议说明了一种通用型can 总线的开发与设计。
关键词:can总线 sja1000 单片机1 sja1000简介sja1000是philips公司早期can控制器pca82c200的替代品,功能更强,具有如下特点:①完全兼容pca82c200及其工作模式,即basiccan模式;②具有扩展的接收缓冲器,64字节的fifo结构;③支持can2.0b;④支持11位和29位识别码;⑤位速率可达1mbit/s;⑥支持pelican 模式及其扩展功能;⑦24mhz的时钟频率;⑧支持与不同微处理器的接口;⑨可编程的can 输出驱动配置;⑩增强了温度范围(-40℃~+125℃)。
图1 sja1000内部结构2 sja1000内部结构sja1000的内部结构如图1所示,主要由接口管理逻辑iml、信息缓冲器(含发送缓冲器txb和接收缓冲器rxfifo)、位流处理器bsp、接收过滤器asp、位时序处理逻辑btl、错误管理逻辑eml、内部振荡器及复位电路等构成。
iml接收来自cpu的命令,控制can寄存器的寻址并向控制提供中断信息及状态信息。
cpu的控制经iml把要发送的数据写入txb,txb中的数据由bsp处理后经btl输出到can bus。
btl始终监视can bus,当检测到有效的信息头“隐性电平-控制电平”的转换时启动接收过程,接收的信息首先要由位流处理器bsp处理,并由asp过滤,只有当接收的信息的识别码与asp检验相符时,接收信息才最终被写入rxb或rxfifo中。
rxfifo最多可以缓存64字节的数据,该数据可被cpu读取。
eml负责传递层中调制器的错误管制,它接收bsp的出错报告,促使bsp和iml进行错误统计。
3 sja1000的寄存器结构及地址分配表1是工作在basic can模式下的sja1000的寄存器结构及地址分配表。