成人精品水蜜桃_成人在线丰满少妇av_91亚洲国产高清_欧美日韩免费区域视频在线观看

首頁 新聞 > 科技 > 正文

如何一步一步建立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=CANBE_C) //總線關閉次數到達設定次數{NET_LED_off; //關閉網絡燈ERR_LED_on; //打開故障燈CANBE_JSQ=0; //復位總線關閉計數器do{Write_SJA1000(CAN_MOD,0x00); //重新進入工作模式}while((Read_SJA1000(CAN_MOD))&0x01);//等待進入工作模式Write_SJA1000(CAN_CMR,0x01); //啟動CAN重新發送CANBE_JSQ=CANBE_C; //防止CANBE_JSQ溢出}}asm("nop");}}中斷程序中,對命令碼等于0x2e的處理程序是:active();active()程序如下://************************通訊地址測試2EH***********************//void active(void){uchar temp1,temp2;asm("nop"); //延時NET_LED_on; //打開網絡燈CLI(); //關CAN中斷,即總中斷do{temp1=Read_SJA1000(CAN_SR);//讀CAN_SR,直到SR.2=1:CPU可以發送數據dog();}while(!(temp1&0x04));Write_SJA1000(CAN_TXB+0,0x80); //發送數據幀0x80temp2=Read_SJA1000(CAN_RXB+1);Write_SJA1000(CAN_TXB+1,temp2); //發送轉接器地址Write_SJA1000(CAN_TXB+2,addr); //發送傳感器地址Write_SJA1000(CAN_TXB+3,0x2e); //發送命令碼0x2eWrite_SJA1000(CAN_TXB+4,ID3); //發送ID3Write_SJA1000(CAN_CMR,0x01); //啟動發送SEI(); //開中斷asm("nop");}大家仔細看看 active()程序的內容,發送了一個沒有數據的數據幀:0X80,再回過頭看看中斷處理函數,里面有這段程序, if(RxBuffer[0]==0x80) //地址測試數據幀{reload(); //數據幀中有和自己相同的地址}reload(); 程序很簡單,就是停止喂狗,等待復位。復位之后呢,它會進行試發送,哈哈,接下來的兩個地址相同的設備就“打架”起來了,現象就是一個設備不斷復位,一個設備通訊燈不斷閃爍。怎么樣,很容易就判斷出哪兩個地址重復了。命令碼等于0x27時,設備復位,一般是主機發送這個遠程幀。0x34時,發送數據://************************瞬時值發送 34H*********************//void CAN_now_value_send(void){//uchar a_temp=0;uchar c_temp=0;js_now_send_value(); //計算需要發送的瞬間數值asm("nop"); //延時NET_LED_on; //打開網絡燈do{b_temp=Read_SJA1000(CAN_SR); //讀CAN_SR,直到SR.2=1:CPU可以發送數據dog();}while(!(b_temp&0x04))CLI(); //關CAN中斷,即總中斷Write_SJA1000(CAN_TXB+0,0x84); //發送數據幀0x84Write_SJA1000(CAN_TXB+1,RxBuffer[1]); //發送轉接器地址Write_SJA1000(CAN_TXB+2,addr); //發送傳感器地址Write_SJA1000(CAN_TXB+3,0x34); //發送命令碼0x34Write_SJA1000(CAN_TXB+4,ID3); //發送ID3Write_SJA1000(CAN_TXB+5,CBDJ_Send_L); //Write_SJA1000(CAN_TXB+6,CBDJ_Send_H); //Write_SJA1000(CAN_TXB+7,GD_Send_L); //Write_SJA1000(CAN_TXB+8,GD_Send_H); //Write_SJA1000(CAN_CMR,0x01); //啟動發送SEI(); //開中斷asm("nop");}發送了一個數據幀,這個數據幀有四字節的數據。CAN的數據幀最多支持有8個字節的數據幀,如果數據較多,可以分為多個數據幀,在命令碼里面區分這些數據幀。第四步:建立自己的CAN通訊網絡。主機可以是一臺有CAN接口的計算機,一般在計算機上裝一個CAN接口卡,有ISA接口的,比如PCL-841;PCI接口的。CAN卡的銷售商都會提供驅動,依靠驅動里面的函數,來控制CAN卡,此項不是專長,不好多說,反正就是這個思路。好了,昨天從南京回來的路上,就考慮發個CAN的東西。咱們這個論壇,目前還沒有多少關于CAN的帖子,意在拋磚引玉…………本壇高手很多,尤其是有很多潛水的高高手~~~~--------------------程序中的一些DEFINE//******************引腳信號定義***************************//#define CS_1 (PORTB|= (1<<4 )) //AD7705片選#define CS_0 (PORTB&= ~(1<<4 ))#define DRDY (PINB&0x08) //AD轉換DRDY信號輸入#define NET_LED_off (PORTB|= (1<<0 )) //網絡故障燈高電平,熄滅#define NET_LED_on (PORTB&= ~(1<<0 )) //網絡故障燈低電平,點亮#define ERR_LED_off (PORTB|= (1<<1 )) //裝置故障燈高電平,熄滅#define ERR_LED_on (PORTB&= ~(1<<1 )) //裝置故障燈低電平,點亮#define DOG_on (PORTB|= (1<<2 )) //看門狗高#define DOG_off (PORTB&= ~(1<<2 )) //看門狗低#define WR_on (PORTD|= (1<<0 )) //WR高#define WR_off (PORTD&= ~(1<<0)) //WR低#define RD_on (PORTD|= (1<<1 )) //RD高#define RD_off (PORTD&= ~(1<<1)) //RD低#define CAN_cs_on (PORTD|= (1<<4 )) //CAN高#define CAN_cs_off (PORTD&= ~(1<<4)) //CAN低#define ALE_on (PORTD|= (1<<2 )) //ALE高#define ALE_off (PORTD&= ~(1<<2)) //ALE低#define FALSE 0#define TRUE 1#define CANBE_C 6 //總線關閉次數設定值//*******************CAN寄存器地址**************************//#define CAN_MOD 0 //模式寄存器#define CAN_CMR 1 //命令寄存器 只寫#define CAN_SR 2 //狀態寄存器 只讀#define CAN_IR 3 //中斷寄存器 只讀#define CAN_IER 4 //中斷使能寄存器#define CAN_BTR0 6 //總線定時寄存器0#define CAN_BTR1 7 //總線定時寄存器1#define CAN_OCR 8 //輸出控制寄存器#define CAN_TEST 9 //測試寄存器#define CAN_ALC 11 //仲裁丟失寄存器#define CAN_ECC 12 //錯誤代碼捕捉寄存器#define CAN_EWLR 13 //錯誤報警限制寄存器#define CAN_EXERR 14 //RX錯誤計數寄存器#define CAN_TXERR 15 //TX錯誤計數寄存器#define CAN_ACR0 16 //驗收碼寄存器0#define CAN_ACR1 17 //驗收碼寄存器1#define CAN_ACR2 18 //驗收碼寄存器2#define CAN_ACR3 19 //驗收碼寄存器3#define CAN_AMR0 20 //驗收屏蔽寄存器0#define CAN_AMR1 21 //驗收屏蔽寄存器1#define CAN_AMR2 22 //驗收屏蔽寄存器2#define CAN_AMR3 23 //驗收屏蔽寄存器3#define CAN_TXB 16 //發送緩沖區首地址(工作模式)#define CAN_RXB 16 //接收緩沖區首地址(工作模式)#define CAN_RMC 29 //RX信息計數器#define CAN_RBSA 30 //RX緩沖區起始地址寄存器#define CAN_CDR 31 //時鐘分頻器#define ID3 00 //ID3-----------------------------初始化程序uchar main_ch=0;IO_Init(); //I/O口初始化INT1_Init();GET_add(); //獲取地址,地址為0,反復獲取地址,直到不為0。NET_LED_on;ERR_LED_on; //初始化中,點亮故障燈和通訊燈,delay50ms(2);dog();delay50ms(2);dog();delay50ms(2);dog();CAN_Init(); //CAN初始化NET_LED_off;ERR_LED_off;SEI();CAN_first_send(); //CAN試發送delay50ms(1);dog();void GET_add(void) //地址獲取程序{uchar add_temp=0,add_temp1=0,add_temp2=0,add_temp3=0,addr_temp=0;do{dog();NET_LED_on;ERR_LED_on;add_temp1=PINC&0xc3;add_temp2=add_temp1>>4;add_temp1=add_temp1&0x03;add_temp3=(PIND&0xe0)>>1;add_temp=add_temp1+add_temp2+add_temp3;add_temp=(~add_temp)&0x7f;addr=add_temp;delay50ms(2);}while(addr==0);}

