AVR單片機(jī)實(shí)現(xiàn)了232到CAN轉(zhuǎn)換
#define TXREQ_SET 0x08
#define TXREQ_CLEAR 0x00
#define TXP_HIGHEST 0x03
#define TXP_INTER_HIGH 0x02
#define TXP_INTER_LOW 0x01
#define TXP_LOWEST 0x00
#define CAN_RESET 0xC0
#define CAN_READ 0x03
#define CAN_WRITE 0x02
#define CAN_RTS 0x80
#define CAN_RTS_TXB0 0x81
#define CAN_RTS_TXB1 0x82
#define CAN_RTS_TXB2 0x84
#define CAN_RD_STATUS 0xA0
#define CAN_BIT_MODIFY 0x05
#define CAN_RX_STATUS 0xB0
#define CAN_RD_RX_BUFF 0x90
#define CAN_LOAD_TX 0X40
#define DUMMY_BYTE 0x00
#define TXB0 0x31
#define TXB1 0x41
#define TXB2 0x51
#define RXB0 0x61
#define RXB1 0x71
#define EXIDE_SET 0x08
#define EXIDE_RESET 0x00
uchar can_boud=0x07;//MCP2515在16M晶振情況,can_boud=0x00總線波特率為1M,0x01=500K,0x03=250K,0x07=125K;公式:16M/(16*(1+X))
uint bps=38400;//定義avr單片機(jī)串口波特率
uchar eflag=0;//是不是擴(kuò)展幀,為1則表示接收到的是擴(kuò)展幀,0表示標(biāo)準(zhǔn)幀
uchar Tdate[10]={0};//存放要發(fā)送標(biāo)準(zhǔn)幀的數(shù)據(jù),最大10位,前2位是ID號(hào),后8位是數(shù)據(jù)位
uchar TID[2]={0,0};//存放要發(fā)送標(biāo)準(zhǔn)幀的ID號(hào)
uchar Rdate[8]={0};//存放接收到的數(shù)據(jù)
uchar RESID[4];//存放接收到的數(shù)據(jù)幀的ID號(hào),標(biāo)準(zhǔn)幀只用到RESID[0],RESID[1],擴(kuò)展幀全部用到
uchar bytetime;//232與CAN透明轉(zhuǎn)換時(shí),根據(jù)不同的波特率確定所要延時(shí)的時(shí)間,
uint usart_number=0;//計(jì)數(shù)當(dāng)前所接收的串行數(shù)據(jù)的那一組數(shù)據(jù)流的數(shù)據(jù)個(gè)數(shù),串口傳來的數(shù)據(jù)存放在Tdate中等待用CAN標(biāo)準(zhǔn)幀發(fā)送
uchar state;//2515狀態(tài)(包括發(fā)送接收中斷標(biāo)志位和各請(qǐng)求發(fā)送位),具體見數(shù)據(jù)手冊(cè)
uchar DLC=8;//接收到數(shù)據(jù)的長度
//
//
void delay(uchar k)//
{uint i=0;
//##############################################################################
void Set_CS(uchar level) //
{if(level) PORTB|=0x10; //
}
//##############################################################################
//
//
void WriteSPI(uchar order)
{ uchar clear;
}
//
uchar Read_state(uchar order)//讀狀態(tài)命令,order=0xa0,0xa1,
{ uchar clear;
}
//
uchar Read_Byte(uchar Address)
{uchar clear;
}
//
void Write_Byte(uchar Address,uchar Data)
{uchar clear;
}
//
//###########################對(duì)CAN的一些操作####################################
//
void load_Standard_ID_dates(uchar num)//給標(biāo)準(zhǔn)幀裝載ID和數(shù)據(jù)
//選用發(fā)送緩沖器0,num:要發(fā)送的個(gè)數(shù)(最大8個(gè))
{
//##############################################################################
void Receive_all_ID_process(void)//結(jié)合MCP2515數(shù)據(jù)手冊(cè)來看
{uchar k;
}
//##############################################################################
//##############################USART初始化程序###########################//
void usart_init(void)
{
}
//##########################串行通信##########################//
void putchar(uchar c)
{while(!(UCSRA&(1<
//##############################中斷服務(wù)程序##################################//
void INT1_17(void)
{
uchar i,j,k,R0=0x66;
GICR &=0x7f;
state=Read_state(0xa0);
//WriteSPI(0xa0);//讀取2515狀態(tài)指令,狀態(tài)值附值給state
if((state&0x01)!=0)
Write_Byte(CANINTF,0x00);//接收完一次必須對(duì)中斷標(biāo)志位清0
GICR |=0x80;
}
//####################################
void Usart_receive(void)//定義接收中斷服務(wù)程序
{Tdate[usart_number]=UDR;
//##############定時(shí)器中斷0,串行數(shù)據(jù)流控制
void Timer0(void)
{TIMSK=0x00;//關(guān)T0中斷屏蔽
//##############################CAN(2515)初始化程序###########################//
void CAN_Initialize(void)
{
}
//##############################系統(tǒng)初始化程序################################//
void AVR_Initialize(void) //初始化
{
}
//##################################主程序####################################//
void main()
{
}
評(píng)論