




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/*描述: 独立的CAN 控制器SJA1000基本硬件头文件定义BasicCAN 工作方式*/#include <string.h>#include<reg51.h> #include<stdio.h>#include<intrins.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned intsbit CS7221 = P11;/ 7221的片选sbit DIN7221 = P10;/ 7221的数据端sbit CLK7221 = P12;/ 72
2、21的时钟端sbit wr_0804=P37;/0804读端sbit rd_0804=P36;/0804写端sbit intr_0804=P22;/0804中断端sbit cs_0804=P21;/0804片选端uchar temp,c4;/温度暂存uchar DATA_BUF6;/发送数据暂存/* *SJA1000与微处理器的接口是以外部存储器的方式,所以以下的基址定义,用户 * *应根据自己的实际电路来进行调整 * */#define SJA_Adr0xfe00 /定义sja1000的片选基址/计算SJA1000在电路中的实际地址:基址+内部寄存器地址/* * 以下的定义为SJA1000的
3、内部寄存器的地址,不可修改 * * 各寄存器的具体功能清参阅sja1000的数据手册 * */#defineREG_CONTROL SJA_Adr+0x00 /内部控制寄存器#defineREG_COMMAND SJA_Adr+0x01 /命令寄存器#defineREG_STATUS SJA_Adr+0x02 /状态寄存器#defineREG_INTERRUPT SJA_Adr+0x03 /中断寄存器#defineREG_ACR SJA_Adr+0x04 /验收代码寄存器#defineREG_AMR SJA_Adr+0x05 /验收屏蔽寄存器#defineREG_BTR0 SJA_Adr+0x
4、06 /总线定时寄存器0 #defineREG_BTR1 SJA_Adr+0x07/总线定时寄存器1 #defineREG_OCR SJA_Adr+0x08 /输出控制寄存器#defineREG_TEST SJA_Adr+0x09 /测试寄存器 /以下为发送缓冲区寄存器定义#defineREG_TxBuf1 SJA_Adr+0x0A /发送缓冲区1#defineREG_TxBuf2 SJA_Adr+0x0B /发送缓冲区2#defineREG_TxBuf3 SJA_Adr+0x0C/发送缓冲区3#defineREG_TxBuf4 SJA_Adr+0x0D /发送缓冲区4#defineREG_T
5、xBuf5 SJA_Adr+0x0E /发送缓冲区5#defineREG_TxBuf6 SJA_Adr+0x0F /发送缓冲区6#defineREG_TxBuf7 SJA_Adr+0x10 /发送缓冲区7#defineREG_TxBuf8 SJA_Adr+0x11 /发送缓冲区8#defineREG_TxBuf9 SJA_Adr+0x12 /发送缓冲区9#defineREG_TxBuf10 SJA_Adr+0x13 /发送缓冲区10/以下为接收缓冲区寄存器定义#defineREG_RxBuf1 SJA_Adr+0x14 /接收缓冲区1#defineREG_RxBuf2 SJA_Adr+0x15
6、 /接收缓冲区2#defineREG_RxBuf3 SJA_Adr+0x16 /接收缓冲区3#defineREG_RxBuf4 SJA_Adr+0x17 /接收缓冲区4#defineREG_RxBuf5 SJA_Adr+0x18 /接收缓冲区5#defineREG_RxBuf6 SJA_Adr+0x19 /接收缓冲区6#defineREG_RxBuf7 SJA_Adr+0x1A /接收缓冲区7#defineREG_RxBuf8 SJA_Adr+0x1B /接收缓冲区8#defineREG_RxBuf9 SJA_Adr+0x1C /接收缓冲区9#defineREG_RxBuf10 SJA_Adr
7、+0x1D /接收缓冲区10/* *内部地址 01EH 备用 * */* *时钟分频寄存器(内部地址01FH) * */#define REG_CDR SJA_Adr+0x1F /时钟分频寄存器/* *定义指针 * */ucharxdata *SJA_BCANAdr; /* *定义命令字 * */ #define TR_CMD 0x01 /发送请求命令#define AT_CMD 0x02 /夭折发送命令#define RRB_CMD 0x04 /释放接收缓冲区#define COS_CMD 0x08 /清除超载状态#define GTS_CMD 0x10 /进入睡眠状态命令/* *定义12M
8、的晶体下,CAN总线波特率 * */#define bps_20k 0x00 /波特率20kbps#define bps_40k 0x01 /波特率40kbps#define bps_50k 0x02 /波特率50kbps#define bps_80k 0x03 /波特率80kbps#define bps_100k 0x04 /波特率100kbps#define bps_125k 0x05 /波特率125kbps#define bps_200k 0x06 /波特率200kbps#define bps_250k 0x07 /波特率250kbps#define bps_400k 0x08 /波特率
9、400kbps#define bps_500k 0x09 /波特率500kbps#define bps_666k 0x0a /波特率666kbps#define bps_800k 0x0b /波特率800kbps#define bps_1000k 0x0c /波特率1000kbps/*- * 以下为BASICCAN SJA1000的错误字 * -*/#define INTERFACE_0K 0 /SJA1000接口正常 #define BUS_0K 0 /CAN总线工作正常#define INTERFACE_ERR 0XFF /SJA1000接口错误? #define ENTRESET_ERR
10、 0XFE /SJA1000不能进入复位模式#define QUITRESET_ERR 0XFD /SJA1000不能退出复位模式#define INITOBJECT_ERR 0XFC /初始化报文验收滤波器错#define INITBTR_ERR 0XFB /初始化总线定时器器错#define INITOUTCTL_ERR 0XFA /初始化输出控制错误#define INTCLKDIV_ERR 0XF9 /初始化时钟分频控制器错#define BUS_ERR 0XF8 /SJA1000发送数据错#define NO_BANDRATE_SIZE 0xe7 /* *以下为基本的函数说明(Bas
11、icCAN) * */bit CREATE_COMMUNATION(void); /检测CAN控制器的接口是否正常 bit ENTER_RETMODEL(void);/CAN控制器进入复位工作模式 bit QUIT_RETMODEL(void);/CAN控制器退出复位工作模式 bit SET_BANDRATE(uchar CAN_bps);/设置CAN控制器SJA1000通信波特率bit SET_OBJECT(uchar BCAN_ACR,uchar BCAN_AMR);/设置CAN节点的通讯对象bit SET_OUTCLK (uchar Out_Control,uchar Clock_Out
12、);/设置SJA1000的输出模式和时钟分频 bit HW_INIT(uchar BCAN_ACR,uchar BCAN_AMR,uchar Bus_Timing0, uchar Bus_Timing1,uchar Out_Control,uchar Clock_Out); /CAN控制器的初始化bit DATA_WRITE(uchar *SendDataBuf);/发送特定帧各式的数据 bit RECEIVE(uchar *RcvDataBuf);/CAN控制器接收数据bit CMD_PRG(uchar cmd);/执行sja1000命令 void sja1000();/SJA1000初始化
13、void Initial7221(void);/MAX7221初始化void WR7221(uchar addr,uchar Data);/MAX7221写程序void Max7221Display(uchar *buffer);/MAX7221显示程序void read_0804();/读AD转换电压值void wdcl_0804();/转换电压值void delay(uint n); /延时程序main() sja1000();/SJA1000初始化while(1)uchar k;read_0804();/读AD转换电压值wdcl_0804();/转换电压值Max7221Display(&
14、amp;c0);/显示DATA_BUF0=0xaa;/ID高8位为10101010=0xaaDATA_BUF1=0xb4;/ID低3位为101 数据帧 数据长度为4位for(k=0;k<=3;k+)/要发送的4位数据DATA_BUF2+k=ck;/DATA_WRITE(&DATA_BUF0);/通过CAN总线向计算机发送数据delay(100);/延时/*adc0804*/void read_0804()/读AD转换电压值intr_0804=1;cs_0804=1;wr_0804=1;rd_0804=1;intr_0804=0;_nop_();_nop_();cs_0804=0;
15、/0804片选有效wr_0804=0;/0804写地址_nop_();_nop_();intr_0804=1;rd_0804=0;/0804读_nop_();_nop_();temp=P0;/读AD转换数据cs_0804=1;wr_0804=1;rd_0804=1;void wdcl_0804()temp=(temp*2-273)*10;/提取一位小数c0=temp/1000;/千位c1=temp/100%10;/百位c2=temp/10%10;/十位c3=temp%10;/个位void delay(uint n) /延时程序 uint i1,j1; for (i1=0;i1<n;i1+
16、) for (j1=0;j1<1140;j1+);void WR7221(uchar addr,uchar Data)/MAX7221的写子程序 uchar i; CS7221 = 0; /片选有效 for (i=0;i<8;i+) /写8位地址 CLK7221 = 0;/时钟低 DIN7221 = (addr&(0x80>>i) ? 1:0;/先发高位 依次到低位 _nop_(); _nop_(); CLK7221 = 1;/时钟高 上升沿锁数据 _nop_(); _nop_(); for (i=0;i<8;i+) /写8位数据 CLK7221 = 0;
17、/时钟低 DIN7221 = (Data&(0x80>>i) ? 1:0;/先发高位 依次到低位 _nop_(); _nop_(); CLK7221 = 1;/时钟高 上升沿锁数据 _nop_(); _nop_(); CS7221 = 1; /片选无效void Initial7221(void)/MAX7221初始化WR7221(0x0A,0x0A);/亮度地址0AH,0x000x0F,0x0F最亮WR7221(0x0B,0x07);/扫描LED个数地址0BH,0x000x07,最多扫描8个数码管WR7221(0x0C,0x01);/工作模式地址0x0C. 0x00:关断;
18、0x01:正常WR7221(0x09,0xFF);/编码模式地址0x09. 0x000xFF:哪一位为1,哪一位就支持编码void Max7221Display(uchar *buffer)/MAX7221显示子程序 uchar i; for (i=0;i<8;i+)/MAX7221的8个数码管显示 WR7221(i+1,*(buffer+i);/调MAX7221的写子程序 void sja1000()do;while(CREATE_COMMUNATION()=1); /检测CAN控制器的接口是否正常do;while(ENTER_RETMODEL()=1); /进入复位工作模式HW_IN
19、IT(0xaa,0x00,0xc9,0xc9,0xff,0x48);/CAN控制器的初始化do;while(QUIT_RETMODEL()=1); /退出复位工作模式/* *说明:该函数用于检测CAN控制器的接口是否正常 * */bit CREATE_COMMUNATION(void) SJA_BCANAdr=REG_TEST; /访问测试寄存器 *SJA_BCANAdr =0xaa; /写入测试值 if(*SJA_BCANAdr = 0xaa) return 0; /读测试正确 else return 1; /* *说明: CAN控制器进入复位工作模式 * */ bit ENTER_RETM
20、ODEL(void)uchar TempData; SJA_BCANAdr = REG_CONTROL; /访问地址指向控制寄存器 TempData= *SJA_BCANAdr; /保存原始值 *SJA_BCANAdr=(TempData|0x01); /置位复位请求 if(*SJA_BCANAdr&0x01) = 1) return 0; else return 1; /* *说明: CAN控制器退出复位工作模式 * */ bit QUIT_RETMODEL(void) uchar TempData; SJA_BCANAdr = REG_CONTROL; /访问地址指向控制寄存器 T
21、empData = *SJA_BCANAdr; /保存原始值 *SJA_BCANAdr=(TempData&0xfe); /清除复位请求 if(*SJA_BCANAdr&0x01) = 0) return 0; / else return 1; /退出成功 /*;*说明:设置CAN控制器SJA1000通信波特率.SJA1000的晶振为必须为16MHZ, *;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *;* 复位模式 * ;*/ucharcodeSJA_BTR_CODETAB=0x53,0x2F, /;20KBPS的预设值 0x87,0xFF, /;40KB
22、PS的预设值 0x47,0x2F, /;50KBPS的预设值 0x83,0xFF, /;80KBPS的预设值 0x43,0x2f, /;100KBPS的预设值 0x03,0x1c, /;125KBPS的预设值 0x81,0xfa, /;200KBPS的预设值 0x01,0x1c, /;250KBPS的预设值 0x80,0xfa, /;400KBPS的预设值 0x00,0x1c, /;500KBPS的预设值 0x80,0xb6, /;666KBPS的预设值 0x00,0x16, /;800KBPS的预设值 0x00,0x14 /;1000KBPS的预设值 ;bit SET_BANDRATE(uc
23、har CAN_bps)uchar BTR0_num,BTR1_num;BTR0_num = SJA_BTR_CODETABCAN_bps*2;BTR1_num = SJA_BTR_CODETABCAN_bps*2+1;/将波特率的的预设值装入sja1000的总线定时器SJA_BCANAdr=REG_BTR0; /访问地址指向总线定时寄存器0*SJA_BCANAdr=BTR0_num; /写入参数if(*SJA_BCANAdr != BTR0_num)/校验写入值return 1; SJA_BCANAdr=REG_BTR1; /访问地址指向总线定时寄存器1*SJA_BCANAdr=BTR1_n
24、um; /写入参数if(*SJA_BCANAdr != BTR1_num)/校验写入值return 1; return 0; /*;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10-D3) 。 *;* 允许接收的报文,是由AMR和ACR共同决定的. * ;* 满足以下条件的ID号的报文才可以被接收 *;*(ID.10-ID.3)(AC.7-AC.0)|(AM.7-AM.0)11111111 *;* 该子程序只能用于复位模式 * * ;*/bit SET_OBJECT(uchar BCAN_ACR,uchar BCAN_AMR)SJA_BCANAdr=REG_ACR; /访
25、问地址指向验收代码寄存器(ACR)*SJA_BCANAdr=BCAN_ACR; /写入参数if(*SJA_BCANAdr != BCAN_ACR) /校验写入值return 1; SJA_BCANAdr=REG_AMR; /访问地址指向验收屏蔽寄存器(AMR)*SJA_BCANAdr=BCAN_AMR; /写入参数if(*SJA_BCANAdr != BCAN_AMR) /校验写入值return 1; return 0;/*;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 * * ;*/bit SET_OUTCLK (uchar Out_Control,uchar
26、Clock_Out)SJA_BCANAdr=REG_OCR ; /访问地址指向输出控制寄存器*SJA_BCANAdr=Out_Control; /写入参数if(*SJA_BCANAdr != Out_Control)/校验写入值return 1; SJA_BCANAdr=REG_CDR; /访问地址指向时钟分频寄存器*SJA_BCANAdr=Clock_Out; /写入参数return 0;/* *说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入* * 到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 * * 确的按实际需要计算好参数后,将参数写入对
27、应的寄存器 。 */ bit HW_INIT(uchar BCAN_ACR,uchar BCAN_AMR,uchar Bus_Timing0,uchar Bus_Timing1,uchar Out_Control,uchar Clock_Out) SJA_BCANAdr=REG_ACR; /访问地址指向验收代码寄存器(ACR)*SJA_BCANAdr=BCAN_ACR; /写入参数if(*SJA_BCANAdr != BCAN_ACR) /校验写入值return 1; SJA_BCANAdr=REG_AMR; /访问地址指向验收屏蔽寄存器(AMR)*SJA_BCANAdr=BCAN_AMR;
28、/写入参数if(*SJA_BCANAdr != BCAN_AMR) /校验写入值return 1; SJA_BCANAdr=REG_BTR0; /访问地址指向总线定时寄存器0*SJA_BCANAdr=Bus_Timing0; /写入参数if(*SJA_BCANAdr != Bus_Timing0)/校验写入值return 1; SJA_BCANAdr=REG_BTR1; /访问地址指向总线定时寄存器1*SJA_BCANAdr=Bus_Timing1; /写入参数if(*SJA_BCANAdr != Bus_Timing1)/校验写入值return 1; SJA_BCANAdr=REG_OCR
29、; /访问地址指向输出控制寄存器*SJA_BCANAdr=Out_Control; /写入参数if(*SJA_BCANAdr != Out_Control)/校验写入值return 1; SJA_BCANAdr=REG_CDR; /访问地址指向时钟分频寄存器*SJA_BCANAdr=Clock_Out; /写入参数return 0; /* *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 * * SJA1000发送。 * * 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 * * 描述符包括11位长的ID(标志符)1位RTR4位描述数据
30、长度的DLC共16位 * */ bit DATA_WRITE(uchar *SendDataBuf)uchar TempCount;SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器if(*SJA_BCANAdr&0x08) = 0) /判断上次发送是否完成return1; if(*SJA_BCANAdr&0x04)=0) /判断发送缓冲区是否锁定return1; SJA_BCANAdr = REG_TxBuf1; /访问地址指向发送缓冲区1if(SendDataBuf1&0x10)=0) /判断RTR,从而得出是数据帧还是远程帧 TempCount =(SendDataBuf1&0x0f)+2; /输入数据帧elseTempCount =2; /远程帧memcpy(SJA_BCANAdr,SendDataBuf,TempCount);return 0;/*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年开学第一课安全主题班会教案范例
- 2025年玻璃花盆架项目可行性研究报告
- 2025年猴头菇多糖项目可行性研究报告
- 2025年牛皮纸绳机项目可行性研究报告
- 石家庄财经职业学院《时尚健美操》2023-2024学年第二学期期末试卷
- 浙江省淮北市2025年三年级数学第二学期期末学业水平测试试题含解析
- 上海市青浦区达标名校2025年初三5月份考试物理试题含解析
- 三亚城市职业学院《医学实验基本技术与设备》2023-2024学年第二学期期末试卷
- 山东交通学院《大数据基础实践》2023-2024学年第二学期期末试卷
- 四川省遂宁市重点中学2024-2025学年初三毕业班联考生物试题试卷含解析
- DB3309T 86-2021 晚稻杨梅生产技术规程
- 水电安装合同范本6篇
- 2024年03月徽商银行社会招考笔试历年参考题库附带答案详解
- 2024中国儿童营养趋势洞察报告
- 第一章-地震工程学概论
- 孩子畏难情绪心理健康教育
- 《中国糖尿病防治指南(2024版)》更新要点解读
- 手术患者液体管理
- 中国融通集团北京企业管理共享中心社会招聘笔试真题2023
- T-CCSAS 042-2023 在役常压储罐检验与适用性评价技术规范
- 2024年10月自考15040习概试题及答案含评分参考
评论
0/150
提交评论