ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:21.61KB ,
资源ID:28412919      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28412919.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CAN总线控制器SJA1000源程序c语言解读.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

CAN总线控制器SJA1000源程序c语言解读.docx

1、CAN总线控制器SJA1000源程序c语言解读CAN总线控制器sja1000源程序SJA1000 是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN 它是PHILIPS半导体PCA82C200 CAN 控制器BasicCAN 的替代产品而且它增加了一种新的工作模式PeliCAN ,这种模式支持具有很多新特性的CAN 2.0B 协议。1 特性􀁹􀀃 和PCA82C200 独立CAN 控制器引脚兼容􀁹􀀃 和PCA82C200 独立CAN 控制器电气兼容􀁹􀀃 PCA82C200 模

2、式即默认的BasicCAN 模式􀁹􀀃 扩展的接收缓冲器64 字节先进先出FIFO􀁹􀀃 和CAN2.0B 协议兼容PCA82C200 兼容模式中的无源扩展帧􀁹􀀃 同时支持11 位和29 位识别码􀁹􀀃 位速率可达1Mbits/s􀁹􀀃 PeliCAN 模式扩展功能-可读/写访问的错误计数器-可编程的错误报警限制-最近一次错误代码寄存器-对每一个CAN 总线错误的中断-具体控制位控制的仲裁丢失中断-单次发送无重发-只听模式无

3、确认无活动的出错标志-支持热插拔软件位速率检测-验收滤波器扩展4 字节代码4 字节屏蔽-自身信息接收自接收请求􀁹􀀃 24MHz 时钟频率􀁹􀀃 对不同微处理器的接口􀁹􀀃 可编程的CAN 输出驱动器配置􀁹􀀃 增强的温度适应-40-+125#include #include #include /-沿袭引脚和变量-#define uchar unsigned char /宏定义#define uint unsigned int /宏定义void MCU_ini

4、t(void);/*P2口的管脚定义*/sbit LED1 = P26;sbit LED2 = P25;sbit SJA_CS = P27; /SJA1000片选管脚,低电平有效/sbit SJA_RST = P12;/*P3口的管脚定义*/sbit SJA_RD = P37;sbit SJA_WR = P36;/-定义寻址的基址-#define base_Adr 0x7F00 /-定义总线定时寄存器的值-#define SJA_BTR0 0x07 /该值需要用户根据需要的波特率进行计算,推荐使用周立功发布的波特率计算器#define SJA_BTR1 0x2F/-设置接收报文类型(标示符)-

5、 /该值需要用户根据实际需要重新配置#define SJA_ACR 0x11 /验收代码寄存器的值#define SJA_AMR 0xFF /验收屏蔽寄存器的值/-设置输出时钟类型- /该值需要用户根据实际需要重新配置#define SJA_OCR 0xaa /输出控制寄存器的值#define SJA_CDR 0x40 /时钟分频寄存器的值/-设置SJA中断,1为开中断-#define SJA_OIE 1 /溢出中断#define SJA_EIE 1 /错误中断#define SJA_TIE 1 /发送中断#define SJA_RIE 1 /接收中断/-定义地址指针,指向基址-unsigne

6、d char xdata *SJA_base_Adr = base_Adr;/-定义硬件故障标志位-bit bdata connect_OK=0; /connect_OK=1设备连接正常 /connect_OK=0设备连接故障/-定义硬件故障标志位-bit bdata SJA_workmode=1; /SJA_workmode=1SJA工作在工作模式 /SJA_workmode=0工作在复位模式/-定义SJA1000读写缓冲区的数据结构-struct BASICCAN_BUFStruct unsigned char IDH8; unsigned char IDL_R_DLC; unsigned

7、 char Frame_Data8; receive_BUF,send_BUF;/-/ 函数类别 供调用子函数/ 函数名称 send_BUF_init/ 入口函数 无/ 出口函数 无/ 函数功能 对MCU内公共变量结构send_BUF赋初值/-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; send

8、_BUF.Frame_Data0 = 0x11; send_BUF.Frame_Data1 = 0x22; send_BUF.Frame_Data2 = 0x33; send_BUF.Frame_Data3 = 0x44; send_BUF.Frame_Data4 = 0x55; send_BUF.Frame_Data5 = 0x66; send_BUF.Frame_Data6 = 0x77; send_BUF.Frame_Data7 = 0x88; setting_success = 1; return(setting_success);/-/ 函数类别 延时/ 函数名称 delay/ 入口

9、函数 无/ 出口函数 无/ 函数功能 延时/-void delay(unsigned char time) while(time-);/-/ 函数类别 SJA1000基本操作/ 函数名称 CANREG_write/ 入口函数 SJAREG_ADR,setting/ 出口函数 无/ 函数功能 写SJA1000的寄存器/-void CANREG_write(unsigned char SJAREG_ADR, unsigned char setting) *(SJA_base_Adr+SJAREG_ADR)=setting;/-/ 函数类别 SJA1000基本操作/ 函数名称 CANREG_read

10、/ 入口函数 SJAREG_ADR/ 出口函数 SJAREG_data/ 函数功能 读SJA1000的寄存器/-unsigned char CANREG_read(unsigned char SJAREG_ADR) unsigned char SJAREG_data; SJAREG_data=*(SJA_base_Adr+SJAREG_ADR); return(SJAREG_data);/-/ 函数类别 SJA1000基本操作/ 函数名称 SJAconnect_judge/ 入口函数 无/ 出口函数 无/ 全局变量 connect_OK/ 操作寄存器 测试寄存器(地址09)/ 函数功能 判断S