關鍵詞: CAN通訊硬件環

最近更新

關于本站 管理團隊 版權申明 網站地圖 聯系合作 招聘信息

Copyright © 2005-2018 創投網 - m.7778890.com All rights reserved
聯系我們:33 92 950@qq.com
豫ICP備2020035879號-12

 

成人精品水蜜桃_成人在线丰满少妇av_91亚洲国产高清_欧美日韩免费区域视频在线观看
欧美精品v国产精品v日韩精品| 成人动漫一区二区| 福利一区二区在线| 狠狠入ady亚洲精品| 久久综合一区二区三区| 精品免费视频.| 午夜精品久久久久久不卡8050| 国产成人午夜视频| 国产欧美日韩一区二区三区| 欧美一级一区二区| 亚洲午夜精品17c| 成人久久18免费网站麻豆| 国产日韩欧美一区在线 | av网站免费线看精品| 麻豆av一区二区三区久久| 欧美成人伊人久久综合网| 亚洲夂夂婷婷色拍ww47| 99久久久久久99| 欧洲一区二区av| 亚洲久草在线视频| 99re热这里只有精品视频| 欧美在线免费视屏| 中文字幕亚洲精品在线观看| 国产成人av在线影院| 午夜一区不卡| 国产精品久久久久毛片软件| 亚洲网站啪啪| 欧美日韩激情一区二区三区| 一区二区三区久久| 欧美连裤袜在线视频| 8x8x8国产精品| 日韩在线播放一区二区| 亚洲午夜精品久久| 精品少妇一区二区三区免费观看| 五月天网站亚洲| 激情欧美丁香| 久久精品视频一区二区三区| 国产精品77777| 欧美综合色免费| 亚洲成人中文在线| 99视频在线精品国自产拍免费观看| 欧美一区二区久久久| 美女www一区二区| 可以免费看不卡的av网站| 亚洲精品美国一| 亚洲高清在线播放| 国产精品久久久久久久久图文区| av午夜精品一区二区三区| 欧美电影免费观看高清完整版在 | 日韩欧美国产wwwww| 精品一区二区三区在线视频| 国产亚洲高清视频| 日本三级亚洲精品| 日本韩国欧美在线| 高清不卡一二三区| 欧美久久久久久久久中文字幕| 夜夜精品视频一区二区| 一区二区在线不卡| 亚洲欧美偷拍卡通变态| 亚洲三级免费| 亚洲午夜视频在线| 日韩女同互慰一区二区| 亚洲激情另类| 久久综合一区| 日韩国产欧美在线视频| 狼狼综合久久久久综合网| 91福利区一区二区三区| 亚洲影视在线播放| 日韩精品一级二级 | 国产精品无圣光一区二区| 欧美精品一区二区视频| 亚洲国产成人午夜在线一区| 色综合一个色综合亚洲| 国产精品污网站| 99精品国产一区二区青青牛奶| 亚洲视频一区二区免费在线观看| 激情一区二区| 亚洲福中文字幕伊人影院| 色94色欧美sute亚洲线路一ni| 美女视频一区在线观看| 91精品福利在线一区二区三区| 国产成人免费在线观看| 久久色在线观看| 亚洲国产一区二区三区a毛片| 亚洲精品第一国产综合野| 久久精品欧美| 国产精品一级在线| 国产午夜亚洲精品不卡| 99re国产精品| 免费看欧美女人艹b| 日韩免费一区二区三区在线播放| 欧美va天堂在线| 亚洲美女免费视频| 在线视频亚洲一区| 成人av资源在线观看| 国产精品久久久久永久免费观看| 亚洲一区精品视频| 国产精品自拍av| 国产精品色婷婷| 日本黄色一区二区| 不卡欧美aaaaa| 有坂深雪av一区二区精品| 91成人网在线| 91玉足脚交白嫩脚丫在线播放| 亚洲黄网站在线观看| 欧美另类变人与禽xxxxx| 国产精品初高中精品久久| 日韩中文字幕区一区有砖一区| 日韩欧美第一区| 亚洲精品女人| 国产精品77777| 亚洲一区中文日韩| 精品久久一区二区三区| 亚洲永久免费| 99天天综合性| 日韩不卡手机在线v区| 国产视频一区二区在线观看| 久久综合久久久| 91免费看片在线观看| 日韩成人一区二区| 国产农村妇女精品| 欧美日韩免费一区二区三区视频| 午夜性色一区二区三区免费视频 | 一区二区三区中文字幕电影| 欧美一三区三区四区免费在线看| 在线日韩欧美| 国产91丝袜在线播放九色| 亚洲国产成人porn| 日韩免费观看高清完整版| 欧美亚洲专区| 亚洲欧美一区二区原创| 极品美女销魂一区二区三区免费| 亚洲女人的天堂| 2021国产精品久久精品| 欧美在线免费观看视频| 亚洲激情精品| 欧美成人日韩| 精品一区二区三区视频在线观看| 亚洲精品欧美二区三区中文字幕| 精品粉嫩超白一线天av| 欧美日韩国产电影| 亚欧成人精品| 日韩午夜在线| 欧美精品aa| 高潮精品一区videoshd| 日本成人在线不卡视频| 亚洲精品伦理在线| 欧美国产日韩亚洲一区| 欧美不卡一区二区三区| 欧美色精品在线视频| 麻豆精品传媒视频| 亚洲高清久久| 成人国产在线观看| 欧美日韩综合在线| 国产成人精品一区二区三区四区 | 日韩—二三区免费观看av| 亚洲精品成人少妇| 国产精品久久久久婷婷二区次| 久久久久久久久久久电影| 日韩欧美成人一区二区| 制服丝袜av成人在线看| 欧美吞精做爰啪啪高潮| 久久亚洲综合| 久久精品一区二区国产| 国产伦精品一区二区三区照片91| 亚洲人成高清| 日韩视频在线一区二区三区| 亚洲国产免费看| 一本色道久久综合亚洲二区三区| 激情av一区| 9色国产精品| 国产精品一区二区三区免费观看| 亚洲精品黄色| 亚洲专区欧美专区| 另类av一区二区| 91激情在线视频| 欧洲视频一区二区| 欧美日韩高清一区二区不卡 | 国产一区二区调教| 国产在线视频不卡二| 亚洲综合视频在线| 亚洲www啪成人一区二区麻豆| 午夜久久久影院| 秋霞成人午夜伦在线观看| 日本视频一区二区三区| 精品亚洲欧美一区| 国产精品一区二区黑丝| zzijzzij亚洲日本少妇熟睡| 91免费看`日韩一区二区| 韩国在线视频一区| 午夜一级久久| 欧美高清激情brazzers| 欧美成人一级视频| 国产欧美日韩精品一区| 亚洲色图一区二区三区| 午夜免费欧美电影| 国产又黄又大久久| 91麻豆国产精品久久| 在线不卡亚洲| 老鸭窝毛片一区二区三区|