基于CAN的农业灌溉监测系统设计
本文引用地址:https://www.eepw.com.cn/article/201612/331330.htm
2.1CAN总线节点初始化程序
节点初始化主要指的是在系统上电以后对89C51以及CAN控制器SJA1000所进行初始化,来保证工作主频、输出特性以及波特率等。89C51的初始化能通过结合他们的监控任务来进行,主要就是完成对中断允许与屏蔽以及定时器的使用与和设置等。这里着重来说明SJA1000的初始化,SJA1000内部没有微处理器,要实现它的初始化要依靠89C51对其编程实现。在复位模式下才能进行SJA1000的初始化,因此在SJA1000初始化程序中第一要把工作方式置换为复位模式,然后设置验收滤波方式等。在CAN协议物理层当中的通信波特率的大小以及同步跳转宽度都是由定时寄存器BTR0和BTR1的程序所决定。着重强调的是:对一个系统当中的所有的节点来说,这两个寄存器的所有内容一定要一样,不然将没有办法进行通信。当初始化的设置完成以后,把复位请求位置‘0’,SJA1000就能够进入到工作状态,来完成正常的通信任务[8]。初始化程序如下:
#include<80c196kd.h>//包含的控制器寄存器定义
#include_SFR_H_
#include_FUNCS_H_
#defineBASE_CAN0xa000//定义CAN控制器基址
typedefstruct{
unsignedintid;/*报文标识符*/
unsignedcharrtr;/*远程帧位*/
unsignedchardlen;/*数据长度*/
unsignedchardata[8];/*数据*/
}MSG_STRUCT;/*将CAN协议的帧用C语言的结构表示*/
voidinit_can(){
*(unsignedchar*)(BASE_CAN+0)=0x01;
/*SJA1000进入复位状态*/
*(unsignedchar*)(BASE_CAN+4)=0x00;
/*初始化接收代码寄存器ACR*/
*(unsignedchar*)(BASE_CAN+5)=0xff;
/*初始化接收屏蔽寄存器AMR*/
*(unsignedchar*)(BASE_CAN+6)=0x00;
/*初始化总线时序寄存器BTR0*/
*(unsignedchar*)(BASE_CAN+7)=0x14;
/*初始化总线时序寄存器BTR1*/
*(unsignedchar*)(BASE_CAN+8)=0xfa;
/*初始化输出控制寄存器OCR*/
}
2.2报文发送程序
发送程序负责节点报文的发送,发送时用户只需将待发送的数据按特定格式组合成一帧报文,送入SJA1000发送缓存区中,并将SJA1000的命令寄存器发送请求标志位(TR)置位。SJA1000会自动启动发送过程。但是,在往SJA1000发送缓存区发送报文之前,必须先对发送缓冲器是否释放进行判断,只有当发送缓冲器标志(TBS)为“1”时,发送缓冲器才被释放,可将新报文写入发送缓存,否则,在发送缓冲器被锁定时,新报文是不能被写入发送缓冲器的。发送程序分数据帧和发送远程帧两种。远程帧无数据场。发送程序一般编写成子程序的形式。报文发送程序如下:
unsignedcharcan_send(MSG_STRUCTsmsg)
{unsignedcharv;
inti;
v=*(unsignedchar*)(BASE_CAN+2);
if(v&0x08)/*判断是否可以发送数据*/
{v=smsg.id>>3;/*标识符送识别码寄存器*/
*(unsignedchar*)(BASE_CAN+10)=v;
v=*(unsignedchar*)(BASE_CAN+10);
v=smsg.id&7;/*识别码0-2位、RTR、DLC*/
v<<=5;
v+=smsg.dlen;
*(unsignedchar*)(BASE_CAN+11)=v;
for(i=0;ii
{
*(unsignedchar*)(BASE_CAN+12+i)=smsg.data[i];
}
*(unsignedchar*)(BASE_CAN+1)=0x01;
return(1);
}
else
return(0);
}
2.3报文接收程序
SJA1000的报文接收是它自身独立完成的,它接收到的报文经过滤波验收以后,暂时放在接收缓冲器FIFO当中。在报文进到接收缓冲器之后,状态寄存器的RBS会被置‘1’,与此同时若中断使能寄存器的RIE被设为‘1’时,中断寄存器的RI位也会被置为‘1’,然后SJA1000向CPU提出中断请求。报文接收可以采取查询接收方式或者是中断接收方式。如果对通信的实时性的要求没有那么强那就可以采取查询接收方式[9]。报文接收程序如下:
评论