CAN总线控制器SJA源程序(c语言)
原创作品-单片机及其它CPU外接CAN控制器SJA100程序设计

外接CAN控制器SJA100程序设计1 初始化SJA1000void CanInitialize(){CAN_RESET=1; //定义好sbit CAN_RESET=PX^X; CAN_RESET=0; CAN_RESET=0; CAN_RESET=0;CAN_RESET=1; CAN_RESET=1; CAN_RESET=1;ModeControlReg=0x01;ClockDivideReg=0x88;InterruptEnReg=0x00;AcceptCode0Reg=0xff; //验证码设置,参考SJA100数据手册AcceptCode1Reg=0xff;AcceptCode2Reg=0xff;AcceptCode3Reg=0xff;AcceptMask0Reg=0xff; //屏蔽码设置,参考SJA100数据手册AcceptMask1Reg=0xff;AcceptMask2Reg=0xff;AcceptMask3Reg=0xff;BusTiming0Reg =0x7f;BusTiming1Reg =0xff; //速率5K SJA1000晶振采用16MHz OutControlReg =0x1a;RxBufStartAdr =0x00;TxErrCountReg =0x00;ErrCodeCapReg =0x00;ModeControlReg=0x00;}2 发送函数void CanTxd(unsigned char FrameForm,unsigned char TargetAddress,unsigned char Command,unsigned char SourceAddress,unsigned char ID3,unsigned char Data5, unsigned char Data6, unsigned char Data7, unsigned char Data8, unsigned char Data9,unsigned char Data10, unsigned char Data11,unsigned char Data12){TxFrameInfo=FrameForm; //发送时此为固定数,即0x88,即扩展帧,字节数为8 TxBuffer1 =TargetAddress;TxBuffer2 =Command;TxBuffer3 =SourceAddress;TxBuffer4 =ID3;TxBuffer5 =Data5;TxBuffer6 =Data6;TxBuffer7 =Data7;TxBuffer8 =Data8;TxBuffer9 =Data9;TxBuffer10 =Data10;TxBuffer11 = Data11;TxBuffer12 = Data12;}3 接收函数void CanRxd(){unsigned char ReadCounter=5; //定义读次数while((RxMsgCountReg)&& ReadCounter --){CanData[0] =RxFrameInfo; //接收缓冲器首地址CanData[1] =RxBuffer1;CanData[2] =RxBuffer2;CanData[3] =RxBuffer3;CanData[4] =RxBuffer4;CanData[5] =RxBuffer5;CanData[6] =RxBuffer6;CanData[7] =RxBuffer7;CanData[8] =RxBuffer8;CanData[9] =RxBuffer9;CanData[10]=RxBuffer10;CanData[11]=RxBuffer11;CanData[12]=RxBuffer12;CommandReg=0x04;}}特别提示:使用前应定义好以上函数中的特殊功能寄存器地址。
基于51单片机的CAN通讯协议C语言程序

// 入口函数 无
// 出口函数 无
// 全局变量 SJA_workmode
// 操作寄存器 控制寄存器(地址00)
// 函数功能 设置SJA工作在复位模式
#define SJA_RIE 0 //接收中断
//-----------------------定义地址指针,指向基址--------------------------------------------------------
bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式
//SJA_workmode=0工作在复位模式
#define base_Adr 0x00
//-----------------------定义总线定时寄存器的值--------------------------------------------------------
#define SJA_BTR0 0x00 //该值需要用户根据实际需要的波特率进行计算
//------------------------------------------------------------------------------------------------------
// 函数类别 SJA1000基本操作
// 函数名称 CANREG_write
}BASICCAN_FRAME,receive_BUF,send_BUF;
//BASICCAN_BUFstruct send_BUF;
//------------------------------------------------------------------------------------------------------
我的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模式操作过程。
CAN总线控制器SJA 1000的开发与设计

