




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-.z.一、以下是我做的CAN節(jié)點(diǎn)的測(cè)試程序,實(shí)現(xiàn)兩個(gè)節(jié)點(diǎn)傳送數(shù)據(jù),程序主要分三局部SJA1000的初始化,接收數(shù)據(jù),發(fā)送數(shù)據(jù)./****************************************************
**函數(shù)原型:
bitSja_1000_Init(void)
**功
能:
初始化SJA10000
**入口參數(shù):
無(wú)
**返回值:
0:初始化成功
1:復(fù)位失敗
2:
測(cè)試sja1000失敗
3:設(shè)置失敗
4:設(shè)置驗(yàn)收濾波器失敗
5:設(shè)置波特率失敗
*****************************************************/unsignedcharSja_1000_Init(void)
{
bits;
EA=0;
s=BCAN_ENTER_RETMODEL();
if(s==1)return1;
s=BCAN_CREATE_COMMUNATION();
if(s==1)return2;
s=BCAN_SET_OUTCLK(0*c0);//Pelican
if(s==1)return3;
s=BCAN_SET_OBJECT(0*FF,0*4E,0*16,0*00,0*ff,0*00,0*00,0*00);
if(s==1)return4;
s=BCAN_SET_BANDRATE(CAN_BPS_1M);
if(s==1)return5;
SJA_BCANAdr=REG_OCR;
*SJA_BCANAdr=0*1a;
SJA_BCANAdr=REG_IER;
*SJA_BCANAdr=0*03;
s=BCAN_SET_CONTROL(0*08);
if(s==1)return6;EA=1;
return0;
}}
/********************************************************************
*函數(shù)原型:bitBCAN_SET_OUTCLK(unsignedcharClock_Out)
*
*參數(shù)說(shuō)明:
*
*
Clock_Out:存放時(shí)鐘分頻存放器(CDR)的參數(shù)設(shè)置
*
*返回值:
*
*
0;設(shè)置成功
*
*
1;設(shè)置失敗
*
*說(shuō)明:設(shè)置SJA1000的時(shí)鐘分頻。該子程序只能用于復(fù)位模式
*******************************************************************/
bitBCAN_SET_OUTCLK(unsignedcharClock_Out)
{
SJA_BCANAdr=REG_CDR;
*SJA_BCANAdr=Clock_Out;
if(*SJA_BCANAdr!=Clock_Out)
return1;
else
return0;
}/********************************************************************
*函數(shù)原型:bitBCAN_SET_OBJECT(unsignedchar
BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,
BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3
)
*參數(shù)說(shuō)明:
*
*
BCAN_ACR(0-3):存放驗(yàn)收代碼存放器〔ACR〕的參數(shù)設(shè)置
*
*
BCAN_AMR(0-3):存放接收屏蔽存放器〔AMR〕的參數(shù)設(shè)置
*
*返回值:
*
*
0;設(shè)置成功
*
*
1;設(shè)置失敗
*
*說(shuō)明:設(shè)置CAN節(jié)點(diǎn)的通訊對(duì)象,允許接收的報(bào)文,是由AMR和ACR共同決定的.
*
********************************************************************/
bitBCAN_SET_OBJECT(unsignedchar
BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3)
{
SJA_BCANAdr=REG_T*Buffer1;
*SJA_BCANAdr=BCAN_ACR0;
//寫(xiě)入?yún)?shù)
SJA_BCANAdr=REG_T*Buffer2;
*SJA_BCANAdr=BCAN_ACR1;
SJA_BCANAdr=REG_T*Buffer3;
*SJA_BCANAdr=BCAN_ACR2;
SJA_BCANAdr=REG_T*Buffer4;
*SJA_BCANAdr=BCAN_ACR3;
//校驗(yàn)寫(xiě)入值
if(*SJA_BCANAdr!=BCAN_ACR3)
return1;
SJA_BCANAdr=REG_T*Buffer5;
*SJA_BCANAdr=BCAN_AMR0;
//寫(xiě)入?yún)?shù)
SJA_BCANAdr=REG_T*Buffer6;
*SJA_BCANAdr=BCAN_AMR1;
SJA_BCANAdr=REG_T*Buffer7;
*SJA_BCANAdr=BCAN_AMR2;
SJA_BCANAdr=REG_T*Buffer8;
*SJA_BCANAdr=BCAN_AMR3;
//校驗(yàn)寫(xiě)入值
if(*SJA_BCANAdr!=BCAN_AMR3)return1;
return0;
}Hz,
*
;*
其它晶體的頻率的值的波特率,需自己計(jì)算。該子程序只能用于
*
;*
復(fù)位模式
*
;******************************************************************/
bitBCAN_SET_BANDRATE(unsignedintCAN_ByteRate)
{
//將波特率的的預(yù)設(shè)值裝入sja1000的總線(xiàn)定時(shí)器
SJA_BCANAdr=REG_BTR0;
*SJA_BCANAdr=CAN_ByteRate>>8;
//取CAN_ByteRate的高8位寫(xiě)入寫(xiě)入?yún)?shù)
//校驗(yàn)寫(xiě)入值
if(*SJA_BCANAdr!=(CAN_ByteRate>>8))return1;
SJA_BCANAdr=REG_BTR1;
*SJA_BCANAdr=CAN_ByteRate;
//校驗(yàn)寫(xiě)入值
if(*SJA_BCANAdr!=CAN_ByteRate)return1;
return0;
}
/********************************************************************
*函數(shù)原型:bitBCAN_SET_CONTROL(unsigendcharCMD)
*
*參數(shù)說(shuō)明:設(shè)置控制存放器
*
*******************************************************************/
bitBCAN_SET_CONTROL(unsignedcharCMD)
{
unsignedcharTempData;
SJA_BCANAdr=REG_CONTROL;
//SJA_BaseAdr+0*00
控制存放器
TempData=
*SJA_BCANAdr;
*SJA_BCANAdr=CMD;
if(*SJA_BCANAdr==CMD)
return0;
else
return1;}
/********************************************************************
*函數(shù)原型:
bit
BCAN_CREATE_COMMUNATION(void)
*
*參數(shù)說(shuō)明:
無(wú)
*
*返回值:
*
*
0;表示SJA1000接口正常
*
*
1;表示SJA1000與處理器接口不正常
*
*說(shuō)明:該函數(shù)用于檢測(cè)CAN控制器的接口是否正常
*
*******************************************************************/
bitBCAN_CREATE_COMMUNATION(void)
{
SJA_BCANAdr=REG_TEST;
*SJA_BCANAdr=0*aa;
//寫(xiě)入測(cè)試值
if(*SJA_BCANAdr==0*aa)
return0;
//讀測(cè)試正確
else
return1;
}
/******************************************************************
*函數(shù)原型:
bit
BCAN_ENTER_RETMODEL(void)
*
*參數(shù)說(shuō)明:
無(wú)
*
*返回值:
*
*
0;表示成功進(jìn)入復(fù)位工作模式
*
*
1;表示不能進(jìn)入復(fù)位工作模式
*
*
*
*說(shuō)明:
CAN控制器進(jìn)入復(fù)位工作模式
*
*******************************************************************/
bit
BCAN_ENTER_RETMODEL(void)
//置位復(fù)位請(qǐng)求
{
unsigned
char
TempData;
SJA_BCANAdr
=REG_CONTROL;
TempData=
*SJA_BCANAdr;
*SJA_BCANAdr=0*01;
//置位復(fù)位請(qǐng)求
if((*SJA_BCANAdr&0*01)==1)
return
0;
else
return
1;
}/****************************************************
**函數(shù)原型:
voide*0_int(void)interrupt0//using1
**功
能:
中斷接收函數(shù)
**入口參數(shù):
無(wú)
**出口參數(shù):
RevceData[]數(shù)組
**說(shuō)
明:
當(dāng)sja1000收到正確的報(bào)文時(shí),會(huì)產(chǎn)生int中斷
*****************************************************/
voide*0_int(void)interrupt0//using1
{
unsignedchartt;
SJA_BCANAdr=REG_INTERRUPT;
if((*SJA_BCANAdr)&0*01)
//產(chǎn)生了接收中斷
{
SJA_BCANAdr=REG_R*Buffer1;
tt=*SJA_BCANAdr;
if((tt&0*40)!=0*40)//數(shù)據(jù)幀
=為遠(yuǎn)程幀
{
memcpy(REG_R*Buffer6,RevceData,8);
send_char_(RevceData[1]);//以下代碼是發(fā)送到串口
send_char_(RevceData[2]);
send_char_(RevceData[3]);
send_char_(RevceData[4]);
send_char_(RevceData[5]);
send_char_(RevceData[6]);
send_char_(RevceData[7]);
send_char_(RevceData[8]);
}
BCAN_CMD_PRG(4);//釋放SJA1000接收緩沖區(qū)
}
}
unsignedcharBCAN_DATA_WRITE(unsignedchar*SendDataBuf)
{
unsignedchartemp;
SJA_BCANAdr=REG_STATUS;
temp=*SJA_BCANAdr;
if((temp&0*08)==0)return
1;
//上次發(fā)送未完成
if((temp&0*04)==0)return
2;
//發(fā)送緩沖區(qū)是否鎖定
if((temp&0*10)==0*10)return3;
//判斷是否正在接收
SJA_BCANAdr=REG_T*Buffer1;
//訪(fǎng)問(wèn)地址指向發(fā)送緩沖區(qū)1
memcpy(SJA_BCANAdr,SendDataBuf,13);
BCAN_CMD_PRG(0*03);
return0;
}
bit
BCAN_CMD_PRG(unsignedcharcmd)
{
SJA_BCANAdr=REG_COMMAND;
//訪(fǎng)問(wèn)地址指向命令存放器
*SJA_BCANAdr=cmd;
//啟動(dòng)命令字
switch(cmd)
{
case
TR_CMD:
return
0;
break;
case
SRR_CMD:
return
0;
break;
case
AT_CMD:
SJA_BCANAdr=REG_STATUS;
//訪(fǎng)問(wèn)地址指向狀態(tài)存放器
if((*SJA_BCANAdr&0*20)==0)//判斷是否正在發(fā)送
return
0;
else
return
1;
break;
case
RRB_CMD:
SJA_BCANAdr=REG_STATUS;
//訪(fǎng)問(wèn)地址指向狀態(tài)存放器
if((*SJA_BCANAdr&0*01)==1)
return
1;
else
return
0;
break;
case
COS_CMD:
SJA_BCANAdr=REG_STATUS;
if((*SJA_BCANAdr&0*02)==0)//判斷去除超載是否成功
return
0;
else
return
1;
break;
default:
return
1;
break;
}
}主程序局部:voidmain(void)
{
unsignedchartemptt,ss;
CS=0;
Init_Cpu();
EA=0;
//initializeSja1000
ss=Sja_1000_Init();
if(ss!=0)//初始化失敗
send_string_("initfail!");
else
EA=1;//初始化成功,開(kāi)中斷
RECOK=0;
send_data[0]=Send_CAN_Info_ID[0];
send_data[1]=Send_CAN_Info_ID[1];
send_data[2]=Send_CAN_Info_ID[2];
send_data[3]=Send_CAN_Info_ID[3];
send_data[4]=Send_CAN_Info_ID[4];
while(1)
{
SJA_BCANAdr=REG_STATUS;
temptt=*SJA_BCANAdr;
if((temptt&0*40)==0*40)
{
Sja_1000_Init();
send_char_(0*ee);
}
if(RECOK==1)
{
RECOK=0;
SJA_BCANAdr=REG_STATUS;
temptt=*SJA_BCANAdr;
if((temptt&0*04)==0*04)//可以向發(fā)送緩沖器寫(xiě)數(shù)據(jù)
{
send_data[5]=Com_RecBuff[0];
send_data[6]=Com_RecBuff[1];
send_data[7]=Com_RecBuff[2];
send_data[8]=Com_RecBuff[3];
send_data[9]=Com_RecBuff[4];
send_data[10]=Com_RecBuff[5];
send_data[11]=Com_RecBuff[6];
send_data[12]=Com_RecBuff[7];
ss=BCAN_DATA_WRITE(send_data);
if(ss==0)
//發(fā)送正常
send_char_(0*11);
else
{
send_char_(0*FF);
send_char_(ss);
SJA_BCANAdr=REG_ECC;
send_char_(*SJA_BCANAdr);
}
}
}}
}二、can總線(xiàn)通訊程序〔c〕
sja1000nnyt原創(chuàng)經(jīng)典,如需更多幫助,請(qǐng)聯(lián)系我:(短信聯(lián)系,QQ詳談)QQ:531706356Email:nnyttom.本人同時(shí)提供can實(shí)驗(yàn)開(kāi)發(fā)板給初學(xué)者1CAN控制器為SJA1000,驅(qū)動(dòng)器為T(mén)JA1050,電源隔離;2提供詳盡的源程序,可根據(jù)用戶(hù)需求編寫(xiě)程序#include<REG52.H>//單片機(jī)頭文件#include<SJA_nnyt_BCANCONF.H>//SJA存儲(chǔ)器定義頭文件#include<SJA_nnyt_BCANFUNC.C>//SJA子程序文件/*************************函數(shù)聲明*******************************/voidInit_T0(void);//初始化單片機(jī)T0voidSja_1000_Init(void);//初始化SJA//*******************************************************************bitflag_sec;//發(fā)送命令標(biāo)志unsignedchardatasend_data[10],rcv_data[10];//發(fā)送和接收數(shù)組unsignedcharsec_data,second;//定時(shí)器記數(shù)變量,發(fā)送數(shù)據(jù)變量unsignedchardataTmod_data;//定時(shí)器T0工作方式變量unsignedcharbdataflag_init;//中斷存放器數(shù)據(jù)保存變量sbitrcv_flag=flag_init^0;//接收中斷標(biāo)志sbiterr_flag=flag_init^2;//錯(cuò)誤中斷標(biāo)志sbitP2_0=P2^0;sbitP3_4=P3^4;sbitLED=P3^5;//指示燈//***********************************************************voide*0_int(void)interrupt0using1//外部中斷0{ SJA_BCANAdr=REG_INTERRUPT;//指針指向中斷存放器 flag_init=*SJA_BCANAdr;//保持中斷存放器值}//***********************************************************voidT0_int(void)interrupt1using2//定時(shí)器T0中斷效勞子程序{ TR0=0;//關(guān)閉定時(shí)器T0 sec_data--;//秒計(jì)時(shí)變量減一秒時(shí)間到了嗎" { sec_data=0*50;//重新賦值 TH0=0*80; TL0=0*60; flag_sec=1;//設(shè)置標(biāo)志位 second++;//發(fā)送的數(shù)據(jù)加一 } TR0=1;//啟動(dòng)定時(shí)器T0}//************************************************************voidInit_T0(void)//初始化定時(shí)器0{Tmod_data=TMOD;Tmod_data&=0*f0;Tmod_data|=0*01;TMOD=Tmod_data;//定時(shí)器T0工作方式設(shè)置TH0=0*80;TL0=0*60;//定時(shí)器T0初值設(shè)置TR0=1;//開(kāi)放定時(shí)器T0sec_data=0*20;//記數(shù)值設(shè)置second=0*00;//發(fā)送數(shù)據(jù)初始化清零}//***********************************************************voidSja_1000_Init(void){ BCAN_ENTER_RETMODEL();//進(jìn)入復(fù)位 BCAN_SET_BANDRATE(0*0b);//800K BCAN_SET_OBJECT(0*aa,0*ff);//設(shè)置地址ID:557 BCAN_SET_OUTCLK(0*aa,0*48);//設(shè)置輸出方式,制止COLOCKOUT輸出 BCAN_QUIT_RETMODEL();//退出復(fù)位模式 SJA_BCANAdr=REG_CONTROL;//地址指針指向控制存放器
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZHHX 004-2024 粉苞酸腳桿盆花生產(chǎn)技術(shù)規(guī)范
- 二零二五年度員工宿舍入住與退宿手續(xù)協(xié)議
- 2025年度水利工程監(jiān)理工程師合同管理與可持續(xù)發(fā)展
- 二零二五年度商鋪經(jīng)營(yíng)權(quán)放棄及轉(zhuǎn)讓協(xié)議書(shū)
- 二零二五年度酒吧租賃合同書(shū)
- 2025年度潤(rùn)滑油行業(yè)年度銷(xiāo)售排行榜合作合同
- 2025年度機(jī)關(guān)單位食堂餐飲培訓(xùn)與咨詢(xún)服務(wù)合同
- 二零二五年度夫妻婚內(nèi)財(cái)產(chǎn)約定及家庭財(cái)務(wù)顧問(wèn)服務(wù)協(xié)議
- 二零二五年度智慧城市項(xiàng)目實(shí)施團(tuán)隊(duì)勞動(dòng)合同
- 二零二五年度企業(yè)稅收籌劃與稅務(wù)籌劃培訓(xùn)與實(shí)施合同
- 有關(guān)李白的故事9篇
- 對(duì)建筑工程施工轉(zhuǎn)包違法分包等違法行為認(rèn)定查處管理課件
- 營(yíng)養(yǎng)性缺鐵性貧血患兒的護(hù)理 (兒童護(hù)理課件)
- 八大問(wèn)題性肌膚培訓(xùn)課件
- 記敘的順序超實(shí)用課件
- 二年級(jí)下學(xué)期家長(zhǎng)會(huì)班主任發(fā)言稿張課件
- 個(gè)人理財(cái)(第三版)第01章導(dǎo)論
- 鉆機(jī)交接班記錄表
- 全國(guó)初中數(shù)學(xué)聯(lián)賽試題30套
- IATF16949質(zhì)量體系基礎(chǔ)知識(shí)培訓(xùn)
- 內(nèi)科學(xué)-高血壓病
評(píng)論
0/150
提交評(píng)論