CAN总线控制器-SJA1000源程序(c语言)解读复习进程

合集下载

第4章2(CAN控制器1,2014)讲解

第4章2(CAN控制器1,2014)讲解

功能 位错误 格式错误 填充错误 其他错误
前表中ECC.4~ECC.0功能的解释见下表。
ECC.4 0 0 0 0 0 0 0 0 0 0 0 0
ECC.3 0 0 0 0 0 0 1 1 1 1 l 1
ECC.2 0 0 1 l l 1 l 0 1 0 0 0
ECC.1 1 1 1 0 0 l 1 1 0 0 1 l
工作模式是通过置位控制寄存器的复位请 求位激活的。
对Basic CAN模式,只作上面这些简单的 介绍,下面主要介绍比较常用的SJA1000的 Peri CAN模式。
Basic CAN模式下的SJA1000主要寄存器 和PeliCAN模式下的寄存器工作原理相同。
4.2 独立的控制芯片SJA1000及其使用 ——4.2.3 Peli CAN模式
11. 接收缓冲器RXB 接收缓冲器与前面的发送缓冲器很相似,
每条信息也都分为描述符区和数据区。
接收缓冲器(13B)是RXFIFO(64B)的可访问 部分,也位于CAN地址的16~28(对这些CAN 地址,读操作访问的是接收缓冲器;写操作则 访问发送缓冲器)。
接收缓冲器的地址列表和每个地址的字节
7.中断使能寄存器IER(CAN地址4) 该寄存器是可读/写的。 能使不同类型的中断源是否使能。
各位功能如表4.9所示。
8.仲裁丢失捕捉寄存器ALC(CAN地址11) 该寄存器包括了仲裁丢失的位置的信息, 对CPU来说是只读寄存器,读其到的留位的值 为0。仲裁丢失捕捉寄存器的位分配如下:
(CAN地址31)
2. Peli CAN复位模式配置(控制段) 检测到模式寄存器(前表中CAN地址0)的 MOD.0=1(复位模式位置位)后,CAN控制器 中止当前发送/接收信息而进入复位模式。 复位模式位由“1”变“0”时,CAN控制器回 到模式寄存器所定义的工作模式。

独立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)

SJA1000程序

SJA1000程序

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,发送缓冲器被锁。

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

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

文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.第3章 CAN 控制器驱动1.1 SJA1000初始化1.1.1 初始化流程SJA10000在上电复位后处于复位模式,要使SJA1000能正常收发CAN 帧数据,必须对SJA1000进行初始化,SJA1000初始化流程详见图3.1。

1. 进入复位模式SJA1000的配置寄存器只有在复位模式下才能访问,所以必须首先置位模式寄存器的0位,以进入复位模式。

2. 设置模式寄存器模式寄存器用于设置SJA1000工作模式,定义详见表3.1。

表3.1 SJA1000模式寄存器定义RM :复位模式位,置位该位将使SJA1000进入复位模式,清零该位则退出复位模式返回工作模式。

LOM :只听模式位,设置该位后,SJA1000处于只听模式。

只听模式只从CAN 总线接收数据,不能向总线上发送数据也不会产生错误帧。

只听模式常用于自动波特率检测功能,例如在软件里预先定义一个包含所有可能的位频率以及它们的位时序参数的表格,使能SJA1000接收和错误中断,依次尝试表格中的位时序参数,如果在CAN 总线上产生了错误,软件转向下一个位时序参数,在一条信息的成功地接收后,表明软件已经检测到正确的位时序参数。

STM :只检测模式位,设置该位后,SJA1000在发送CAN 帧时不检查应答位,可以实现单个CAN 节点的发送功能。

AFM :验收滤波器模式,设置该位时使用单滤波功能;清零该位时使用双滤波功能。

SM :睡眠模式位,设置该位时,SJA1000进入睡眠模式,降低功耗。

3. 设置时钟分频寄存器时钟分频寄存器用于选择BasicCAN 模式还是PeliCAN 模式、CLKOUT 管脚控制、CAN 输入比较器控制,寄存器的位定义详见表3.2。

表3.2 SJA1000时钟分频寄存器定义4. 设置CAN 波特率波特率是异步串行通信中的重要参数,指每秒钟能发送的数据位元数量,只有相同波特率图3.1 SJA1000初始化流程图文库资料 ©2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd.的设备才能互相通信,CAN-bus 使用异步串行通信技术,同样需要遵守该规则。

