CAN总线控制器SJA1000源程序(c语言)_第1页
CAN总线控制器SJA1000源程序(c语言)_第2页
CAN总线控制器SJA1000源程序(c语言)_第3页
CAN总线控制器SJA1000源程序(c语言)_第4页
CAN总线控制器SJA1000源程序(c语言)_第5页
已阅读5页,还剩5页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CAN总线控制器sjalOOO源程序 SJA1000是一种独立控制器用于移动目标和一般匸业环境中的区域网络控制CAN它是PHILIPS 半导体PCA82C200CAN控制器BasicCAN的粋代产品而M它增加了一种新的工作模式PeliCAN . 这种模式支持具冇很多新特性的CAN 2.0B协议. 1特性 二二和PCA82C200独立CAN控制器引脚兼容 二二和PCA82C200独立CAN控制器电气兼容 二二PCA82C200模式即默认的BasicCAN模式 二二扩展的接收缓冲器64字节先进先出FIFO 二二和CAN2.0B协议兼容PCA82C200嫌容模式中的无源扩展帧 二二同时支持笛位和29

2、位识别码 二二位速率可达1 Mbits/s zz PeliCAN槓式扩展功能 可读/写访问的错误计数器 “可编程的借误报警限制 -最近一次错误代码寄存器 对毎一个CAN总线皓误的中断 具体控制位控制的仲裁丢失中断 单次发送无重发 只听模式无确认无活动的出错标 志 支持热插拔软件位速率椅测 验收滤波器扩展4字节代码4字节屏蔽 身信息接收门接收请求 二二24MHz时钟频率 :z对不同微处理器的接口 二二可编程的CAN输出驱动器配建 二二增强的温度适应40125 include include include / 7| #defiiie ucliar unsigned chai 宏 定 义 #def

3、iiie umt unsigned mt 宏定义 void MCU_init(void); /*P2 I I的管脚定义引 sbitLED1 = P2A6; sbitLED2 =P2A5; sbitSJA.CS = P2A7; /SJA1000片选管脚,低迫平有效 /sbit SJA_RST = P1A2; /*P3【I的管脚定义*/ sbit SJA_RD - P3A7; sbit SJA_WR=P3人6; #defiiie base.Adr 0 x7F00 /定义总线定时寄存器的值 define SJA.BTR0 0 x07该值需要用户根据需要的波特率进行计算,推 荐使用周立功发布的波特率计

4、算器 #defiiie SJA_BTR1 0 x2F /设豐接收报文类型(标示符) 该值需要用户根据实际需要觅新配豊 #define SJA.ACR 0 x11验收代码寄存器的值 define SJA AMR OxFF验收屏蔽寄存器的值 /设冒输出时钟类型 该值需要用户根据实际需要重新配置 define SJA.OCR Oxaa输出控制寄存器的值 #defhie SJA_CDR 0 x40时钟分频寄存器的值 /设置SJA中断,1为开中断一 define SJA_OIE 1 #defiiie SJA_EIE 1 define SJA_TIE 1 #defiiie SJA_RIE 1 /定乂地址指

5、针,指向基址 unsigned char xdata *SJA_base_Adr = base.Adr; /定义预件兹障标志位 溢出中断 错误中断 发送中断 接收中断 /coimect_OK=l设备连接正常 /comiect_OK=0设备连接故障 /定义硬件故障标志位一 bit bdata SJA_woikniode= 1; /SJA_woikniode= 1SJA匸作在工作模式 /SJA_workinode=0匸作在复位模式 bit bdata comiect_OK=0; 3 / 9 /定义SJA1000读写缓冲区的数据结构 struct BASICCAN_BUFStmct unsigned

6、 cliai EDH8; unsigned char IDL_R_DLC; unsigned cliai Fiaine_Data8; receive_BUF,send_BUF; /函数类别供调用子函数 / 两数名称 send_BUF_init /入口函数无 /出口函数无 /函数功能对MCU内公共变量结构send.BUF赋初值 bit send_BUF_uut(void) 调用send_nowO函数的时候,所发送的数据是在这里初始化的。请用户根据貝体情况自己调整 bit settmg_success=O; IDL_R_DLC。4 即为 RTR 位,数据=0,远程=1: send_BUF.IDH8

7、 = 0 x99; send BUF.IDL R DLC = 0 xE8; send_BUF.Frame_DataO 0 x11; send_BUF.Frame_Data 1 = 0 x22; send_BUF.Frame_Data2 = 0 x33; send_BUF.Frame_Data3 = 0 x44; send_BUF.Frame_Data4 = 0 x55; send_BUF.Frame_Data5 = 0 x66; send_BUF.Frame_Data6 = 0 x77; send_BUF. Frame_Data 7 = 0 x88; setting_success = 1;

