CAN实验3.doc_第1页
CAN实验3.doc_第2页
CAN实验3.doc_第3页
CAN实验3.doc_第4页
CAN实验3.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验3 双CAN节点通信 实验说明:CAN1节点将Hello!字符串发送给CAN2节点,并在CAN2的LCD上显示;CAN2节点将Good!字符串发送给CAN1节点,并在CAN1节点的LCD上显示。实验步骤:1、 打开keil软件,建立工程,编辑C文件,配置并编译连接生成.Hex文件2、 将该.Hex文件烧写入单片机3、 观察实验结果,并思考。实验3程序:两节点公共头文件:PeliCAN.h/*-PeliCAN模式SJA1000的内部寄存器地址的定义(_at_定义)-*/ unsigned char xdata MODE _at_ 0x6800; unsigned char xdata CMR _at_ 0x6801;unsigned char xdata SR _at_ 0x6802;unsigned char xdata IR _at_ 0x6803;unsigned char xdata IER _at_ 0x6804;unsigned char xdata BTR0 _at_ 0x6806;unsigned char xdata BTR1 _at_ 0x6807; unsigned char xdata OCR _at_ 0x6808;unsigned char xdata TEST _at_ 0x6809;unsigned char xdata ALC _at_ 0x680B;unsigned char xdata ECC _at_ 0x680C;unsigned char xdata EWLR _at_ 0x680D;unsigned char xdata RXERR _at_ 0x680E; unsigned char xdata TXERR _at_ 0x680F;unsigned char xdata TXB13 _at_ 0x6810;unsigned char xdata RXB13 _at_ 0x6810;unsigned char xdata ACR4 _at_ 0x6810;unsigned char xdata AMR4 _at_ 0x6814;unsigned char xdata CDR _at_ 0x681F; CAN1程序:CAN1.C/* 文 件 名:CAN1.C 功 能: CAN1节点与CAN2节点相互通信通信, 单 位:广西工学院电子信息与控制工程系 作 者:秦宗伟 编辑日期:2011年04月14日 */#include#include/*=宏定义=*/#define uchar unsigned char#define LCD P0/*=控制口定义=*/ sbit RS=P36; /LCD数据命令口 1:数据 0:命令 sbit RW=P37; /LCD读写控制口 1:读 0:写 sbit EN=P26; /LCD使能端sbit RST=P23; /SJA1000复位引脚,低电平有效 sbit CS=P27; /SJA1000的片选端 /*=变量定义区=*/ uchar Rxmessage11;uchar Txmessage8=Hello!;/ 9,8,7,6,5,4,3,2uchar Re_flag=0;/*-名称:Delay 功能:延时参数:uchar t1 uchar t2 返回值:无 -*/void Delay(uchar t1,uchar t2) for(;t10;t1-) for(;t20;t2-);/*-名称:SJA1000_Init 功能:初始化SJA1000 参数:无 返回值:无 -*/SJA1000_Init() uchar i; MODE=0x01; /设置方式寄存器,进入复位模式 CDR=0x88; /设置时钟分频寄存器,选择PeliCAN模式关闭时钟输出 IER=0x01; /设置中断允许寄存器,开放接收中断 ACR0=0x00; /设置验收代码寄存器 ACR1=0x20; /本节点号为01 ACR2=0x00; ACR3=0x00; AMR0=0x00; /没有屏蔽 AMR1=0x00; /没有屏蔽 AMR2=0xff; /屏蔽 AMR3=0xff; /屏蔽 BTR0=0x00; /设置总线定时器0 BTR1=0x1C; /设置总线定时器1,16MHz,500kbps OCR=0xAA; /设置输出控制寄存器,正常输出 TXERR=0x00; /写指令清除发送错误计数寄存器 i=ECC; /读指令清除错误代码捕捉寄存器 MODE=0x00; /设置单滤波方式,并返回工作模式 MODE=0x00; Delay(255,255); /硬件测试表明此句必须要,保证模式可靠切换 /*=中断函数区=*/ /*-名称:Int1_CANReceive()功能:接收中断,从缓冲区中取出数据 参数:无 返回值:无 -*/void Int1_CANReceive() interrupt 2 uchar ss,i; ss=SR; /读入SJA1000状态 ss&=0xC3; /取总线关闭,错误状态,溢出,有数据 if(ss) if(ss&0x80) /总线关闭 ss=IR; /读取中断寄存器以清除中断位 MODE=0x08; /恢复总线 else ss=IR; /读取中断寄存器以清除中断位 if(ss&0x08) /数据溢出 CMR=0x0C; /清除数据溢出和释放接收缓冲区 else if(ss&0x01) /接收缓冲区有数据 for(i=0;i11;i+) Rxmessagei=RXBi+3; CMR=0x04; /设置命令寄存器为释放接收缓冲区 ss=ALC; /读操作以释放仲裁丢失捕捉寄存器 ss=ECC; /读操作以释放错误丢失捕捉寄存器 Re_flag=1; /*-名称:CANSend 功能:查询法发送数据 参数:无 返回值:无 -*/void CANSend(void) uchar i,ss; do ss=SR; /读入SJA1000的状态 while(ss&0x10); /判断是否正在接收,是则等待 do ss=SR; /读入SJA1000的状态 while(!(ss&0x08); /判断先前发送是否成功,否则等待 do ss=SR; /读入SJA1000的状态 while(!(ss&0x04); /判断发送缓冲器是否锁定,是则等待 Delay(200,255); TXB0=0x08; /设置TX标准帧报文,FF=0,RTR=0,DLC=0x08(数据长度)? TXB1=0x00; TXB2=0x40; /对方节点地址为02 for(i=0;i8;i+) TXB3+i=Txmessagei; CMR=0x01; /请求发送 Delay(1,100);/*-名称:Lcd_WD 功能:向LCD写数据 参数:无 返回值:无 -*/void Lcd_WD(uchar dat) RS=1; /数据 RW=0; /写 EN=1; /EN一个下降沿数据就被写入LCD LCD=dat; Delay(1,100); EN=0; CS=1; /为防止LCD写数据错写了SJA1000,故关SJA1000片选 RS=1; /硬件测试表明此句一定要 RW=1; /硬件测试表明此句一定要 EN=1;/*-名称:Lcd_WC 功能:向LCD写命令 参数:无 返回值:无 -*/void Lcd_WC(uchar com) RS=0; /命令 RW=0; /写 EN=1; /EN一个下降沿命令就被写入LCD LCD=com; Delay(1,100); EN=0; CS=1; RS=1; /硬件测试表明此句一定要 RW=1; /硬件测试表明此句一定要 EN=1;/*-名称:Lcd_Init功能:初始化LCD 参数:无 返回值:无 -*/void Lcd_Init() RS=0; /初始化LCD端口 RW=0; EN=0; Lcd_WC(0x38); /功能设定选择8bit数据流 Lcd_WC(0x08); Lcd_WC(0x01); /清屏 Lcd_WC(0x06); /光标的移动右移 Lcd_WC(0x0C); /开显示,关游标,无反白 CS=1; /为防止LCD写数据错写了SJA1000,故关SJA1000片选 RS=1; /硬件测试表明此句一定要 RW=1; /硬件测试表明此句一定要 EN=1;/*-名称:WriteString功能:向LCD写字符串 参数:无 返回值:无 -*/void WriteString(uchar *s) uchar i; if(*s=0) /是否为字符串结束,是则返回 return; for(i=0;i+) if(*(s+i)=0) break; Lcd_WD(*(s+i); /将(S+i)所指向的数组元素写入LCD /*-名称:main 功能:实现节点通信 参数:无 返回值:无 -*/void main() uchar i; uchar *s1=error; IT1=1; /外部中断1为电平触发 EA=1; /开总中断 EX1=1; /开外部中断1 CS=0; Delay(255,255); RST=0; Delay(255,255); RST=1; Delay(255,255); CS=1; Delay(255,255); /延时等待CAN可靠复位 SJA1000_Init(); Lcd_Init(); while(1) CANSend(); Delay(255,255); Delay(255,255); Delay(255,255); if(Re_flag=1) Lcd_WC(0x80); /第一行地址 for(i=0;i1;i+) WriteString(&Rxmessagei); Re_flag=0; Lcd_WC(0x0c); /整体显示开,游标关,游标位置关 else Lcd_WC(0xC0); WriteString(s1); Re_flag=0; CAN2程序:CAN2.C/* 文 件 名:CAN2.C 功 能: CAN2节点与CAN1节点相互通信通信, 单 位:广西工学院电子信息与控制工程系 作 者:秦宗伟 编辑日期:2011年04月14日 */#include#include/*=宏定义=*/ #define uchar unsigned char#define LCD P0/*=控制口定义=*/ sbit RS=P36; /LCD数据命令口 1:数据 0:命令 sbit RW=P37; /LCD读写控制口 1:读 0:写 sbit EN=P26; /LCD使能端sbit RST=P23; /SJA1000复位引脚,低电平有效 sbit CS=P27; /SJA1000的片选端 /*=变量定义区=*/ uchar Rxmessage11;uchar Txmessage6=Good!;uchar Re_flag=0; /接收标志位 /*=子函数定义区=*/ /*-名称:Delay 功能:延时参数:uchar t1 uchar t2 返回值:无 -*/void Delay(uchar t1,uchar t2) for(;t10;t1-) for(;t20;t2-);/*-名称:SJA1000_Init 功能:初始化SJA1000 参数:无 返回值:无 -*/SJA1000_Init() uchar i; MODE=0x01; /设置方式寄存器,进入复位模式 CDR=0x88; /设置时钟分频寄存器,选择PeliCAN模式关闭时钟输出 IER=0x01; /设置中断允许寄存器,开放接收中断 ACR0=0x00; /设置验收代码寄存器 ACR1=0x40; /本节点号为02 ACR2=0x00; ACR3=0x00; AMR0=0x00; /没有屏蔽 AMR1=0x00; /没有屏蔽 AMR2=0xff; /屏蔽 AMR3=0xff; /屏蔽 BTR0=0x00; /设置总线定时器0 BTR1=0x1C; /设置总线定时器1,16MHz,500kbps OCR=0xAA; /设置输出控制寄存器,正常输出 TXERR=0x00; /写指令清除发送错误计数寄存器 i=ECC; /读指令清除错误代码捕捉寄存器 MODE=0x00; /设置单滤波方式,并返回工作模式 MODE=0x00; Delay(255,255); /硬件测试表明此句必须要,保证模式可靠切换 /*-名称:Int1_CANReceive()功能:接收中断,从缓冲区中取出数据 参数:无 返回值:无 -*/void Int1_CANReceive() interrupt 2 uchar ss,i; ss=SR; /读入SJA1000状态 ss&=0xC3; /取总线关闭,错误状态,溢出,有数据 if(ss) if(ss&0x80) /总线关闭 ss=IR; /读取中断寄存器以清除中断位 MODE=0x08; /恢复总线 else ss=IR; /读取中断寄存器以清除中断位 if(ss&0x08) /数据溢出 CMR=0x0C; /清除数据溢出和释放接收缓冲区 else if(ss&0x01) /接收缓冲区有数据 for(i=0;i11;i+) Rxmessagei=RXBi+3; CMR=0x04; /设置命令寄存器为释放接收缓冲区 ss=ALC; /读操作以释放仲裁丢失捕捉寄存器 ss=ECC; /读操作以释放错误丢失捕捉寄存器 Re_flag=1; /*-名称:CANSend 功能:查询法发送数据 参数:无 返回值:无 -*/void CANSend(void) uchar i,ss; do ss=SR; /读入SJA1000的状态 while(ss&0x10); /判断是否正在接收,是则等待 do ss=SR; /读入SJA1000的状态 while(!(ss&0x08); /判断先前发送是否成功,否则等待 do ss=SR; /读入SJA1000的状态 while(!(ss&0x04); /判断发送缓冲器是否锁定,是则等待 TXB0=0x08; /设置TX标准帧报文,FF=0,RTR=0,DLC=0x08(数据长度)? TXB1=0x00; TXB2=0x20; /对方节点地址为01 for(i=0;i8;i+) TXB3+i=Txmessagei; CMR=0x01; /请求发送 Delay(1,100);/*-名称:Lcd_WD 功能:向LCD写数据 参数:无 返回值:无 -*/void Lcd_WD(uchar dat) RS=1; /数据 RW=0; /写 EN=1; /EN一个下降沿数据就被写入LCD LCD=dat; Delay(1,100); EN=0; CS=1; /为防止LCD写数据错写了SJA1000,故关SJA1000片选 RS=1; /硬件测试表明此句一定要 RW=1; /硬件测试表明此句一定要 EN=1;/*-名称:Lcd_WC 功能:向LCD写命令 参数:无 返回值:无 -*/void Lcd_WC(uchar com) RS=0; /命令 RW=0; /写 EN=1; /EN一个下降沿命令就被写入LCD LCD=com; Delay(1,100); EN=0; CS=1; RS=1; /硬件测试表明此句一定要 RW=1; /硬件测试表明此句一定要 EN=1;/*-名称:Lcd_Init功能:初始化LCD 参数:无 返回值:无 -*/void Lcd_Init() RS=0; /初始化LCD端口 RW=0; EN=0; Lcd_WC(0x38); /功能设定选择8bit数据流 Lcd_WC(0x08); Lcd_WC(0x01); /清屏 Lcd_WC(0x06); /光标的移动右移 Lcd_WC(0x0C); /开显示,关游标,无反白 CS=1; /为防止LCD写数据错写了SJA10

温馨提示

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

评论

0/150

提交评论