11、JA1000与控制器连接是否正常/-void SJAconnect_judge(void) CANREG_write(0x09,0xAA); /写AA到测试寄存器(地址09) if(CANREG_read(0x09)=0xAA) connect_OK=1; /连接正常 else connect_OK=0; /连接故障 /-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_resetmode/ 入口函数 无/ 出口函数 无/ 全局变量 SJA_workmode/ 操作寄存器 控制寄存器(地址00)/ 函数功能 设置SJA工作在复位模式/-void setting_SJA_

12、resetmode(void) unsigned char CONTROL_REGdata; CONTROL_REGdata=CANREG_read(0x00); CONTROL_REGdata=CONTROL_REGdata|0x01; CANREG_write(0x00,CONTROL_REGdata); if(CANREG_read(0x00)&0x01)=1) SJA_workmode=0; /置复位模式成功 else SJA_workmode=1; /置复位模式失败 /-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_workingmode/ 入口函数 无/

13、 出口函数 无/ 全局变量 SJA_workmode/ 操作寄存器 控制寄存器(地址00)/ 函数功能 设置SJA工作在正常工作模式/-void setting_SJA_workingmode(void) unsigned char CONTROL_REGdata; CONTROL_REGdata=CANREG_read(0x00); CONTROL_REGdata=CONTROL_REGdata&0xFE; CANREG_write(0x00,CONTROL_REGdata); if(CANREG_read(0x00)&0x01)=0) SJA_workmode=1; /置工作模式成功 el

14、se SJA_workmode=0; /置工作模式失败 /-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_rate/ 入口函数 SJA_BTR0,SJA_BTR1/ 出口函数 setting_success/ 操作寄存器 总线定时寄存器BTR1(地址07)和BTR0(地址06)/ 函数功能 设置SJA波特率/ 特殊要求 只能在复位工作模式下设置/-bit setting_SJA_rate(void) bit setting_success; while(SJA_workmode) setting_SJA_resetmode(); /设置SJA工作在复位模式 CANR

15、EG_write(0x06,SJA_BTR0); CANREG_write(0x07,SJA_BTR1); if(CANREG_read(0x06)=SJA_BTR0)&(CANREG_read(0x07)=SJA_BTR1) setting_success=1; /波特率设置成功 else setting_success=0; /波特率设置失败 return(setting_success);/-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_dataselect/ 入口函数 SJA_ACR,SJA_AMR/ 出口函数 setting_success/ 操作寄存器

16、验收代码寄存器ACR(地址04)和验收屏蔽寄存器AMR(地址05)/ 函数功能 设置SJA接收数据类型/ 特殊要求 只能在复位工作模式下设置/-bit setting_SJA_dataselect(void) bit setting_success; while(SJA_workmode) setting_SJA_resetmode(); /设置SJA工作在复位模式 CANREG_write(0x04,SJA_ACR); CANREG_write(0x05,SJA_AMR); if(CANREG_read(0x04)=SJA_ACR)&(CANREG_read(0x05)=SJA_AMR) s

17、etting_success=1; /滤波器设置成功 else setting_success=0; /滤波器设置失败 return(setting_success);/-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_CLK/ 入口函数 SJA_OCR,SJA_CDR/ 出口函数 setting_success/ 操作寄存器 输出控制寄存器OCR(地址08)和时钟分频寄存器CDR(地址31)/ 函数功能 设置SJA输出始终类型/ 特殊要求 只能在复位工作模式下设置/-bit setting_SJA_CLK(void) bit setting_success; whi

18、le(SJA_workmode) setting_SJA_resetmode(); /设置SJA工作在复位模式 CANREG_write(0x08,SJA_OCR); CANREG_write(0x1f,SJA_CDR); if(CANREG_read(0x08)=SJA_OCR)&(CANREG_read(0x1f)=SJA_CDR) setting_success=1; /滤波器设置成功 else setting_success=0; /滤波器设置失败 return(setting_success);/-/ 函数类别 SJA1000基本操作/ 函数名称 setting_SJA_interr

19、upt/ 入口函数 SJA_OIE,SJA_EIE,SJA_TIE,SJA_RIE/ 出口函数 setting_success/ 操作寄存器 控制寄存器(00)/ 函数功能 设置SJA中断类型和中断状态/ 特殊要求 只能在复位工作模式下设置/-bit setting_SJA_interrupt(void) bit setting_success; unsigned char CONT_buf,temp=0; while(SJA_workmode) setting_SJA_resetmode(); /设置SJA工作在复位模式 CONT_buf=CANREG_read(0x00); temp=SJ

20、A_OIE*16+SJA_EIE*8+SJA_TIE*4+SJA_RIE*2; CONT_buf=(temp&0x1E)|(CONT_buf&0x01); CANREG_write(0x00,CONT_buf); if(CANREG_read(0x00)=CONT_buf|0x20) /CR.5是保留位,无论如何设置,读此位的值总是逻辑1 setting_success=1; /滤波器设置成功 else setting_success=0; /滤波器设置失败 return(setting_success);/-/ 函数类别 SJA1000基本操作/ 函数名称 write_SJAsendBUF/ 入口函数 无/ 出口函数 setting_success/ 操作寄存器 发送缓存器(10-19)状态寄存器02/ 函数功能 写发送缓存器/ 特殊要求 只能在工作模式下写/-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1