当前位置 - 股票行情交易網 - 財經資訊 - 求CAN總線調試成功的代碼,芯片是SJA1000和TJA1050

求CAN總線調試成功的代碼,芯片是SJA1000和TJA1050

初始化子程序CANINIT()

選用CAN2. 0協議構建CAN總線控制網絡,對SJA1000的初始化主要包括工作方式的設置、驗收代碼寄存器ACR、驗收屏蔽寄存器AMR、波特率的參數設置等。

void caninit(void) /*SJA1000的初始化子函數*/

{control = 1; /*禁止超載、出錯及接收中斷,並置復位請求位使其進入復位狀態*/

while (control&0x01== 0);

acceptancecode = 0x01; /*驗收碼寄存器(存機號1號)*/

acceptancemask= 0xfe ; /*驗收屏蔽碼寄存器*/

bustiming0= 0x03; /*總線定時寄存器0,同步跳轉寬度

T0= T,BPS= 125 k*/

bustiming1= 0x18; /*總線定時寄存器1,T1= 9T,T2=2T,波特率為500kbit/S*/

outputcontrol = 0x1A; /*正常輸出方式,TX1引腳懸浮*/

clockdivider = 0x40; /*BASICCAN模式,RX1接固定電平*/

control = 0x1A; /*清復位請求,使其進入工作狀態*/

}

發送cansend()

發送子程序負責節點報文的發送,由CAN控制器SJA1000獨立完成,將命令寄存器裏的發送請求標誌置位,即可發送SJA1000發送緩沖區中的報文。

void cansend(unsigned char ID ,char*xdata) /*該子函數完成壹幀數據的發送*/

{while ( (status&0x10)>> 4 == 1)NOP; /*檢查上次請求發送是否完成*/

while ( (status&0x04)>> 2== 0)NOP;

Transmitbuffer1= ID;

Transmitbuffer2= 0x08;

Transmitbuffer3= txdata[0] ;

Transmitbuffer10= txdata[7] ;

Command = 0x05 ; /*發送請求*/

while ( (status&0x08)>> 3== 0);

}

接收子程序canreceive ()

接收子程序負責節點報文的接收。SJA1000自動接收發往該節點的數據並將收到的數據放到它的接收緩沖器中。

SJA1000的報文接收主要有2種方式:中斷接收方式和查詢接收方式。系統采用的是中斷接收方式。

{unsigned char ir ;

ir = interrupt; /*獲得SJA1000的中斷狀態*/

EA= 0;

If ( (ir&0x04)>> 2== 1)error ( ); /*如果是出錯中斷,則調出錯處理函數*/

If ( (ir&0x08)>> 3== 1)overruN( ); /*如果是超載中斷,則調超載處理函數*/

While ( ( (ir&0x04)>> 2== 1)‖( ( (ir&0x08)>> 3)== 1){NOP;}

RxID[0] = Receivebuffer1;

RxID[0] = Receivebuffer2;

If ( ( (Receivebuffer2&0x10)>> 4)== 0) /*如果是數據幀,則接收數據*/

{Rxdata[0] = Receivebuffer3;

.

Rxdata[7] = Receivebuffer10;

Command = 0x04 ; /*SJA1000的接收緩存器被釋放*/

}

else if ( ( (Receivebuffer2&0x10)>> 4)== 1) /*如果是遠程幀,則作相應處理*/

{ /*相應處理程序*/

EA= 1;

}

}