CAN总线学习笔记二:CAN自收发程序解读

CAN总线学习笔记二:CAN自收发程序解读

CAN总线学习笔记二:CAN自收发程序解读花了一整个下午的时间,彻头彻尾的把PIAE小组提供的CAN自收发源程序解读了一遍。

解读别人的程序是一件挺费时费力的一件事,但是在对某项技术或者说某个芯片的入门阶段参考别人的程序又是一项必不可少的任务。

对于这个程序,头一个任务当然是把头文件先浏览一遍,能弄明白的还是先弄明白,对后面程序的解读有好处。

C文件里给出了三个头文件:#include#include#include第一个reg52.h我就不废话了,下一个intrins.h我在上一篇日志里也详细的作了说明,这里也不提了。

can_selfdef.h是程序员自己定义的一个头文件,在这个头文件里除了一些宏定义和管脚的一些说明外,最重要的就是要弄明白“CAN总线SJA1000寄存器地址定义”。

这个我开始也没弄明白,后来反复琢磨,才发现作者在这个程序里吧SJA1000的寄存器作为单片机的外部扩展RAM寻址了,从而省去了编写一些底层的驱动程序,这就让大家连SJA1000的datasheet的时序图都不用看了(不过下一步我想用驱动程序来控制SJA1000)。

看完头文件,可不能从第一个程序依次往下看。