第 4卷第 2期
20 0 7年 4月
现 代 交 通 技 术
Mo e r n p r t n T c n lg d r T a s ot i e h oo y n ao
Vo . N0 2 1 4 .
Ap .0 7 r 0 2
文章编号:6 2 9 8 (0 7 2 0 8— 3 17 — 8 920 ) — 0 10 0
a d s f a ed sg r ie . n ot r e in a eg v n w
K yw rs C Nb srg t ; n tr c ci tent la o d ld s n e od : A u ; ie j c e i ut h ia zt n e s r u u r ; i ii i moue ei g
0 引言
于移 动 目标 和一 般工业 环境 中的局域 网控 制 。它是
C N总线 是 德 国 B sh公 司从 8 代 初 为解 A oc 0年
P IIS HLP 公司早期 C N控制器 P A 2 20的替代 A C 8C0 产品. 并且增加了一种新的工作模式 Pl A , e C N 这种 i 模式 支持 具有很多新特性 的 C N . A 2 B协议 , 0 因此 功 能 更 加 强 大 。它 具 有 如 下 特 点 [:1完 全 兼 容 2 () 3 P A 220 C 8C 0 及其工作模式 , B s C N模式 ; ) 即 ai A c ( 具 2 有扩展的接收缓冲器为 6 B 4 ,先进先 出 (IO ; ) FF )( 3 C N. A 2 B协议兼容 ; ) 0 ( 支持 lb 和 2b 识别码 ; 4 i l t 9i t ( 位速率可达 1 b / ( 支持 Pl A 5 ) is 6 M t; ) eC N模式及其 i 扩展功能; ) H 的时钟频率 ; ) (2 M z 74 ( 支持与不 同微 8 处 理 器 的 接 口 ; )可 编 程 的 C N输 出 驱 动 器 配 ( 9 A
独立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)
51单片机can总线c语言程序,51单片机的can总线通讯程序

51单⽚机can总线c语⾔程序,51单⽚机的can总线通讯程序#i nclude//单⽚机头⽂件#i nclude//SJA存储器定义头⽂件#i nclude//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) //错误中断{ err_flag=0; //错误标志位清零Sja_1000_Init(); //初始化SJA}}}。
第7章CAN总线控制器SJA1000

上一页 下一页 返回
第六节 SJA1000详细介绍
⑥最近一次的误码寄存器; ⑦对每一个CAN总线错误的错误中断; ⑧仲裁丢失中断以及详细的位位置; ⑨一次性发送(当错误或仲裁丢失时不重发); (10)只听模式(CAN总线监听,无应答,无错误标志); (11)支持热插(无干扰软件驱动位速检测); (12)硬件禁止CLKOUT输出。
第七章 CAN控制器SJA1000
第一节 CAN控制器的作用 第二节 SJA1000概述 第三节 SJA1000内部结构及引脚定义 第四节 SJA1000在系统中的位置 第五节 CAN的控制模块
第六节 SJA1000详细介绍
第一节 CAN控制器的作用
在CAN的网络层次结构中,数据链路层和物理层是保证通信 质量直观重要、不可缺少的部分,也是网络协议中最复杂的 部分。CAN控制器就是扮演这个角色,它是一块可编程电路 的组合来实现这些功能,对外它提供了与微处理器的物理线 路的接口。通过它的编程,CPU可以设置它的工作方式,控 制它的工作状态,进行数据的发送和接收,把应用层建立在 它的基础之上。 目前,许多知名的半导体厂家都生产了CAN控制芯片。其类 型一种是独立的,一种是与微处理器集成在一起的,就在前 面一章已经进行过描述。由于在实际应用中我们只要掌握了 其中的一种,其余的就可以触类旁通,这也是CAN能够迅速 推广的原因。
上一页 下一页 返回
第六节 SJA1000详细介绍
4.命令寄存器(CMR)
命令位初始化SJA1000传输层上的动作。命令寄存器对单 片机来说是只写存储器。如果去读这个地址,返回值是 “1111 1111”。两条命令之间至少有一个内部时钟周期, 内部时钟的频率是外部振荡频率的1/2.命令寄存器各位功能 如表7-5所示。
can总线的通信硬软件源码

can总线的通信硬软件源码CAN通讯的优点在此就不多说了,10公里,5Kb/s的速度是能保证的。
第一步:硬件环境的建立。
这里采用的是SJA1000作为总线控制器,CTM8251模块作为总线驱动器。
MCU采用的是MEGA16:利用I/O口模拟数据总线,当然也可以使用有总线的MCU:MCS-51,MEGA8515等。
原理图如下:第二步:SJA1000的控制首先阅读下SJA1000的手册,基本了解下SJA1000的结构,主要是寄存器方面的。
还要了解下CA N总线方面的东西:BasicCAN,Peli CAN,远程帧,数据帧等等……SJA1000工作之前需要配置一下,才能正常工作,没有经过配置的SJA1000回拉坏总线的:组成网络的时候,如果其中有的SJA1000没有正确配置,这个设备会干扰总线,使其它设备的数据发送不出去。
怎么才能控制SJA1000呢,请看下面的SJA1000读写的时序图:写的时序根据时序要求,可以利用I/O口模拟总线了://**************************读SJA1000*************************// uint Read_SJA1000(uint address){uchar data;asm("nop");ALE_off;WR_on;RD_on;CAN_cs_on;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址 //再次输出地址,确保一致。
asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;RD_off;asm("nop");//delay5us(2);asm("nop");DDRA=0x00; //数据口为输入PORTA=0xff; //上拉asm("nop");data=PINA; //获得数据asm("nop");//delay5us(1);RD_on;CAN_cs_on;asm("nop");//delay5us(2);//dog();return data;}//**************************写SJA10000*************************// void Write_SJA1000(uint address,uint data){ asm("nop");//uint temp1,temp2;DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址CAN_cs_on;ALE_off;WR_on;RD_on;asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //数据口为输出PORTA=address; //输出数据的地址再次输出地址,确保数据准确asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;WR_off;asm("nop");//delay5us(1);asm("nop");//DDRA=0xff;PORTA=data; //输出数据asm("nop");//delay5us(2);WR_on;PORTA=data; //再次输出数据,取保一致CAN_cs_on;asm("nop");//delay5us(2);asm("nop");//dog();}现在可以读写SJA1000了。
独立CAN控制器SJA

够存贮向CAN网络上发送的一个完整报文。缓冲器有13个字节长, 由CPU写入、BSP读出。 3.接收缓冲器(RXB,RXFIFO)
接收缓冲器是接受过滤器和CPU之间的一个接口,用来存贮从 CAN总线上被接收并接受的报文。接收缓冲器(RXB)作为总长为 64字节的接收FIFO(RXFIFO)的一个13字节窗口,可被CPU访问。 在此FIFO的帮助下,当其它报文被接收时,CPU可以处理一个报文。 4.接受过滤器(ACF)
22
SJA1000 8
接口管理逻辑
报文缓冲器
发送缓冲器
RXFIFO 接收 缓冲器
位 流 处理器
接 受 过滤器
内部总线
12 15
13
14 位定时
逻辑
19
20
21 18
错误管 理逻辑
VDD1 VSS1
VDD3 VSS3 TX0 TX1 RX0 RX1 VSS2 VDD2
9 XTAL1
10 XTAL2
振荡器
位定时逻辑监视串行CAN总线和处理与总线有关的 位定时。它被同步于一个报文起始的“隐性至显性”总线
跳 变时的CAN总线上的位流(硬同步),以及重同步于一个 报文接收期间的更多的跳变(软同步)。BTL还提供可编 程的时间段以补偿传播延时和相移(例如,由振荡器偏移 造成的),以及确定一个位时间内的采样点和将获取的采 样次数。 7.错误管理逻辑(EML)
EML负责传送层上的错误界定。它接收来自BSP的 错误报告,然后将错误统计量通知给BSP和IML。
2.复位值 检测到复位请求后会中止当前的一个报文接
收/发送并进入复位模式。一旦复位请求位“1-0” 跃
SJA1000 BasicCAN模式的通讯测试程序

while(1)
void CanSendKey(void); //发送键
void EnterNext(void); //按确认键后进入下一小项处理
//led 送显
#define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位选
extern uchar Read_Xdata(uint Xadr); //从外部地址xadr中读取数据
extern void Key_Scan(void); //键盘扫描程序
extern uchar Key_Get(void); //取键盘值
void UartRcv_Prg(void); //串口接收到数据处理
void DrecDisplay(uchar *databuf); //直通显示处理函数
void TestDispPrg(void); //测试处理函数
}
/*-------------------------------------------------------------------------------------------
main程序
-------------------------------------------------------------------------------------------*/
void EnterKey(void); //确认键
void IncKey(void); //增加键
void QuitKey(void); //退出键
CAN通信C语言程序 《免费下载》