8、return(settmg_success); / /两数类别延时 /函数名称delay /入【I函数无 /出丨I函数无 /函数功能延时 /. void delay(unsigned char tune) wlnle(tHne-); /函数类别SJA1000基本操作 /函数名称 /入【I函数 /出门前数 /函数功能 CANREG_wnte SJAREG_ADR. settmg 无 写SJA1000的寄疗器 void CANREG_write(unsigned chai SJAREG_ADR. unsigned char settmg) *(SJA_base_Adr+SJAREG_ADR)=se

9、tting; / /函数类别SJA1000基本操作 / 函数名称 CANREG.read / 入 I I 函数 SJAREG_ADR /出丨丨函数SJAREGdata /函数功能 SJA1000的寄存器 / unsigned char CANREG_read(unsigned chai SJAREG_ADR) unsigned chai SJAREG_data; SJAREG_dara=*(SJA_base_Adr+SJAREG_ADR); return(SJAREG_data); void SJAcomirct_judge(void) CANREG_write(0 x09.0 xAA); i

10、f(CANREG_read(0 x09 )=0 xAA) coiinecLOK-1; else coimect_OK=0; 写AA到测试寄存器(地址09) 连接正常 连接故障 函数类别 SJA1000基本操作 因数名称 SJAcoiinect_judge 入II函数 无 出1函数 无 全局变量 connect_OK 操作寄存器 测试寄希器(地址09) 函数功能 判断SJA1000与控制器连接是否正帘 函数类别 SJA1000基本操作 函数名称 settmg_SJA resetmode 入II函数 无 出口函数 无 全局变最 SJA_workinode 操作寄存器 控祁奇存器(地址00) 甫数功

