?? 24m
字號(hào):
#include <reg51.h>
#include <absacc.h>
/************** SJA1000 內(nèi)部寄存器地址定義 ********/
#define CAN_MODE 0 /* 模式寄存器 */
#define CAN_CMR 1 /* 命令寄存器 */
#define CAN_SR 2 /* 狀態(tài)寄存器 */
#define CAN_IR 3 /* 中斷寄存器 */
#define CAN_IER 4 /* 中斷允許寄存器 */
#define CAN_BTR0 6 /* 總線定時(shí)寄存器0 */
#define CAN_BTR1 7 /* 總線定時(shí)寄存器1 */
#define CAN_OCR 8 /* 輸出控制寄存器 */
#define CAN_TEST 9
#define CAN_ALC 11 /* 仲裁丟失捕捉寄存器 */
#define CAN_ECC 12 /* 錯(cuò)誤代碼捕捉寄存器 */
#define CAN_EWLR 13 /* 錯(cuò)誤報(bào)警限額寄存器 */
#define CAN_RXERR 14 /* 接受錯(cuò)誤計(jì)數(shù)寄存器 */
#define CAN_TXERR 15 /* 發(fā)送錯(cuò)誤計(jì)數(shù)寄存器 */
#define CAN_RBSA 30 /* 接受緩存器起始地址寄存器 */
#define CAN_CDR 31 /* 時(shí)鐘分頻寄存器 */
#define CAN_ACR0 16 /* 驗(yàn)收代碼寄存器0 */
#define CAN_ACR1 17 /* 驗(yàn)收代碼寄存器1 */
#define CAN_ACR2 18 /* 驗(yàn)收代碼寄存器2 */
#define CAN_ACR3 19 /* 驗(yàn)收代碼寄存器3 */
#define CAN_AMR0 20 /* 驗(yàn)收屏蔽寄存器0 */
#define CAN_AMR1 21 /* 驗(yàn)收屏蔽寄存器1 */
#define CAN_AMR2 22 /* 驗(yàn)收屏蔽寄存器2 */
#define CAN_AMR3 23 /* 驗(yàn)收屏蔽寄存器3 */
unsigned char tx_data[13]={0x88,0x11,0x11,0x11,0x11, /* */
0x11,0x22,0x33,0x44, /* */
0x55,0x66,0x77,0x88}; /* 輸入輸出數(shù)據(jù)數(shù)組 其中tx_data[0]的4,5位
在SJA1000中保留未用,在此用來區(qū)分輸入,輸出數(shù)據(jù)*/
unsigned char rx_data[13]={0,0,0,0,0,
0,0,0,0,
0,0,0,0};
unsigned char bdata sr ,ir; /* 記錄SJA1000 內(nèi)部狀態(tài) */
bit getremote=0; /* 遠(yuǎn)程幀標(biāo)記 收到遠(yuǎn)程幀請求后 置1 */
bit timer0up=0; /* 秒計(jì)時(shí) 到1秒 置1 */
unsigned char t0count=0;
unsigned char mytime; /* 用于記錄0到9的ASCII 每秒增加1,遠(yuǎn)程幀訪問增加1 */
void can_init( void ) ;
void can_txdata ( void ) ;
void can_rxdata ( void ) ;
void dealmessage_remote( void ) ;
void dealmessage_remote2( void ) ;
/******************************************************************/
/******************* write reg of SJA1000 ****************/
/******************************************************************/
void writeSJAreg ( unsigned char SJAadd , unsigned char value)
{
unsigned char temp_write = value ;
XBYTE[ 0x8000 + SJAadd ] = temp_write ;
}
/******************************************************************/
/******************* read reg of SJA1000 ****************/
/******************************************************************/
unsigned char readSJAreg( unsigned char SJAadd )
{
return( XBYTE[ 0x8000 + SJAadd ] );
}
/******************************************************************/
/******************* set the reg bit of SJA1000 ****************/
/******************************************************************/
void setREGbit(unsigned char SJAadd , unsigned char value)
{
unsigned char temp ;
temp = readSJAreg( SJAadd ) ;
temp |= value ;
writeSJAreg( SJAadd , temp ) ;
}
/******************************************************************/
/******************* clear the reg bit of SJA1000 ****************/
/******************************************************************/
void clearREGbit(unsigned char SJAadd , unsigned char value)
{
unsigned char temp ;
temp = readSJAreg( SJAadd ) ;
temp &= value ;
writeSJAreg( SJAadd , temp ) ;
}
/******************************************************************/
/******************* test bit of SJA1000 ****************/
/******************************************************************/
unsigned char testREGbit(unsigned char SJAadd , unsigned char value)
{
unsigned char temp ;
temp = readSJAreg( SJAadd ) ;
temp &= value ;
return (temp) ;
}
/******************************************************************/
/******************* initializtion of CPU ****************/
/******************************************************************/
void cpu_init(void)
{
IE = 0x03; /* EX0=1 */
IP = 0x01; /* INT0 為高優(yōu)先*/
TCON = 0x10 ; /* T0 and INT0 */
TMOD = 0x01; /* T0 方式1 ,定時(shí)器 */
TH0 = 0x3c;
TL0 = 0x0b0;
EA = 1;
}
/******************************************************************/
/******************* initializtion of SJA1000 ****************/
/******************************************************************/
void can_init(void)
{
// while (readSJAreg( CAN_MODE )!= 0x01)
writeSJAreg( CAN_MODE , 0x01 ) ; /* 進(jìn)入復(fù)位模式 */
while (readSJAreg( CAN_CDR )!= 0x88)
writeSJAreg( CAN_CDR , 0x88 ) ; /* 工作在pelican模式,時(shí)鐘關(guān)閉CLOCK OFF */
while( readSJAreg( CAN_RBSA )!= 0x00)
writeSJAreg( CAN_RBSA , 0x00 ); /* 設(shè)置接收緩沖器地址FIFO起始地址為0 */
while( readSJAreg( CAN_OCR )!= 0x1A)
writeSJAreg( CAN_OCR , 0x1A ); /* 推挽輸出 */
while( readSJAreg( CAN_BTR0 )!= 0x02)
writeSJAreg( CAN_BTR0 , 0x02 ); /* BRT0 = 0x01, BRT1 = 0x1c 500kbps */
while( readSJAreg( CAN_BTR1 )!= 0x1c)
writeSJAreg( CAN_BTR1 , 0x1c ); /* 設(shè)置為250kbps BRT0 = 0x03, BRT1 = 0x1c */
while( readSJAreg( CAN_AMR0 )!= 0xff)
writeSJAreg( CAN_AMR0 , 0xff );
while( readSJAreg( CAN_AMR1 )!= 0xff)
writeSJAreg( CAN_AMR1 , 0xff );
while( readSJAreg( CAN_AMR2 )!= 0xff)
writeSJAreg( CAN_AMR2 , 0xff );
while( readSJAreg( CAN_AMR3 )!= 0xff)
writeSJAreg( CAN_AMR3 , 0xff );
while( readSJAreg( CAN_ACR0 )!= 0xff)
writeSJAreg( CAN_ACR0 , 0xff );
while( readSJAreg( CAN_ACR1 )!= 0xff)
writeSJAreg( CAN_ACR1 , 0xff );
while( readSJAreg( CAN_ACR2 )!= 0xff)
writeSJAreg( CAN_ACR2 , 0xff );
while( readSJAreg( CAN_ACR3 )!= 0xff)
writeSJAreg( CAN_ACR3 , 0xff );
while( readSJAreg( CAN_IER )!= 0x01)
writeSJAreg( CAN_IER , 0x01 ); /* 開放,接收中斷,出錯(cuò)報(bào)警,數(shù)據(jù)溢出 */
while( readSJAreg( CAN_TXERR )!= 0x00)
writeSJAreg( CAN_TXERR , 0x00 ); /* 清除發(fā)送錯(cuò)誤計(jì)數(shù)寄存器 */
while( readSJAreg( CAN_RXERR )!= 0x00)
writeSJAreg( CAN_RXERR , 0x00 ); /* 清除接收錯(cuò)誤計(jì)數(shù)寄存器 */
while( readSJAreg( CAN_MODE )!= 0x0c)
writeSJAreg( CAN_MODE , 0x0c ); /* 單向?yàn)V波器,自檢測模式 */
}
/*************************************************************/
/************* 發(fā)送子程序 ****************/
/************* 通過tx_data[]傳參 ****************/
/************* 使用此程序前要預(yù)先將數(shù)據(jù)放入tx_data[]中 ******/
/*************************************************************/
void can_txdata ( )
{
unsigned char i , length ;
sr = CAN_SR;
do{ ;}
while(!(sr^3)) ; /* 判斷上次發(fā)送是否完成,未完成,等待 */
do{ ;}
while(sr^2) ; /* 判斷發(fā)送緩沖器是否鎖定,鎖定,等待 */
// if(sr^1)
// writeSJAreg( CAN_CMR , 0X0C ); /* 清除數(shù)據(jù)溢出 釋放接收緩沖器*/
// do{ can_rxdata ( );}
// while(readSJAreg(29)) ;
switch(tx_data[0]&0xC0)
{
case 0x00: /*標(biāo)準(zhǔn)幀、數(shù)據(jù)幀*/
length = ( tx_data[0] & 0x0f ) ;
if(length>8) length = 8;
length += 3; break ;
case 0x40: /*標(biāo)準(zhǔn)幀、遠(yuǎn)程幀*/
length = 3; break ;
case 0x80: /*擴(kuò)展幀、數(shù)據(jù)幀*/
length = ( tx_data[0] & 0x0f ) ;
if(length>8) length = 8;
length += 5; break ;
case 0xc0: /*擴(kuò)展幀、遠(yuǎn)程幀*/
length = 5; break ;
default: break;
}
for(i=0 ; i<length ; i++)
{
writeSJAreg( 16+i , tx_data[i] );
}
writeSJAreg( CAN_CMR , 0X11 ); /* 啟動(dòng)自收發(fā)*/
// writeSJAreg( CAN_CMR , 0X02 );
ir = readSJAreg( CAN_IR ) ;
}
/*************************************************************/
/************* 接收子程序 ****************/
/************* 將接收到的數(shù)據(jù)存入rx_data[]中 ***********/
/*************************************************************/
void can_rxdata ( void )
{
unsigned char length;
unsigned char i;
rx_data[0] = length = readSJAreg( 16 ) ;
switch(length&0xC0)
{
case 0x00: /*標(biāo)準(zhǔn)幀、數(shù)據(jù)幀*/
length = ( rx_data[0] & 0x0f ) ;
if(length>8) length = 8;
length += 3; break ;
case 0x40: /*標(biāo)準(zhǔn)幀、遠(yuǎn)程幀*/
length = 3; break ;
case 0x80: /*擴(kuò)展幀、數(shù)據(jù)幀*/
length = ( rx_data[0] & 0x0f ) ;
if(length>8) length = 8;
length += 5; break ;
case 0xc0: /*擴(kuò)展幀、遠(yuǎn)程幀*/
length = 5; break ;
default: break;
}
for (i=0;i<length;i++)
{
rx_data[i] = readSJAreg( 16+ i ) ;
}
writeSJAreg( CAN_CMR , 0X0c ); /* 接收完畢,釋放接收緩沖區(qū) */
}
/*********************************************************/
/************* 接收中斷程序 ******************/
/*********************************************************/
void int0() interrupt 0
{
EA = 0 ; /* 關(guān)中斷 */
can_rxdata ( );
getremote =1;
EA = 1 ;
}
/*********************************************************/
/************* 定時(shí)器中斷程序 ******************/
/*********************************************************/
void timer0() interrupt 1
{
EA = 0 ; /* 關(guān)中斷 */
t0count++;
if(t0count>=20)
{
P2 = 0xff;
timer0up = 1;
t0count = 0;
}
if(mytime>=57)
{mytime = 0x2f;}
TH0 = 0x3c;
TL0 = 0xb0;
EA = 1 ;
}
/*********************************************************/
/************* 命令處理程序 ******************/
/*********************************************************/
void dealmessage_remote2( void )
{
char j ;
mytime ++;
for (j=0;j<50;j++);
tx_data[1] = 0x11; /* 上位機(jī)顯示一串2*/
tx_data[2] = 0x11;
tx_data[3] = 0x11;
tx_data[4] = 0x11;
tx_data[5] = 0x12;
tx_data[6] = 0x31;
tx_data[7] = 0x32;
tx_data[8] = 0x37;
tx_data[9] = 0x2E;
tx_data[10] = 0x32;
tx_data[11] = 0x32;
tx_data[12] = 0x54;
can_txdata ( );
for (j=0;j<50;j++);
tx_data[5] = 0x22;
tx_data[6] = 0x31;
tx_data[7] = 0x32;
tx_data[8] = 0x37;
tx_data[9] = 0x2e;
tx_data[10] = 0x37;
tx_data[11] = mytime;
tx_data[12] = 0x4D;
can_txdata ( );
}
main ()
{ char i,j ,temp=0;
for(i=0;i<255;i++)
for (j=0;j<255;j++);
for(i=0;i<255;i++)
for (j=0;j<255;j++);
cpu_init();
P2 =0xc0; /*硬件復(fù)位SJA1000*/
for (j=0;j<100;j++);
P2 =0xff;
can_init( ) ;
writeSJAreg( CAN_TEST , 0xaa );
temp = readSJAreg( CAN_TEST ) ;
writeSJAreg( CAN_TEST , 0x55 );
temp = readSJAreg( CAN_TEST ) ;
getremote =0;
mytime = 0x2f;
for (j=0;j<255;j++);
while(1)
{
// can_txdata ( );
// can_txdata ( ) ;
/// can_txdata ( ) ;
if(getremote) //(timer0up)&&
{
if( 0x11 == rx_data[1])
{
switch(rx_data[0]&0xC0)
{
case 0x00: /*標(biāo)準(zhǔn)幀、數(shù)據(jù)幀*/
break ;
case 0x40: /*標(biāo)準(zhǔn)幀、遠(yuǎn)程幀*/
break ;
case 0x80: /*擴(kuò)展幀、數(shù)據(jù)幀*/
break ;
case 0xc0: /*擴(kuò)展幀、遠(yuǎn)程幀*/
dealmessage_remote2();
P2 = 0x60; /*點(diǎn)發(fā)光二極管*/
break ;
default: break;
}
}
getremote = 0 ;
}
if(timer0up)
{
// dealmessage_remote();
dealmessage_remote2();
timer0up =0;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -