unsigned char can_send(MSG_STRUCT smsg)
{
unsigned char v;
int i;
v=*(unsigned char*)(BASE_CAN + 2);
if( v &0x08) /*判断是否可以发送数据*/
{ v=smsg.id>>3; /*标识符送识别码寄存器*/
*(unsigned char*)(BASE_CAN + 10) = v;
v=*(unsigned char*)(BASE_CAN + 10);
v=smsg.id & 7; /*识别码0-2位、RTR、DLC*/
v<<=5;
v+=smsg.dlen;
*(unsigned char*)(BASE_CAN + 11) = v;
for(i=0;i
{ *(unsigned char*)(BASE_CAN + 12+i) = smsg.data[i]; }
*(unsigned char*)(BASE_CAN + 1) = 0x01;
return(1);
}
else
{ return(0);}
}
c.报文接收部分
unsigned char can_receive()
{
MSG_STRUCT rmsg;
int i;
unsigned char buf1,buf2;
while((*(unsigned char*)(BASE_CAN + 2)) & 0x01)/*判断是否有可接收信息*/
{buf1 = *(unsigned char*)(BASE_CAN + 20); /*将一帧信息取出*/
buf2 = *(unsigned char*)(BASE_CAN + 21);
rmsg.dlen = buf2 & 0x0f; /*数据长度*/
for(i=0; i< rmsg.dlen; i++) /*取出数据*/
{rmsg.data[i]=*(unsigned char*)(BASE_CAN + 22 + i); }
*(unsigned char*)(BASE_CAN + 1) = 0x04; /*释放接收缓冲器*/
rmsg.rtr = (buf2 >> 4) & 0x01; /*远程帧*/
rmsg.id = buf1; /*取出报文标识符*/
rmsg.id <<= 3;
rmsg.id |= (buf2 >> 5) & 0x06;
switch (rmsg.id) /*按标识符转入不同的数据处理程序*/
case ……
{……
……}
break;
case ……
}
}
5. 结束语
本文的创新点在于:将现场总线引入到集散控制系统中,克服了传统的串行通讯集散控制系统的实时性不强,通讯可靠性差的问题。所给出的CAN智能节点已应用于某发电厂的集散控制系统中,经过一年多的运行情况发现该设计方案具有较好的可靠性、实时性和灵活性。CAN智能节点不仅可以应用于集散控制系统,还可以用于其它分布式控制系统。