11、能 设置SJAT作在复位模式 void setting_SJA_ieseunode(void) unsigned cliai CONTROL_REGdata; CONTROL_REGdata=CANREG_read(OxOO); CONTROL_REGdata=CONTROL_REGdata|OxO 1; CANREG_wiitc(OxOO,CONTROL_REGdata); if(CANREG.iead(0 x00) 置复位模式成功 else SJA_workinode=l; 置复位模式失败 /. / / / / / / / 函数类别 函数名称 入LI函数 出【I函数 全局变量 SJA100

12、0基本操作 setting_SJA_workHigmode 无 无 SJA workinode 操作寄存器控制寄存器(地址00) 函数功能 设置SJA工作在正常工作模式 void settmg_SJA_woikingmode(void) unsigned chai CONTROL_REGdata; CONTROL.REGdata=CANREG_read(OxOO); CONTROL REGdata=CONTROL REGdata if(CANREG_iead(OxOO ) else 置工作模式成功 S JA_vorkn】ode=0; / / / / / / / 置工作模式失败 函数类别 函数名

13、称 入门函数 出【I函数 操作寄存器 函数功能 特殊要求 SJA1000基本操作 settmg_SJA_rate SJA.BTRO, SJA_BTR1 setting_success 总线定时寄存器BTR1 (地址07)利BTR0 (地址06) 设置SJA波特率 只能在复位工作模式卜设置 / bit setting_SJA_iate(void) bit settmg_success; wlule(SJA_workniode) 设置SJA工作在复位模式 settuig_SJA_resetmodeO; CANREG_write(0 x06,SJA_BTR0); CANREG_wiitc(0 x07

14、,SJA_BTRl); if(CANREG.read(0 x06)=SJA_BTR0) 波特率设豐成功 else settmg_success=O; 波特率设置夫败 renirn(settmg_success); 7 / 9 /函数类别 SJA1000基本操作 / 函数名称setting_SJA_dataselect 入I 丨函数SJA_ACR SJA_AMR / 出 FI 函数 setting_success /操作寄存器验收代码寄存器ACR (地址04)和验收屏蔽寄存器AMR (地址05) /函数功能设置SJA接收数据类型 /特殊要求只能在复位工作模式卜设豐 / W bit settmg_

15、SJA_dataselect(void) bit settinjsuccess; wlule(SJA_workmode) settmg_SJA_resetmodeQ; 设置SJA工作在复位模式 CANREG_wnte(0 x04,SJA_ACR); CANREG_Wfite(0 x05,SJA_AMR); if(CANREG_read(0 x04)=SJA_ACR) 滤波器设養失败 settnig_success=O; return(settmg_success); j i /函数类别SJA1000基本操作 / 两数名称 setting_SJA_CLK 入I 丨函数 SJA_OCR, SJA_

16、CDR / 出丨 I 前数 settingsuccess /操作寄存器输出控制寄存器OCR (地址08)和时钟分频寄存器CDR (地址31) /函数功能设置SJA输出始终类型 /特殊要求只能在复位工作模式卜设豐 bit setting_SJA_CLK(void) bit settmg_success; wlule(SJA_workniode) settmg_SJA_resetmodeQ; 设置SJA工作在复位模式 滤波器设辻成功 滤波器设置失败 CANREG_wnte(0 x08,SJA_OCR); CANREG_write(Ox 1 f、S JA_CDR); 改(CANREGead(0 x0

17、8)=SJA_OCR) else setting_sxiccess=O; /函数类别 SJA1000基本操作 函数幺称 settmg_SJA_intennpt 入门前数 SJA_OIESJA_EIE$JA_TIE SJA_RIE / 出丨丨函数 setting_success /操作寄存器控制寄存器(00) /函数功能 设置SJA中断类型和中断状态 /特殊要求只能在复位工作模式下设置 J f bit setting_SJA_intenupt(void) bit settmg_success; unsigned char CONT_buftemp=0; wlule(SJA_workinode)

18、settmg_SJA_resetmodeQ;设胃.SJA匸作在复位模式 CONT_bufH2ANREG_read(OxOO); temp=S JA_OIE * 16+S JA_EIE *8+S JA_TIE *4+SJA_RIE*2; C ONT_buf-(tenip CANREG.write(OxOO,CONT_buf); if(CANREG_read(OxOO)CONT_buf0 x20) 辑1 settine_success=l; else serting_success=O; retum(setting_success); /CR.5是保留位,无论如何设叠.读此位的值总是逻 滤波器设豐

19、成功 滤波器设置失败 bit writers JAscndBUF(void) MBO*MB 函数类别 SJA1000基本操作 函数X称 write_SJAsendBUF 入II函数 无 出口函数 settuig_success 操作寄存器 发送缓存器(10-19)状态寄存器02 函数功能 写发送缓存器 特殊要求 只能在工作模式下写 bit settmg_success=O; unsigned char 1; wlule(SJA_workniode0) settmg_SJA_worknigmode();设置 SJA 在工作模式 if(C ANREG_read(0 x02) CANREG_wnte

20、(OxOb.send_BUF.IDL_R_DLC); fbr(i-0;i83+) CANREG_wnte(OxOc+i,send_BUF.Frame_Datai); setting_success= 1;发送寄存器写成功 return(settm_success); / /函数类别 SJA1000基本操作 / 函数名称 read.SJAsendBUF /入口函数无 / 出I 函数 setting_success /操作寄存器接收缓存器(20-29)状态寄存器02 /函数功能写发送缓存器 /特殊要求只能在工作模式卜写 / bit read_SJAieceiveBUF(void) bit sett

21、mg_success=O; unsigned chai 1; wlule(SJA_workniode=0) setting_SJA_workuigmode();设豐 SJA 在工作模式 if(CANREG_read(0 x02) receive_BUF.IDL_R_DLC=(CANREG_iead(Ox 15); foi(i=0;i8;i+) receive-BUF.Frame-Datai=CANREG_iead(0 xl6+i); setting_succcss-l;接收寄存器读成功 renirn(setting_success); / /函数类别 /函数名称 /入【I函数 /出II曲数 供

22、调用子程序 SJAlOOO.uut 无 无 /操作寄存器 1)控制寄存器(地址00) / / / / / 2) 3) 4) 5) 6) 收代码寄存器ACR (地址04) 验收屏蔽寄存器AMR (地址05) 总线定时寄存器BTR0 (地址06) 总线定时寄存器BTR1 (地址07) 输出控制寄存器OCR (地址08) /7)测试寄存器(地址09) /8)时钟分频寄存器CDR (地址31) /9)中断使能寄存器 /两数功能SJA1000初始化设置 /特殊要求在复位模式进行,初始化结束进入工作状态 void SJA1000_uut(void) wliile(coimect_OK=0) SJAcomi

23、ectjudge(); wlule(SJA_workniode) settmg_SJA_rcsetmodeQ; 检测设备连接 /S SJA1000为复位模式 # / 9 wlule(settmg_SJA_rate()=O ); 设置总线波特率 wlule(setting_SJA_dataselectO0); 设置 SJA 接收数据的格式(标示位) wliile(settmgSJA_CLK()=O); 设置 SJA 输出时钟的形式 vlule(setting_SJz_mtemjpt()0); 设置 SJA 的中断 使能 wlule(? SJA.workinode) 、 settmg_SJA_workuigmode();进入工作模式 /函数类别 /函数名称 /入I函数 /出丨I函数 /操作寄存器 中断处理函数 send_interrupt 无 无 /函数功能接收中断处理函数 ft void send_now(void) unsigned chai state; / unsigned chai CNIR_REGdata; do state = CANREG_read(0 x02); /SR 为 SJA1000 的状态寄存器 while( state /查询 SJA1000 是否处于接收状态,发送完毕状态, 或者发送缓存器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论