CAN总线控制器-SJA1000源程序(c语言).doc_第1页
CAN总线控制器-SJA1000源程序(c语言).doc_第2页
CAN总线控制器-SJA1000源程序(c语言).doc_第3页
CAN总线控制器-SJA1000源程序(c语言).doc_第4页
CAN总线控制器-SJA1000源程序(c语言).doc_第5页
已阅读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 = 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/-设置接收报文类型(标示符)- /该值需要用户根据实际需要重新配置#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 /接收中断/-定义地址指针,指向基址-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_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_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/ 入口函数 无/ 出口函数 无/ 函数功能 延时/-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(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_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/ 入口函数 无/ 出口函数 无/ 全局变量 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; /置工作模式成功 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(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/ 操作寄存器 验收代码寄存器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) setting_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; while(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_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(0x00); temp=SJA_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/ 函数功能 写发送缓存器/ 特殊要求 只能在工作模式下写/-bit write_SJAsendBUF(void) bit setting_success=0; unsigned char i; while(SJA_workmode=0) setting_SJA_workingmode(); /设置SJA在工作模式 if(CANREG_read(0x02)&0x10)=0) if(CANREG_read(0x02)&0x04)!=0) CANREG_write(0x0a,send_BUF.IDH8); CANREG_write(0x0b,send_BUF.IDL_R_DLC); for(i=0;i8;i+) CANREG_write(0x0c+i,send_BUF.Frame_Datai); 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(0x02)&0x01)!=0) if(CANREG_read(0x02)&0x10)=0) receive_BUF.IDH8=CANREG_read(0x14); receive_BUF.IDL_R_DLC=(CANREG_read(0x15); for(i=0;i8;i+) receive_BUF.Frame_Datai=CANREG_read(0x16+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(0x02); /SR为SJA1000的状态寄存器 while( state & 0x10 )|(!(state & 0x08)|(!(state & 0x04);/查询SJA1000是否处于接收状态,发送完毕状态,或者发送缓存器被锁; while(write_SJAsendBUF()=0); /写入缓存器/ CMR_REGdata = CANREG_read(0x01); /CMR是只写寄存器,不可读,读出值总是1111 1111/ CMR_REGdata = CMR_REGdata | 0x01; CANREG_write(0x01,0x01); /简单置位发送位即可 /-/ 函数类别 发送中断处理函数/ 函数名称 receive_interrupt/ 入口函数 / 出口函数 / 操作寄存器 / 函数功能 发送中断处理函数/-void receive_now(void) while(read_SJAreceiveBUF()=0); CANREG_write(0x01,0x04); /向CMR写入0x04,释放接收缓冲区/-/ 函数类别 中断函数/ 函数名称 SJA_INTR/ 入口函数 无/ 出口函数 无/ 操作寄存器 中断寄存器(地址03)/ 函数功能 中断分析,判断是什么中断,调用相应的中断处理函数/-void SJA_INTR(void) interrupt 0 /CanBus接口芯片产生中断(INTR0) /这里仅简单区分了接收中断和发送中断,对于其余中断,均简单重启SJA1000,另外,IR的高三位保留位读出值总是1. unsigned char sta; EA = 0; /关闭总中断 EX0 = 0; /关闭外部中断 sta = CANREG_read(0x03); /读中断寄存器IR if(sta = 0xe2) /发送中断处理 LED1=0; /如果有信息发出,则指示灯亮 else if(sta = 0xe1) /接收中断,接收数据 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_Data2; 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,0xAA); /写AA到测试寄存器(地址09) if(Read_SJA1000(0x09)=0xAA) 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

温馨提示

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

评论

0/150

提交评论