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

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

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

#####//

void putchar(uchar c)

{while(!(UCSRA&(1

UDR=c;}

//##############################中断服务程序##################################//

void INT1_17(void)

{

uchar i,j,k,R0=0x66;

GICR &=0x7f;

state=Read_state(0xa0);

//WriteSPI(0xa0);//读取2515状态指令,状态值附值给state

if((state&0x01)!=0)

{//判断是不是接收缓冲器0满产生的中断

k=Read_Byte(RXB0SIDL);//为了判断是标准帧还是扩展帧

if((k&0x08)==0)eflag=0;//置标准帧标志

else eflag=1;//置扩展帧标志

DLC=Read_Byte(RXB0DLC);

DLC &=0x0f;

RESID[0]=Read_Byte(RXB0SIDH);

RESID[1]=Read_Byte(RXB0SIDL);

RESID[2]=Read_Byte(RXB0EID8);

RESID[3]=Read_Byte(RXB0EID0);//先读取所有ID

Receive_all_ID_process();//处理RESID

for(i=0;i

if(eflag==0)

{//如果是标准帧

putchar(RESID[0]);

putchar(RESID[1]);//先送标准帧ID号

}

else

{//如果是扩展帧

putchar(RESID[0]);

putchar(RESID[1]);

putchar(RESID[2]);

putchar(RESID[3]);//先送扩展帧ID号

}

putchar(DLC);

for(i=0;i

}

Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0

GICR |=0x80;

}

//####################################

void Usart_receive(void)//定义接收中断服务程序

{Tdate[usart_number]=UDR;

usart_number++;

TIMSK=0x05;//打开T1,T0中断屏蔽

TCCR0=0x05;//设T0分频数为1024

TCNT0=bytetime;//设T0时间常数,从此值开始计数

}

//##############定时器中断0,串行数据流控制

void Timer0(void)

{TIMSK=0x00;//关T0中断屏蔽

TCNT0=0x00;//

TCCR0=0x00;//T0停止计数

if((usart_number>2)&&(usart_number<11))

{

TID[0]=Tdate[0];TID[1]=Tdate[1];

load_Standard_ID_dates(usart_number-2);//对2515发送缓冲器0和ID寄存器进行数据装载

usart_number=0;

Write_Byte(CANCTRL,0x00);//选定工作模式

WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送

}

else usart_number=0;

}

//##############################CAN(2515)初始化程序###########################//

void CAN_Initialize(void)

{

WriteSPI(CAN_RESET);

delay(20);

Write_Byte(CANCTRL,0x80);//CAN工作在配置模式

Write_Byte(CNF1,can_boud);

Write_Byte(CNF2,0x80 | PHSEG1_3TQ | PRSEG_1TQ);//Set CNF2

Write_Byte(CNF3,PHSEG2_3TQ);

//0x80+0x10+0x00,相位缓冲段2由CNF3确定,相位缓冲段1为3TQ,传播段为1TQ

Write_Byte(RXB0CTRL,0xf0);//接收类型选择,接收所有报文

Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0

Write_Byte(CANINTE,0x01);//接收缓冲器0满中断使能

Write_Byte(CANCTRL,0x00);//选定正常工作模式

}

//##############################系统初始化程序################################//

void AVR_Initialize(void) //初始化

{

DDRB=0xff; //SPI口

PORTB=0xff;

DDRD=0xf0;//将外部中断引脚设定为输入

PORTD=0x7f;

SPCR=0b01011100;//关中断(SPIE=0),使能SPI(SPE=1),MSB首先发送(DORD=0)

//选择微机为主机模式(MSTR=1)

//空闲时SCK 为高电平(CPOL=1)

//在SCK 的结束沿采样(CPHA=1)以保证数据稳定

//SPR1=0和SPR0=0,SCK=fosc/4

SPSR |=0x01;//SPI的速度加倍

MCUCR=0x0a;//设置外部中断的中断触发方式为下降沿触发

GICR=0xc0;//通用中断控制寄存器设置,打开中断INT0和INT1

SREG=0x80;//开全局中断

}

//##################################主程序####################################//

void main()

{

AVR_Initialize(); //I/O口及中断初始化

CAN_Initialize();

usart_init();

UCSRB |=0x80;//接收中断使能

}


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

网站地图

Top