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