




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CAN 总线控制器 sja1000 源程序 SJA1000 是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN 它是PHILIPS 半导体PCA82C200 CAN 控制器BasicCAN 的替代产品而且它增加了一种新的工作模式PeliCAN 这种模式支持具有很多新特性的 CAN 2 0B 协议 1 特性 和PCA82C200 独立CAN 控制器引脚兼容 和PCA82C200 独立CAN 控制器电气兼容 PCA82C200 模式即默认的BasicCAN 模式 扩展的接收缓冲器64 字节先进先出FIFO 和CAN2 0B 协议兼容PCA82C200 兼容模式中的无源扩展帧 同时支持11 位和29 位识别码 位速率可达1Mbits s PeliCAN 模式扩展功能 可读 写访问的错误计数器 可编程的错误报警限制 最近一次错误代码寄存器 对每一个CAN 总线错误的中断 具体控制位控制的仲裁丢失中断 单次发送无重发 只听模式无确认无活动的出错标 志 支持热插拔软件位速率检测 验收滤波器扩展4 字节代码4 字节屏蔽 自身信息接收自接收请求 24MHz 时钟频率 对不同微处理器的接口 可编程的CAN 输出驱动器配置 增强的温度适应 40 125 include include include 沿袭引脚和变量 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 片选管脚 低电平有效 sbit SJA RST P1 2 P3 口的管脚定义 sbit SJA RD P3 7 sbit SJA WR P3 6 定义寻址的基址 define base Adr 0 x7F00 定义总线定时寄存器的值 define SJA BTR0 0 x07 该值需要用户根据需要的波 特率进行计算 推荐使用周立功发布的波特率计算器 define SJA BTR1 0 x2F 设置接收报文类型 标示符 该值需要用户根据实际需 要重新配置 define SJA ACR 0 x11 验收代码寄存器的值 define SJA AMR 0 xFF 验收屏蔽寄存器的值 设置输出时钟类型 该值需要用户根据实际需 要重新配置 define SJA OCR 0 xaa 输出控制寄存器的值 define SJA CDR 0 x40 时钟分频寄存器的值 设置 SJA 中断 1 为开中断 define SJA OIE 1 溢出中断 define SJA EIE 1 错误中断 define SJA TIE 1 发送中断 define SJA RIE 1 接收中断 定义地址指针 指向基址 unsigned 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 char Frame Data 8 receive BUF send BUF 函数类别 供调用子函数 函数名称 send BUF init 入口函数 无 出口函数 无 函数功能 对 MCU 内公共变量结构 send BUF 赋初值 bit send BUF init void 调用 send now 函数的时候 所发送的数据是在这里初始化的 请用户根据具体情况自 己调整 bit setting success 0 send BUF IDH8 0 x99 send BUF IDL R DLC 0 xE8 IDL R DLC 4 即为 RTR 位 数据 0 远程 1 send BUF Frame Data 0 0 x11 send BUF Frame Data 1 0 x22 send BUF Frame Data 2 0 x33 send BUF Frame Data 3 0 x44 send BUF Frame Data 4 0 x55 send BUF Frame Data 5 0 x66 send BUF Frame Data 6 0 x77 send BUF Frame Data 7 0 x88 setting success 1 return setting success 函数类别 延时 函数名称 delay 入口函数 无 出口函数 无 函数功能 延时 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 入口函数 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 函数功能 判断 SJA1000 与控制器连接是否正常 void SJAconnect judge void CANREG write 0 x09 0 xAA 写 AA 到测试寄存器 地址 09 if CANREG read 0 x09 0 xAA connect OK 1 连接正常 else connect OK 0 连接故障 函数类别 SJA1000 基本操作 函数名称 setting SJA resetmode 入口函数 无 出口函数 无 全局变量 SJA workmode 操作寄存器 控制寄存器 地址 00 函数功能 设置 SJA 工作在复位模式 void setting SJA resetmode void unsigned char CONTROL REGdata CONTROL REGdata CANREG read 0 x00 CONTROL REGdata CONTROL REGdata 0 x01 CANREG write 0 x00 CONTROL REGdata if CANREG read 0 x00 置复位模式成功 else SJA workmode 1 置复位模式失败 函数类别 SJA1000 基本操作 函数名称 setting SJA workingmode 入口函数 无 出口函数 无 全局变量 SJA workmode 操作寄存器 控制寄存器 地址 00 函数功能 设置 SJA 工作在正常工作模式 void setting SJA workingmode void unsigned char CONTROL REGdata CONTROL REGdata CANREG read 0 x00 CONTROL REGdata CONTROL REGdata CANREG write 0 x00 CONTROL REGdata if CANREG read 0 x00 置工作模式成功 else 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 工作在复位模式 CANREG write 0 x06 SJA BTR0 CANREG write 0 x07 SJA BTR1 if CANREG read 0 x06 SJA BTR0 波特率设置成功 else setting success 0 波特率设置失败 return setting success 函数类别 SJA1000 基本操作 函数名称 setting SJA dataselect 入口函数 SJA ACR SJA AMR 出口函数 setting success 操作寄存器 验收代码寄存器 ACR 地址 04 和验收屏蔽寄存器 AMR 地址 05 函数功能 设置 SJA 接收数据类型 特殊要求 只能在复位工作模式下设置 bit setting SJA dataselect void bit setting success while SJA workmode setting SJA resetmode 设置 SJA 工作在复位模式 CANREG write 0 x04 SJA ACR CANREG write 0 x05 SJA AMR if CANREG read 0 x04 SJA ACR 滤波器设置成功 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 while SJA workmode setting SJA resetmode 设置 SJA 工作在复位模式 CANREG write 0 x08 SJA OCR CANREG write 0 x1f SJA CDR if CANREG read 0 x08 SJA OCR 滤波器设置成功 else setting success 0 滤波器设置失败 return setting success 函数类别 SJA1000 基本操作 函数名称 setting SJA interrupt 入口函数 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 0 x00 temp SJA OIE 16 SJA EIE 8 SJA TIE 4 SJA RIE 2 CONT buf temp CANREG write 0 x00 CONT buf if CANREG read 0 x00 CONT buf 0 x20 CR 5 是保留位 无论如何设置 读此位的值总是逻辑 1 setting success 1 滤波器设置成功 else setting success 0 滤波器设置失败 return setting success 函数类别 SJA1000 基本操作 函数名称 write SJAsendBUF 入口函数 无 出口函数 setting success 操作寄存器 发送缓存器 10 19 状态寄存器 02 函数功能 写发送缓存器 特殊要求 只能在工作模式下写 bit write SJAsendBUF void bit setting success 0 unsigned char i while SJA workmode 0 setting SJA workingmode 设置 SJA 在工作模式 if CANREG read 0 x02 CANREG write 0 x0b send BUF IDL R DLC for i 0 i 8 i CANREG write 0 x0c i send BUF Frame Data i setting success 1 发送寄存器写成功 return setting success 函数类别 SJA1000 基本操作 函数名称 read SJAsendBUF 入口函数 无 出口函数 setting success 操作寄存器 接收缓存器 20 29 状态寄存器 02 函数功能 写发送缓存器 特殊要求 只能在工作模式下写 bit read SJAreceiveBUF void bit setting success 0 unsigned char i while SJA workmode 0 setting SJA workingmode 设置 SJA 在工作模式 if CANREG read 0 x02 receive BUF IDL R DLC CANREG read 0 x15 for i 0 i 8 i receive BUF Frame Data i CANREG read 0 x16 i setting success 1 接收寄存器读成功 return setting success 函数类别 供调用子程序 函数名称 SJA1000 init 入口函数 无 出口函数 无 操作寄存器 1 控制寄存器 地址 00 2 收代码寄存器 ACR 地址 04 3 验收屏蔽寄存器 AMR 地址 05 4 总线定时寄存器 BTR0 地址 06 5 总线定时寄存器 BTR1 地址 07 6 输出控制寄存器 OCR 地址 08 7 测试寄存器 地址 09 8 时钟分频寄存器 CDR 地址 31 9 中断使能寄存器 函数功能 SJA1000 初始化设置 特殊要求 在复位模式进行 初始化结束进入工作状态 void SJA1000 init void while connect OK 0 SJAconnect judge 检测设备连接 while SJA workmode setting SJA resetmode 置 SJA1000 为复位模式 while setting SJA rate 0 设置总线波特率 while setting SJA dataselect 0 设置 SJA 接收数据的格式 标示位 while setting SJA CLK 0 设置 SJA 输出时钟的形式 while setting SJA interrupt 0 设置 SJA 的中断使能 while SJA workmode setting SJA workingmode 进入工作模式 函数类别 中断处理函数 函数名称 send interrupt 入口函数 无 出口函数 无 操作寄存器 函数功能 接收中断处理函数 void send now void unsigned char state unsigned char CMR REGdata do state CANREG read 0 x02 SR 为 SJA1000 的状态寄存器 while state 查询 SJA1000 是否处于接收状 态 发送完毕状态 或者发送缓存器被锁 while write SJAsendBUF 0 写入缓存器 CMR REGdata CANREG read 0 x01 CMR 是只写寄存器 不可读 读出值总是 1111 1111 CMR REGdata CMR REGdata 0 x01 CANREG write 0 x01 0 x01 简单置位发送位即可 函数类别 发送中断处理函数 函数名称 receive interrupt 入口函数 出口函数 操作寄存器 函数功能 发送中断处理函数 void receive now void while read SJAreceiveBUF 0 CANREG write 0 x01 0 x04 向 CMR 写入 0 x04 释放接收缓冲区 函数类别 中断函数 函数名称 SJA INTR 入口函数 无 出口函数 无 操作寄存器 中断寄存器 地址 03 函数功能 中断分析 判断是什么中断 调用相应的中断处理函数 void SJA INTR void interrupt 0 CanBus 接口芯片产生中断 INTR0 这里仅简单区分了接收中断和发送中断 对于其余中断 均简单重启 SJA1000 另外 IR 的高三位保留位读出值总是 1 unsigned char sta EA 0 关闭总中断 EX0 0 关闭外部中断 sta CANREG read 0 x03 读中断寄存器 IR if sta 0 xe2 发送中断处理 LED1 0 如果有信息发出 则指示灯亮 else if sta 0 xe1 接收中断 接收数据 LED2 0 如果接收到中断 则 LED2 指示灯亮 receive now else MCU init EX0 1 EA 1 void MCU init void SJA CS 0 EX0 1 IT0 0 EA 1 void main 主程序 MCU init SJA1000 init while send BUF init 0 send now 待发送信息之后 进入死循环 接下来就是等待中断了 while 1 代码如下 定义地址指针 指向基址 unsigned char xdata SJA base Adr SJA BaseAdr 定义 SJA1000 读写缓冲区的数据结构 struct BASICCAN BUFStruct unsigned char IDH8 unsigned char IDL R DLC unsigned char Frame Data 2 receive BUF send BUF 函数功能 写 SJA1000 的寄存器 入口参数 地址 SJAREG ADR 数据 setting 出口参数 无 void Write SJA1000 unsigned char SJAREG ADR unsigned char setting SJA base Adr SJAREG ADR setting 函数功能 读 SJA1000 的寄存器 入口参数 地址 SJAREG ADR 数据 setting 出口参数 无 unsigned char Read SJA1000 unsigned char SJAREG ADR unsigned char SJAREG data SJAREG data SJA base Adr SJAREG ADR return SJAREG data 函数功能 测试 SJA1000 是否正常连接 入口参数 无 出口参数 connect OK bit Judge SJA1000 connect void bit connect OK 0 Write SJA1000 REG TEST 0 xAA 写 AA 到测试寄存器 地址 09 if Read SJA1000 0 x09 0 xAA connect OK 1 连接正常 else connect OK 0 连接故障 return connect OK 函数功能 设置 SJA1000 为工作模式 入口参数 无 出口参数 SJA mode bit Setting SJA1000 workingmode void bit SJA mode unsigned char CONTROL REGdata CONTROL REGdata Read SJA1000 REG CONTROL CONTROL REGdata Write SJA1000 REG CONTROL CONTROL REGdata if Read SJA1000 REG CONTROL 置工作模式成功 else SJA mode 0 置工作模式失败 return SJA mode 函数功能 设置 SJA1000 为复位模式 入口参数 无 出口参数 SJA mode bit Setting SJA1000 resetmode void bit SJA mode unsigned char CONTROL REGdata CONTROL REGdata Read SJA1000 REG CONTROL CONTROL REGdata 0 x01 Write SJA1000 REG CONTROL CONTROL REGdata if Read SJA1000 REG CONTROL 置复位模式成功 else SJA mode 0 置复位模式失败 return SJA mode 函数功能 设置 SJA1000 波特率 入口参数 无 出口参数 setting success bit Setting SJA1000 rate void bit setting success while Setting SJA1000 resetmode 0 Setting SJA1000 resetmode 设置 SJA 工作在复位模式 Write SJA1000 REG BTR0 SJA BTR0 Write SJA1000 REG BTR1 SJA BTR1 if Read SJA1000 REG BTR0 SJA BTR0 波特率设置成功 else setting success 0 波特率设置失败 return setting success 函数功能 设置 SJA1000 的滤波寄存器和屏蔽寄存器 入口参数 无 出口参数 setting success bit Setting SJA1000 dataselect void bit setting success while Setting SJA1000 resetmode 0 Setting SJA1000 resetmode 设置 SJA 工作在复位模式 Write SJA1000 REG ACR SJA ACR Write SJA1000 REG AMR SJA AMR if Read SJA1000 REG ACR SJA ACR 滤波器设置成功 else setting success 0 滤波器设置失败 return setting success 函数功能 设置 SJA1000 的时钟分频器 入口参数 无 出口参数 setting success bit Setting SJA1000 CDR void bit setting success while Setting SJA1000 resetmode 0 Setting SJA1000 resetmode 设置 SJA 工作在复位模式 Write SJA1000 REG CDR SJA CDR if Read SJA1000 REG CDR SJA CDR setting success 1 滤波器设置成功 else setting success 0 滤波器设置失败 return setting success 函数功能 设置 SJA1000 的输出控制寄存器 入口参数 无 出口参数 setting success bit Setting SJA1000 OCR void bit setting success while Setting SJA1000 resetmode 0 Setting SJA1000 resetmode 设置 SJA 工作在复位模式 Write SJA1000 REG OCR SJA OCR if Read SJA1000 REG OCR SJA OCR setting success 1 滤波器设置成功 else setting success 0 滤波器设置失败 return setting success 函数功能 初始化 SJA1000 入口参数 无 出口参数 setting success void Initial SJA1000 void while Judge SJA1000 connect 0 do Setting SJA1000 resetmode while Setting SJA1000 resetmode 0 while Setting SJA1000 CDR 0 while Setting SJA1000 rate 0 while
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电力安全常识知识测试题及答案
- 2025年幕墙员工考试题库及答案
- 高铁纵向便道施工合同(3篇)
- 高炮广告牌施工协议合同(3篇)
- 高空作业工程合同模板(3篇)
- 高空门头施工要求合同(3篇)
- 安徽省辅警笔试题型及答案
- 安徽成人高考试题及答案
- 安防知识考试试题及答案
- 出差期间医疗及保险保障协议
- 闪送员考试25题目及答案
- 卒中后抑郁的中西医治疗
- 轨道列车司机四级题库及答案
- 胫腓骨骨折教学查房课件
- 腹股沟疝的护理教学查房
- 甜蜜陷阱:健康吃糖的危害与科学控糖指南
- 青少年心理健康课件
- 腹部超声报告解读
- 中医护理学基础理论测试题(附答案)
- 课件:大别山精神从大别山精神中汲取奋进力量
- 施工现场专职安全生产管理人员安全日志
评论
0/150
提交评论