的数据帧的ID号,标准帧只用到RESID[0],RESID[1],扩展帧全部用到
uchar bytetime;//232与CAN透明转换时,根据不同的波特率确定所要延时的时间,
uint usart_number=0;//计数当前所接收的串行数据的那一组数据流的数据个数,串口传来的数据存放在Tdate中等待用CAN标准帧发送
uchar state;//2515状态(包括发送接收中断标志位和各请求发送位),具体见数据手册
uchar DLC=8;//接收到数据的长度
//
//
void delay(uchar k)//
{uint i=0;
while(k--){for(i=0;i<8000;i++);}
}
//##############################################################################
void Set_CS(uchar level) //
{if(level) PORTB|=0x10; //
else PORTB&=0xef; //
}
//##############################################################################
//
//
void WriteSPI(uchar order)
{ uchar clear;
Set_CS(0); //
SPDR=order; //2515读指令为0x03
while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR;//
Set_CS(1); //
}
//
uchar Read_state(uchar order)//读状态命令,order=0xa0,0xa1,
{ uchar clear;
Set_CS(0); //
SPDR=order; //
while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR;//
SPDR=0; //空数据
while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
Set_CS(1); //
return clear;
}
//
uchar Read_Byte(uchar Address)
{uchar clear;
uchar date;
Set_CS(0); //使能SPI器件
SPDR=0x03; //送2515读指令为0x03
while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
SPDR=Address; //送地址
while(!(SPSR&0x80));
clear=SPSR;
clear=SPDR;
SPDR=0x00; //发空数据,启动数据发送以接收数据
while(!(SPSR&0x80));
clear=SPSR;
clear=SPDR;
date=SPDR; //接收数据
Set_CS(1); //关SPI器件DS1722
return date;
}
//
void Write_Byte(uchar Address,uchar Data)
{uchar clear;
Set_CS(0); //使能SPI器件2515
SPDR=0x02; //送2515写命令为0x02
while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR;
SPDR=Address; //送地址,启动SPI时钟
while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
clear=SPSR;
clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
SPDR=Data;
while(!(SPSR&0x80));
clear=SPSR;
clear=SPDR;
Set_CS(1); //关SPI器件
}
//
//###########################对CAN的一些操作####################################
//
void load_Standard_ID_dates(uchar num)//给标准帧装载ID和数据
//选用发送缓冲器0,num:要发送的个数(最大8个)
{
uchar i,j,T0=0x36;
uchar TIDH,TIDL;
i=TID[1]>>3;j=TID[0]<5;j=j+i;i=TID[1]<5;
TIDL=i;TIDH=j;//将数组TID中的值转化为TIDH,TIDL以便给TXB0SIDH,TXB0SIDL附值
Write_Byte(CANCTRL,0x80);//CAN工作在配置模式
Write_Byte(CNF1,can_boud);
Write_Byte(TXB0SIDH,TIDH);
Write_Byte(TXB0SIDL,TIDL);
Write_Byte(TXB0DLC,num);//
for(i=2;i
}
//##############################################################################
void Receive_all_ID_process(void)//结合MCP2515数据手册来看
{uchar k;
k=RESID[1];//先判断接收到的是不是标准帧,因为标准帧和扩展帧的ID处理不一样
if((k&0x08)==0)
{//如果是标准处理方法
RESID[1]=RESID[1]>>5;
k=RESID[0]&0x1f;//借用k
k=k<3;
RESID[1]=RESID[1]+k;
RESID[0]=RESID[0]>>5;
}
else
{//扩展帧处理方法,RESID[3]、RESID[4]不变
k=k>>5;
k=k<2;
RESID[1]=RESID[1]&0x03;
RESID[1]=RESID[1]+k;
k=RESID[0];
k=k<5;
RESID[1]=RESID[1]+k;
RESID[0]=RESID[0]>>3;//将RXB0SIDH,RXB0SIDL转化
}
}
//##############################################################################
//##############################USART初始化程序###########################//
void usart_init(void)
{
UCSRB=(1
UBRRL=(fosc/16/(bps+1))%6;
UBRRH=(fosc/16/(bps+1))/256;
UCSRC=(1
bytetime=215983/bps;//215983=1000000*20/92.6,92.6=1024/11.0592,定时器分频为1024
bytetime=255-bytetime;//计算不同的波特率所要延时的初值,要附值给TCNT0,实现透明转换中用到
}
//##########################串行通信#####################