//请求发送,TXREQ=1
while(PIR3bits.TXB0IF!=1){;}
//等待发送完成
while(CAN_FLAG==0){;}
//等待接收数据
CAN_FLAG=0;
//清接收到标志
TXB0CONbits.TXREQ=0;
//禁止发送
TXB0D0=RXB0D0+1;
//用接收数据加 1 来更新发送数据
//初始化 CAN 模块的 I/O 控制寄存器 //CIOCON=0X00;
//使 CAN 入自测试模式;=0x00,正常操作模式
while(CANSTAT&0XE0!=0){;}
//while(CANSTAT&0X40==0){;}
//初始化 CAN 的中断 PIR3=0X00; PIE3=0X01; IPR3=0X01;
CANCON=0X80;
//请求进入 CAN 配置模式 REQOP=100
while(CANSTAT&0X80==0){;}
//等待进入 CAN 配置模式 OPMODE=100
BRGCON1=0X01;
//设置 SJW 和 BRP,SJW=1TQ,BRP=01H
BRGCON2=0X90;
//设置 Phase_Seg1=3TQ 和 Prog _Seg=1TQ
TRISB=(TRISB|0X08)&0XFB;
//设置 CANRX/RB3 为输入,CANTX/RB2 为输出
//设置 CAN 的波特率为 125K,在 Fosc=4M 时,Tbit=8us,假设 BRP=01h
//则 TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。
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控制器及其应用)

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 的初始化,接收数据,发送数据./******************************************************函数原型: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

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位的标识符)。
CAN通信C语言程序 《免费下载》

TRISB=(TRISB|0X08)&0XFB;
//设置 CANRX/RB3 为输入,CANTX/RB2 为输出
//设置 CAN 的波特率为 125K,在 Fosc=4M 时,Tbit=8us,假设 BRP=01h
//则 TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。
//NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ
TXB0D1=RXB0D1+1;
TXB0D2=RXB0D2+1;
TXB0D3=RXB0D3+1;
TXB0D4=RXB0D4+1;
TXB0D5=RXB0D5+1;
TXB0D6=RXB0D6+1;
TXB0D7=RXB0D7+1;
} }
//仅仅接收标准标识符的有效信息,FILHIT0=0 表示 RXB0 采用 filter0 //设置接收缓冲器 0 的数据区长度 //初始化接收缓冲器 0 的数据区数据
//初始化接收滤波器 0 和接收屏蔽, RXF0SIDH=0XFF; RXF0SIDL=0XE0; RXM0SIDH=0X00; RXM0SIDL=0X00;
_asm goto can_isr
_endasm } #pragma code
void can_isr()
{
if(PIR3bits.RXB0IF==1) CAN_FLAG=1;
PIR3bits.RXB0IF=0;
//清接收中断标志
RXB0CONbits.RXFUL=0;
//打开接收缓冲器来接收新信息
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//-----------------------设置输出时钟类型--------------------------------------------------------
//该值需要用户根据实际需要重新配置
#define SJA_OCR 0xaa //输出控制寄存器的值
void SJAconnect_judge(void)
{
CANREG_write(0x09,0xAA); //写AA到测试寄存器(地址09)
if(CANREG_read(0x09)==0xAA)
{
connect_OK=1; //连接正常
}
else
{
connect_OK=0; //连接故障
}
}
//------------------------------------------------------------------------------------------------------
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)
#define Sቤተ መጻሕፍቲ ባይዱA_CDR 0x40 //时钟分频寄存器的值
//-----------------------设置SJA中断,1为开中断--------------------------------------------------------
#define SJA_OIE 1 //溢出中断
#define SJA_BTR1 0x2F
//-----------------------设置接收报文类型(标示符)--------------------------------------------------------
//该值需要用户根据实际需要重新配置
#define SJA_ACR 0x11//验收代码寄存器的值
{
while(time--);
}
//------------------------------------------------------------------------------------------------------
//函数类别SJA1000基本操作
//函数名称CANREG_write
//函数类别SJA1000基本操作
//函数名称SJAconnect_judge
//入口函数无
//出口函数无
//全局变量connect_OK
//操作寄存器测试寄存器(地址09)
//函数功能判断SJA1000与控制器连接是否正常
//------------------------------------------------------------------------------------------------------
和PCA82C200独立CAN控制器电气兼容
PCA82C200模式即默认的BasicCAN模式
扩展的接收缓冲器64字节先进先出FIFO
和CAN2.0B协议兼容PCA82C200兼容模式中的无源扩展帧
同时支持11位和29位识别码
位速率可达1Mbits/s
PeliCAN模式扩展功能
--可读/写访问的错误计数器
unsigned char xdata *SJA_base_Adr = base_Adr;
//-----------------------定义硬件故障标志位--------------------------------------------------------
bit bdata connect_OK=0; //connect_OK=1设备连接正常
//sbit SJA_RST = P1^2;
/*P3口的管脚定义*/
sbit SJA_RD = P3^7;
sbit SJA_WR = P3^6;
//-----------------------定义寻址的基址--------------------------------------------------------
unsigned char CANREG_read(unsigned char SJAREG_ADR)
{
unsigned char SJAREG_data;
SJAREG_data=*(SJA_base_Adr+SJAREG_ADR);
return(SJAREG_data);
}
//------------------------------------------------------------------------------------------------------
bit send_BUF_init(void)
{
//调用send_now()函数的时候,所发送的数据是在这里初始化的。请用户根据具体情况自己调整
bit setting_success=0;
send_BUF.IDH8 = 0x99;
send_BUF.IDL_R_DLC = 0xE8; //IDL_R_DLC。4即为RTR位,数据=0,远程=1;
//SJA_workmode=0工作在复位模式
//-----------------------定义SJA1000读写缓冲区的数据结构--------------------------------------------------------
struct BASICCAN_BUFStruct{
unsigned char IDH8;
#define SJA_EIE 1 //错误中断
#define SJA_TIE 1 //发送中断
#define SJA_RIE 1 //接收中断
//-----------------------定义地址指针,指向基址--------------------------------------------------------
#define ucharunsigned char //宏定义
#define uint unsigned int //宏定义
void MCU_init(void);
/*P2口的管脚定义*/
sbit LED1 = P2^6;
sbit LED2 = P2^5;
sbit SJA_CS = P2^7; //SJA1000片选管脚,低电平有效
send_BUF.Frame_Data[5] =0x66;
send_BUF.Frame_Data[6] = 0x77;
send_BUF.Frame_Data[7] = 0x88;
setting_success = 1;
return(setting_success);
}
//------------------------------------------------------------------------------------------------------
unsigned char IDL_R_DLC;
unsigned char Frame_Data[8];
}receive_BUF,send_BUF;
//------------------------------------------------------------------------------------------------------
//函数类别SJA1000基本操作
//函数名称CANREG_read
//入口函数SJAREG_ADR
//出口函数SJAREG_data
//函数功能读SJA1000的寄存器
//------------------------------------------------------------------------------------------------------
#define base_Adr 0x7F00
//-----------------------定义总线定时寄存器的值--------------------------------------------------------
#define SJA_BTR0 0x07//该值需要用户根据需要的波特率进行计算,推荐使用周立功发布的波特率计算器
//入口函数SJAREG_ADR,setting
//出口函数无
//函数功能写SJA1000的寄存器
//------------------------------------------------------------------------------------------------------
//connect_OK=0设备连接故障
//-----------------------定义硬件故障标志位--------------------------------------------------------
bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式