如何一步一步建立CAN通訊
CAN通訊的優點在此就不多說了,10公里,5Kb/s的速度是能保證的。第一步:硬件環境的建立。這里采用的是SJA1000作為總線控制器,CTM8251模塊作為總線驅動器。MCU采用的是MEGA16:利用I/O口模擬數據總線,當然也可以使用有總線的MCU:MCS-51,MEGA8515等。原理圖如下:第二步:SJA1000的控制首先閱讀下SJA1000的手冊,基本了解下SJA1000的結構,主要是寄存器方面的。還要了解下CAN總線方面的東西:BasicCAN,Peli CAN,遠程幀,數據幀等等……SJA1000工作之前需要配置一下,才能正常工作,沒有經過配置的SJA1000回拉壞總線的:組成網絡的時候,如果其中有的SJA1000沒有正確配置,這個設備會干擾總線,使其它設備的數據發送不出去。怎么才能控制SJA1000呢,請看下面的SJA1000讀寫的時序圖:寫的時序根據時序要求,可以利用I/O口模擬總線了://**************************讀SJA1000*************************//uint Read_SJA1000(uint address){uchar data;asm("nop");ALE_off;WR_on;RD_on;CAN_cs_on;DDRA=0xff; //數據口為輸出PORTA=address; //輸出數據的地址asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //數據口為輸出PORTA=address; //輸出數據的地址 //再次輸出地址,確保一致。asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;RD_off;asm("nop");//delay5us(2);asm("nop");DDRA=0x00; //數據口為輸入PORTA=0xff; //上拉asm("nop");data=PINA; //獲得數據asm("nop");//delay5us(1);RD_on;CAN_cs_on;asm("nop");//delay5us(2);//dog();return data;}//**************************寫SJA10000*************************//void Write_SJA1000(uint address,uint data){ asm("nop");//uint temp1,temp2;DDRA=0xff; //數據口為輸出PORTA=address; //輸出數據的地址CAN_cs_on;ALE_off;WR_on;RD_on;asm("nop");//delay5us(1);ALE_on;asm("nop");//delay5us(1);//DDRA=0xff; //數據口為輸出PORTA=address; //輸出數據的地址 再次輸出地址,確保數據準確asm("nop");//delay5us(1);ALE_off;//delay5us(1);CAN_cs_off;WR_off;asm("nop");//delay5us(1);asm("nop");//DDRA=0xff;PORTA=data; //輸出數據asm("nop");//delay5us(2);WR_on;PORTA=data; //再次輸出數據,取保一致CAN_cs_on;asm("nop");//delay5us(2);asm("nop");//dog();}現在可以讀寫SJA1000了。配置SJA1000需要使SJA1000進入復位模式,然后對一些寄存器寫入數據。在這里,CAN使用Pelican模式,速率為5K,雙濾波工作,//*************************CAN復位初始化********************//void CAN_Init(void){ uchar i_temp=0,j_temp=0;CLI();//Read_SJA1000(CAN_IR); //讀中斷寄存器,清除中斷位Write_SJA1000(CAN_MOD,0x01);while(!(Read_SJA1000(CAN_MOD)&0x01))//保證進入復位模式,bit0.0不為1,再寫CAN_MOD{Write_SJA1000(CAN_MOD,0x01);dog();}Write_SJA1000(CAN_CDR,0xc8); //配置時鐘分頻寄存器-Pelican,CBP=1,//關閉TX1中斷與時鐘輸出Write_SJA1000(CAN_AMR0,0xff); //配置驗收屏蔽AMR0=0FFHWrite_SJA1000(CAN_AMR1,0x00); //配置驗收屏蔽AMR1=000HWrite_SJA1000(CAN_AMR2,0xff); //配置驗收屏蔽AMR2=0FFHWrite_SJA1000(CAN_AMR3,0x00); //配置驗收屏蔽AMR3=000HWrite_SJA1000(CAN_ACR1,0x00); //配置驗收代碼ACR1=0:廣播Write_SJA1000(CAN_ACR3,addr); //配置驗收代碼ACR3=地址Write_SJA1000(CAN_BTR0,0x7f); //配置總線定時--5kbpsWrite_SJA1000(CAN_BTR1,0xff);Write_SJA1000(CAN_OCR,0x1a); //配置輸出控制Write_SJA1000(CAN_EWLR,0xff); //配置錯誤報警限制為255do{Write_SJA1000(CAN_MOD,0x00); //進入工作模式雙濾波dog();}while((Read_SJA1000(CAN_MOD))&0x01); // 確認復位標志是否被刪除Write_SJA1000(CAN_TXB+4,ID3); //配置發送緩沖區的ID3-Write_SJA1000(CAN_IER,0x07); //配置SJA10000中斷-錯誤報警/發送/接收中斷SEI();}在這之前,需要獲取設備的地址,就是讀取撥碼開關各個腳的電平。需要注意的是,SJA1000使用的是雙濾波模式,響應地址有:廣播的:0x00,還有自己的地址:0x**。為什么要這么做呢,一個系統中,主機的地址一般是0X00,從機地址從0X01開始,這里面如果有兩個從機的地址一樣,就很可能產生一些混亂。從機一旦多了起來,查找地址相同的設備就有些麻煩了。在程序的初始化的時候,進行SJA1000的配置。第三部:工作程序接下來,做的工作就是CAN試發送,別小看這個試發送,這可是解決地址重復的問題的哦,還能檢測CAN網絡是否正常。//****************CAN第一次發送 通訊地址測試2e*****************//void CAN_first_send(void){ //uchar add_temp=0;uchar a_temp=0;uchar SR_temp;asm("nop"); //延時NET_LED_on; //打開網絡燈do{a_temp=Read_SJA1000(CAN_SR);//讀CAN_SR,直到SR.2=1:CPU可以發送數據dog();}while(!(a_temp&0x04))CLI(); //關CAN中斷,即總中斷Write_SJA1000(CAN_TXB+0,0xc0); //發送遠程幀0xc0Write_SJA1000(CAN_TXB+1,0x00); //發送轉接器地址Write_SJA1000(CAN_TXB+2,addr); //發送傳感器地址Write_SJA1000(CAN_TXB+3,0x2e); //發送命令碼0x2eWrite_SJA1000(CAN_TXB+4,ID3); //發送ID3Write_SJA1000(CAN_CMR,0x01); //啟動發送,//網絡故障錯誤在中斷中處理,短接H、L,按復位,先亮綠燈,后黃燈亮asm("nop");//SEI();}SJA1000的中斷引腳接到MEGA16的INT1上,需要在程序初始化的時候,配置一些INT1,使MCU能響應SJA1000的中斷。數據發送前,點亮網絡指示燈,什么時候熄滅它呢,在發送中斷中熄滅它。下面看看MCU對SJA1000中斷的一些處理:在這里只處理:接收中斷、發送中斷、總線關閉中斷。#pragma interrupt_handler can_int:3void can_int(void){asm("nop");CAN_IR_temp=Read_SJA1000(CAN_IR); //讀取中斷寄存器if(CAN_IR_temp&0x01) //接收中斷{Get_RXB_temp();if(RxBuffer[0]==0x80) //地址測試數據幀{reload(); //數據幀中有和自己相同的地址}if(RxBuffer[0]==0xc0) // 遠程幀則釋放接收緩沖區{type=RxBuffer[3]; //讀命令碼//處理命令碼if(type==0x30){ if(type==0x34){CAN_now_value_send();type=0;} //傳瞬時值數據if (type==0x27){reload(); type=0;}//裝置復位if(type==0x2e){active();type=0;} //通訊地址測試}Write_SJA1000(CAN_CMR,0x04); //釋放接收緩沖區}if(CAN_IR_temp&0x02) //發送中斷{NET_LED_off; //關閉網絡燈ERR_LED_off; //關閉故障燈CANBE_JSQ=0; //復位總線關閉計數器asm("nop");}if(CAN_IR_temp&0x04) //錯誤報警中斷(僅有總線關閉處理){ //讀狀態寄存器,SR.7總線關閉:CAN控制器不參與總線活動CAN_SR_temp=Read_SJA1000(CAN_SR);if(CAN_SR_temp&0x80){CANBE_JSQ=CANBE_JSQ+1; //關閉次數加1if(CANBE_JSQ
關鍵詞: CAN通訊硬件環
您可能也感興趣:
為您推薦
貸款370萬元買保險?消費者需當心有人盯上你的保單
銀保監會要求保險機構提升農業保險保障水平 發展特色農產品保險
湖北省棉花“保險+期貨”項目落地三縣市 5萬棉農將成為受益者
排行
最近更新
- 如何一步一步建立CAN通訊
- 自己動手DIY制作LED顯示屏
- 無損檢測工藝概述
- ISim你不得不知的技巧
- avr單片機流水燈匯編程序及電路圖
- 酷比魔方U30GT雙核豌豆拆解
- 工信部:支持工業互聯網企業首次公開發行證券并上市
- 廣鐵警方破獲一起販運假冒偽劣香煙的非法經營案
- 國產原研1類新藥安羅替尼獲批治療晚期等甲狀腺癌患者
- 中國藥企自主研發創新藥獲批 造福反流性食管炎患者
- 國常會連續兩周重磅定調,降準時點臨近了?
- 招商蛇口10億元債券將于4月14日付息
- 正榮地產ABS展期方案引多方博弈,管理人中山證券債券承銷業務...
- 人參泡酒用什么酒最好
- 人參和什么搭配泡酒最好
- 核酸檢測有效期怎么計算
- 2022年4月13日,昆明二環西路383號門口(鈺文美容養生會所旁...
- 為癌癥藥物研發帶來新契機,上海科學家發現前所未有的“受體...
- 時政深一度|人工智能會搶醫生“飯碗”嗎?
- 價位大降!4月20日周口開始執行
- (聚焦疫情防控)江蘇發布公鐵水空通道清單 保障產業鏈供應...
- 盛唐遺址大明宮的春暖花開
- 手繪三江源野生動物:是誰在雪山之巔唱著孤獨的歌?
- 云游嶗山:超多美圖來襲~海大櫻花,開啦!
- 家居裝修,墻面應該如何裝飾
- 重慶體育人 | 巴南鄧雅方:堅持運動20余年,積極組織社區體育活動
- 競技體育改革發展 | 北碚:西大附中武術隊練就文武雙全真功夫
- 微評|“死店”被做活?/“暴汗服”減肥?/“堿性水”更健康?
- 解讀螺原體
- 鎮巴人社局赴陜西廣濟堂醫藥集團股份有限公司開展招商引資活動