应该直接找到主程序main()解读:void main(void){//MCU初始化(主要是各中断寄存器的初始化)SJA_RST = 1; //CAN总线复位管脚复位无效SJA_CS = 0; //CAN总线片选有效EX1 = 1; //开MCU外部中断INT1IT1 = 0;//MCU外部中断INT1为电平触发,也是CAN总线接收中断口IT0 = 1;//MCU外部中断INT0为下降沿触发EX0 = 1; //开MCU外部中断INT0EA = 1; //开MCU总中断SJA_CS = 1; //CAN总线片选无效,使得对数据总线的操作不会影响SJA1000。

//SJA1000初始化CAN_init(); //对SJA1000寄存器的读写是采用外部寄存器寻址方式,//所以不需要程序单独控制片选有效无效_nop_();_nop_();//主循环while(1){_nop_();_nop_();Rxd_deal(); //接收处理程序Txd_deal(); //发送处理程序led_seg7(0,Txd_data); //数码管1-2显示发送数据子程序led_seg7(1,Rxd_data+3); //数码管3-4显示接收数据子程序}}上面的注释是本人详细做了加工的,先是单片机中断寄存器的初始化,打开了单片机的INT0和INT1两个外部中断。

CAN控制器SJA1000

CAN控制器SJA1000

5.1.2 CAN的性能特点

短帧结构,传输时间短,受干扰概率低,适于工 业环境 每帧信息都采用CRC校验及其他检错措施,数据 出错率极低。 通信介质选择灵活(双绞线、同轴电缆或光纤) 错误严重情况下自动关闭输出,保证不影响总线 上其他节点通信。 性价比高,器件容易购臵,节点价格低。 开发技术容易掌握,能充分利用现有的单片机开 发工具。

5.2.3.4 错误帧
数据帧
错误标志 错误标志的重叠
错误帧
帧间空间 或过载帧
错误界 定符
Байду номын сангаас

错误帧由两个不同的场组成,第一个场是不同站 提供的错误标志的叠加,第二个场是错误界定符。 错误标志分两种,主动(激活)错误标志(6个显 性位)和被动(认可)错误标志(6个隐性位) 检测到错误条件的“错误主动”站发送主动错误 标志,这样一来所有其他站都会检测到错误条件 并开始发送错误标志。叠加在一起最多12个显性 位

5.2.3.2 数据帧
帧间空间 数据帧 帧间空间
仲裁场 帧起始
控制场
数据场
CRC场
帧结束 ACK场

由7个不同的场组成。数据场长度可为0 CAN2.0B存在标准和扩展两种帧格式 为了设计简单,可以对标准格式执行部分扩展, 不一定要完全扩展 可以用整个标识符进行报文滤波,也可以把标识 符屏蔽一部分进行报文滤波
数据帧的标准格式和扩展格式
应答场为2位,包括应答间隙和应答界定符,不进 行位填充。 在应答间隙时间,发送器发隐位;所有正确接收 到有效报文的接收器发一个显位。 应答界定符为隐位(1)。 帧结束:由7个隐位组成,不进行位填充。 7.2.3.3 远程帧 需要数据的节点可以发送远程帧请求另一节点发 送相应数据帧 远程帧的RTR位是隐性的,它没有数据场,所以 数据长度码没有意义。

CAN控制器SJA1000中文资料

CAN控制器SJA1000中文资料
-5-
广州周立功单片机发展有限公司 Tel 020 38730976 38730977 Fax:38730925
器 RXB 13 个字节 作为接收 FIFO RXFIFO 长 64 字节 的一个窗口 可被 CPU 访问 CPU 在此 FIFO 的支持下 可以在处理信息的时候接收其它信息 6.1.4 验收滤波器 ACF 验收滤波器把它其中的数据和接收的识别码的内容相比较 以决定是否接收信息 在纯粹的接收测试中
6.2 CAN 控制器的详细说明 SJA1000 在软件和引脚上都是与它的前一款 PCA82C200 独立控制器兼容的 在此基础上它增加了很 多新的功能 为了实现软件兼容 SJA1000 增加修改了两种模式 y BasicCAN 模式 与 PCA82C200 兼容 y PeliCAN 模式 扩展特性 工作模式通过时钟分频寄存器中的 CAN 模式位来选择 复位默认模式是 Basic CAN 模式 6.2.1 与 PCA82C200 兼容性 在 Basic CAN 模式中 SJA1000 模仿 PCA82C200 独立控制器所有已知的寄存器 在 6.2.1.1 到 6.2.1.4 节中所描述的特性不同于 PCA82C200 这主要是为了软件上的兼容性 6.2.1.1 同步模式 在 SJA1000 的控制寄存器中没有 SYNC 位 在 PCA82C200 中是 CR.6 位 同步只有在 CAN 总线上 弱势-支配 控制 的转换时才有可能发生 写这一位是没有任何影响的 为了与现有软件兼容 读取 这一位时是可以把以前写入的值读出的 对触发电路无影响 6.2.1.2 时钟分频寄存器 时钟分频寄存器用来选择 CAN 工作模式 Basic CAN /Peli CAN 它使用从 PCA82C200 保留下来的 一位 象在 PCA82C200 中一样 写一个 0-7 之间的值 就将进入 Basic CAN 模式 默认状态是 12 分频 的 Motorola 模式和 2 分频的 Intel 模式 保留的另一位补充了一些附加的功能 CBP 位 见表 49 的置位 使内部 RX 输入比较器旁路 这样在使用外部传送电路时可以减少内部延时 6.2.1.3 接收缓冲器 PCA82C200 中双接收缓冲器的概念被 Peli CAN 中的接收 FIFO 所代替 这对软件除了会增加数据溢出 的可能性之外 不会产生应用上的影响 在数据溢出之前 缓冲器可以接收两条以上信息 最多 64 字节 6.2.1.4 CAN 2.0B SJA1000 被设计为全面支持 CAN 2.0B 协议 这就意味着在处理扩展帧信息的同时 扩展振荡器的误 差被修正了 在 Basic CAN 模式下只可以发送和接收标准帧信息 11 字节长的识别码 如果此时检测到 CAN 总线上有扩展帧的信息 如果信息正确 也会被允许且给出一个确认信号 但没有接收中断产生 6.2.2 Basic CAN 和 Peli CAN 模式的区别 在 Peli CAN 模式下 SJA1000 有一个含很多新功能的重组寄存器 SJA1000 包含了设计在 PCA82C200 中的所有位及一些新功能位 Peli CAN 模式支持 CAN 2.0B 协议规定的所有功能 29 字节的识别码 SJA1000 的主要新功能

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通信控制器SJA1000解读

CAN通信控制器SJA1000解读
3、中断寄存器对微控制器来说是只读存储器;
4、该寄存器被微控制器读过之后,所有位被复位,则 /INT为1,中断信号自动清除,以免重新引起中断。
各个位的功能如下:
位 符号 名 称 值
功能
IR.2 EI IR.1 TI IR.0 RI
错误中断使能时,错误状态位或总线状态位的 错误中断 1 变化会置位此位
BIT 1 BRP.1
BIT 0 BRP.0
(1)波特率预置器(BRP)——决定CAN的系统时钟和位定时
(2)同步跳转宽度(SJW)
为了补偿在不同总线控制器(SJA1000)的 时钟振荡器之间的相移,任何总线控制器必须重 同步于当前发送的任何相关信号沿。
➢既支持11位标识符,也支持29位标识符;
1 特性
➢ 位速率最高可达1Mbps; ➢ 支持PeliCAN扩展模式: ➢ 最高24MHz时钟频率; ➢ 方便与各种微控制器接口; ➢ 可编程的CAN输出驱动器配置; ➢ 增强的环境温度范围(-40 —125℃ )。
2 一般说明
➢SJA1000有两种工作模式:
CR.3 EIE 错误中断使能
CR.2 TIE 发送中断使能 CR.1 RIE 接收中断使能
值功

- 保留;
- 保留;
- 保留;
使能;如果数据溢出位被置位,微控制器接收 1 一个溢出中断信号(见状态寄存器—数据溢出
状态位)
0 禁止;微控制器不从SJA1000接收溢出中断信号
使能;如果出错或总线状态改变,微控制器接 1 收一个错误中断信号(见状态寄存器—出错状
1 错误;
0 正常; 1 发送;SJA1000正在发送一个报文 0 空闲;没有报文在发送中 1 接收;SJA1000正在接收一个报文 0 空闲;没有报文在接收中

CAN总线控制器SJA1000详解

CAN总线控制器SJA1000详解

5
TSEG 2.1
4
TSEG 2.0
3
TSEG 1.3
2
TSEG 1.2
1
TSEG 1.1
0
TSEG 1.0
总线定时寄存器1定义了每个位周期的长度、采样 点的位置和每个采样点的采样数目。
6.5 控制段寄存器
• 位周期=同步段(T_syncseg)+采样前段(T_tseg1)+ 采样后段(T_tseg2)
(3)TIE:发送中断允许位,若置位,当一个报文成功发送 或发送缓冲区再次可访问时(如在中止的发送命令后), 将会产生中断,复位时无发送中断产生。
(4)RIE:接收中断允许位,若置位,当一个报文被无误地 接收时将会产生接收中断,复位时无接收中断产生。
6.5 控制段寄存器
(5)RR :复位请求位,该位置位后,SJA1000将会终止 当前报文的接收或发送而进入复位工作状态。
(5) TCS: 发送完成标志,“1”表示上次的发送已成功完成。 (6) TBS: 发送缓冲区状态标志,“1”表示发送缓冲区可写。 若该位为“0”时,MCU写发送缓冲区,则写入数据无效且被 丢失。 (7) DOS: 数据超载标志,“1”表示由于RXFIFO没有足够的空 间,收到的报文丢失。 (8)RBS: 接收缓冲区状态标志,“1”表示RXFIFO中至少有 一个报文。当MCU读取报文后,应给出释放接收缓冲区的命 令,该标志才会清零。若RXFIFO中还有未读报文,该位又将 被置位。
T_sjw=T_scl×(1+SJW.0+2×SJW.1)
6.5 控制段寄存器
• 同步跳转宽度:定义了一个位周期可以 被一次重新同步缩短或延长的时钟周期 的最大数目。
6.5 控制段寄存器
一位时间的一般结构图

项目二 汽车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资料

CAN总线控制器SJA1000资料

• 支持11位和29位标识码
• 位速率最高可达1Mbps • 可与不同的微处理器接口 • 可编程的CAN输出驱动器配置 • 温度适应范围大(-40℃ — +125℃)
6.2 SJA1000介绍
6.3 SJA1000内部结构框图
机电工程与自动化学院
逻辑管理接口
发送缓 冲器
位流处 理器
位时序 逻辑
接收缓 冲器
仅用于测试
发送缓冲器 接收缓冲器
输出缓冲寄存器 TXB
输入缓冲寄存器 RX




FFH

×

30
31
时钟分频器
未用
时钟分频寄存器 OCR
FFH

×
部分√
FFH

×

6.4 基本模式(Basic CAN)
二、 SJA1000的工作状态
两种状态:复位状态和运行状态 1. 复位状态 三种情况下,SJA1000进入复位状态
CAN控制器的作用
CAN控制器扮演网络协议的角色 它提供了微处理器的物理线路的接口 进行数据的发送和接受
6.1
CAN控制器的作用
6.2 SJA1000介绍
• 管脚与独立CAN控制器PCA82C200兼容
• 电气特性与独立CAN控制器PCA82C200兼容 • 具有PCA82C200模式(即默认的BasicCAN模式) • 扩展的接收缓存器(64字节的FIFO队列) • 支持CAN2.0A和CAN2.0B协议
数据段
1. 报文被发送前,微处理器将报文写入发送缓冲区 2. 成功接收一个报文后 ,写入接收缓冲区 3. 微处理器读接收缓冲区并释放缓冲区

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

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)。
//SJA_workmode=0工作在复位模式
//-----------------------定义SJA1000读写缓冲区的数据结构--------------------------------------------------------
struct BASICCAN_BUFStruct{
unsigned char IDH8;
--可编程的错误报警限制
--最近一次错误代码寄存器
--对每一个CAN总线错误的中断
--具体控制位控制的仲裁丢失中断
--单次发送无重发
--只听模式无确认无活动的出错标

--支持热插拔软件位速率检测
--验收滤波器扩展4字节代码4字节屏蔽
--自身信息接收自接收请求
24MHz时钟频率
对不同微处理器的接口
可编程的CAN输出驱动器配置
#define SJA_BTR1 0x2F
//-----------------------设置接收报文类型(标示符)--------------------------------------------------------
//该值需要用户根据实际需要重新配置
#define SJA_ACR 0xne SJA_EIE 1 //错误中断
#define SJA_TIE 1 //发送中断
#define SJA_RIE 1 //接收中断
//-----------------------定义地址指针,指向基址--------------------------------------------------------
#define base_Adr 0x7F00
//-----------------------定义总线定时寄存器的值--------------------------------------------------------
#define SJA_BTR0 0x07 //该值需要用户根据需要的波特率进行计算,推荐使用周立功发布的波特率计算器
#define SJA_CDR 0x40 //时钟分频寄存器的值
//-----------------------设置SJA中断,1为开中断--------------------------------------------------------
#define SJA_OIE 1 //溢出中断
//sbit SJA_RST = P1^2;
/*P3口的管脚定义*/
sbit SJA_RD = P3^7;
sbit SJA_WR = P3^6;
//-----------------------定义寻址的基址--------------------------------------------------------
#define SJA_AMR 0xFF //验收屏蔽寄存器的值
//-----------------------设置输出时钟类型--------------------------------------------------------
//该值需要用户根据实际需要重新配置
#define SJA_OCR 0xaa //输出控制寄存器的值
unsigned char xdata *SJA_base_Adr = base_Adr;
//-----------------------定义硬件故障标志位--------------------------------------------------------
bit bdata connect_OK=0; //connect_OK=1设备连接正常
CAN总线控制器sja1000源程序
SJA1000是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN它是PHILIPS
半导体PCA82C200 CAN控制器BasicCAN的替代产品而且它增加了一种新的工作模式PeliCAN ,
这种模式支持具有很多新特性的CAN 2.0B协议。
1特性
和PCA82C200独立CAN控制器引脚兼容
增强的温度适应-40-+125
#include <reg52.h>
#include <AT89X51.H>
#include <intrins.h>
//-----------------------沿袭引脚和变量----------------------------------------------
unsigned char IDL_R_DLC;
unsigned char Frame_Data[8];
}receive_BUF,send_BUF;
//------------------------------------------------------------------------------------------------------
//函数类别供调用子函数
//函数名称send_BUF_init
和PCA82C200独立CAN控制器电气兼容
PCA82C200模式即默认的BasicCAN模式
扩展的接收缓冲器64字节先进先出FIFO
和CAN2.0B协议兼容PCA82C200兼容模式中的无源扩展帧
同时支持11位和29位识别码
位速率可达1Mbits/s
PeliCAN模式扩展功能
--可读/写访问的错误计数器
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
void MCU_init(void);
/*P2口的管脚定义*/
sbit LED1 = P2^6;
sbit LED2 = P2^5;
sbit SJA_CS = P2^7; //SJA1000片选管脚,低电平有效
//connect_OK=0设备连接故障
//-----------------------定义硬件故障标志位--------------------------------------------------------
bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式
相关文档
最新文档