您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > CAN总线控制器 SJA1000源程序(c语言)资料
CAN总线控制器sja1000源程序SJA1000是一种独立控制器用于移动目标和一般工业环境中的区域网络控制CAN它是PHILIPS半导体PCA82C200CAN控制器BasicCAN的替代产品而且它增加了一种新的工作模式PeliCAN,这种模式支持具有很多新特性的CAN2.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#includereg52.h#includeAT89X51.H#includeintrins.h//-----------------------沿袭引脚和变量----------------------------------------------#defineucharunsignedchar//宏定义#defineuintunsignedint//宏定义voidMCU_init(void);/*P2口的管脚定义*/sbitLED1=P2^6;sbitLED2=P2^5;sbitSJA_CS=P2^7;//SJA1000片选管脚,低电平有效//sbitSJA_RST=P1^2;/*P3口的管脚定义*/sbitSJA_RD=P3^7;sbitSJA_WR=P3^6;//-----------------------定义寻址的基址--------------------------------------------------------#definebase_Adr0x7F00//-----------------------定义总线定时寄存器的值--------------------------------------------------------#defineSJA_BTR00x07//该值需要用户根据需要的波特率进行计算,推荐使用周立功发布的波特率计算器#defineSJA_BTR10x2F//-----------------------设置接收报文类型(标示符)--------------------------------------------------------//该值需要用户根据实际需要重新配置#defineSJA_ACR0x11//验收代码寄存器的值#defineSJA_AMR0xFF//验收屏蔽寄存器的值//-----------------------设置输出时钟类型--------------------------------------------------------//该值需要用户根据实际需要重新配置#defineSJA_OCR0xaa//输出控制寄存器的值#defineSJA_CDR0x40//时钟分频寄存器的值//-----------------------设置SJA中断,1为开中断--------------------------------------------------------#defineSJA_OIE1//溢出中断#defineSJA_EIE1//错误中断#defineSJA_TIE1//发送中断#defineSJA_RIE1//接收中断//-----------------------定义地址指针,指向基址--------------------------------------------------------unsignedcharxdata*SJA_base_Adr=base_Adr;//-----------------------定义硬件故障标志位--------------------------------------------------------bitbdataconnect_OK=0;//connect_OK=1设备连接正常//connect_OK=0设备连接故障//-----------------------定义硬件故障标志位--------------------------------------------------------bitbdataSJA_workmode=1;//SJA_workmode=1SJA工作在工作模式//SJA_workmode=0工作在复位模式//-----------------------定义SJA1000读写缓冲区的数据结构--------------------------------------------------------structBASICCAN_BUFStruct{unsignedcharIDH8;unsignedcharIDL_R_DLC;unsignedcharFrame_Data[8];}receive_BUF,send_BUF;//------------------------------------------------------------------------------------------------------//函数类别供调用子函数//函数名称send_BUF_init//入口函数无//出口函数无//函数功能对MCU内公共变量结构send_BUF赋初值//------------------------------------------------------------------------------------------------------bitsend_BUF_init(void){//调用send_now()函数的时候,所发送的数据是在这里初始化的。请用户根据具体情况自己调整bitsetting_success=0;send_BUF.IDH8=0x99;send_BUF.IDL_R_DLC=0xE8;//IDL_R_DLC。4即为RTR位,数据=0,远程=1;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;send_BUF.Frame_Data[5]=0x66;send_BUF.Frame_Data[6]=0x77;send_BUF.Frame_Data[7]=0x88;setting_success=1;return(setting_success);}//------------------------------------------------------------------------------------------------------//函数类别延时//函数名称delay//入口函数无//出口函数无//函数功能延时//------------------------------------------------------------------------------------------------------voiddelay(unsignedchartime){while(time--);}//------------------------------------------------------------------------------------------------------//函数类别SJA1000基本操作//函数名称CANREG_write//入口函数SJAREG_ADR,setting//出口函数无//函数功能写SJA1000的寄存器//------------------------------------------------------------------------------------------------------voidCANREG_write(unsignedcharSJAREG_ADR,unsignedcharsetting){*(SJA_base_Adr+SJAREG_ADR)=setting;}//------------------------------------------------------------------------------------------------------//函数类别SJA1000基本操作//函数名称CANREG_read//入口函数SJAREG_ADR//出口函数SJAREG_data//函数功能读SJA1000的寄存器//------------------------------------------------------------------------------------------------------unsignedcharCANREG_read(unsignedcharSJAREG_ADR){unsignedcharSJAREG_data;SJAREG_data=*(SJA_base_Adr+SJAREG_ADR);return(SJAREG_data);}//------------------------------------------------------------------------------------------------------//函数类别SJA1000基本操作//函数名称SJAconnect_judge//入口函数无//出口函数无//全局变量connect_OK//操作寄存器测试寄存器(地址09)//函数功能判断SJA1000与控制器连接是否正常//------------------------------------------------------------------------------------------------------voidSJAconnect_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工作在复位模式//------------------------------------------------------------------------------------------------------voidsetting_SJA_resetmode(void){unsignedcharCONTROL_REGdata;CONTROL_REGdata=CANREG_re
本文标题:CAN总线控制器 SJA1000源程序(c语言)资料
链接地址:https://www.777doc.com/doc-3316187 .html