基于CAN的农业灌溉监测系统设计
计原理图
2系统的软件设计
CAN总线的软件设计主要包含三部分:CAN初始化程序、报文的发送程序、报文的接收程序[6]。CAN初始化主要是设置CAN的通信参数。需要初始化的CAN控制寄存器有:模式寄存器、时分寄存器、接收代码寄存器、屏蔽寄存器、总线定时寄存器、输出控制寄存器等。值得注意的是以上寄存器只能在CAN控制器处于复位状态下才可写访问[7]。发送数据程序把数据存储区中待发送的数据取出,组成信息帧,并将主机的ID地址填入帧头,将信息帧发送到CAN控制器的发送缓冲区。在接收到主机的发送请求后,发送程序启动发送命令。信息从CAN控制器发送到总线是由CAN控制器自动完成的。信息从CAN总线到CAN控制器的接收缓冲区也是由CAN控制器自动完成的。接收程序只需从接收缓冲区读取信息,并将其存储在数据存储区。
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]。报文接收程序如下:
unsignedcharcan_receive()
{
MSG_STRUCTrmsg;
inti;
unsignedcharbuf1,buf2;
while((*(unsignedchar*)(BASE_CAN+2))&0x01)
/*判断是
CAN农业灌溉监测系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)