微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机实现了232到CAN转换

AVR单片机实现了232到CAN转换

时间:11-27 来源:互联网 点击:

的数据帧的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,实现透明转换中用到

}

//##########################串行通信#####################

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top