Can波特率自動匹配的方法
【技術領域】
[0001 ] 本發明涉及工業自動控制領域,特別是CAN波特率自動匹配的方法。
【背景技術】
[0002]CAN的高性能和可靠性已被認同,并被廣泛地應用于工業自動化、船舶、醫療設備、工業設備等方面;現場總線是當今自動化領域技術發展的熱點之一,被譽為自動化領域的計算機局域網;它的出現為分布式控制系統實現各節點之間實時、可靠的數據通信提供了強有力的技術支持。
[0003]在使用同一條CAN總線通信的設備,所有的設備的CAN通信波特率必須一致;在CAN總線上,采用主從通信方式時,一臺主機,連接多從站;主機與從站通信主要依靠從站ID號來標識,使主站與相應的從站進行數據交換。而主站與從站通信的前提是,主站與從站通信的波特率要一致,現有的技術主要采用撥碼開關來設置每臺從站的波特率或通過軟件來設置從站的波特率,在使用時只要主站的波特發生更改,就要通過撥碼開關或軟件對通信總線上設備就要每臺設置波特率,使用起來很不方便;特別在整個系統運行起來以后通信不穩定,需要改變總線的波特率時,所需要的時間較長嚴重的影響系統的使用。
【發明內容】
[0004]本發明的目的是提供一種CAN波特率自動匹配的方法。
[0005]本發明是通過以下技術方案予以實現的:
CAN波特率自動匹配的方法,主從站約定了幾種常用的波特率,可根據需要而改變;主站可根據約定而改變整個總線上的通信波特率,主站更改波特率時,從站自動與主站波特率進行匹配,從而實現主從正確通信;
①.從站上電時設置CAN口的波特率為默認的波特率,等待接收總線上的CAN 口報文,如果連續5次接收到的報文為錯誤報文就重新設置CAN 口波特率為主從站越好的下一個波特率,直到正確接收到CAN 口報文時,就以這波特率與主站通信;
②.在正常通信的情況下,主站更改了波特率,從站會實時檢測接收到的總線上的報文是否正確,如果連續5次接收到錯誤報文,重復波特率匹配過程,直到接收正確報文;從站接收到的報文是否正確判斷依據讀取CPU的CAN通信接口相應寄存即可。
【附圖說明】
[0006]圖1是本發明的從站與主站波特率自動匹配流程的示意圖。
【具體實施方式】
[0007]下面結合附圖對本發明的實施例做進一步描述:
如圖1所示的從站與主站波特率自動匹配流程,如下代碼基于STM32F103芯片,調用了STM32F103的庫,具體步驟如下: 1.設置CAN通信的波特率
void SetupCAN—Port(unsigned int Port, unsigned int BaudrateIndexj unsignedint Mode)
{
CAN—InitTypeDef CAN—InitStructure;
CAN—InitStructure.CAN—TTCM=DISABLE; //TTCAN modeCAN—InitStructure.CAN—ABOM=ENABLE; //Automatic bus-off managementCAN—InitStructure.CAN—AWUM=DISABLE;//Automatic wakeup modeCAN_InitStructure.CAN_NART=DISABLE;//ENABLE; //No automaticretransmiss1n
CAN—InitStructure.CAN—RFLM=DISABLE; //Receive FIFO locked Mode CAN—InitStructure.CAN—TXFP=DISABLE;//ENABLE; //Transmit FIFO pr1rity CAN—InitStructure.CAN—Mode=Mode; //CAN—Mode—LoopBack;//;
//250K
CAN_InitStructure.CAN_SJW=CAN_SJW_ltq;
CAN—InitStructure.CAN—BS1=CAN—BS1—13tq;
CAN—InitStructure.CAN—BS2=CAN—BS2—2tq;
CAN—InitStructure.CAN—Prescaler=8; switch (BaudrateIndex)
{
case 0: //5K
CAN_InitStructure.CAN_SJW=CAN_SJW_ltq;
CAN—InitStructure.CAN—BS1=CAN—BS1—13tq;
CAN—InitStructure.CAN—BS2=CAN—BS2—2tq;
CAN_InitStructure.CAN_Prescaler=400; break; case 1: //1K
CAN_InitStructure.CAN_SJW=CAN_SJW_ltq;
CAN—InitStructure.CAN—BS1=CAN—BS1—13tq;
CAN—InitStructure.CAN—BS2=CAN—BS2—2tq;
CAN_InitStructure.CAN_Prescaler=200; break; case 2: //20K
CAN_InitStructure.CAN_SJW=CAN_SJW_ltq;
CAN—InitStructure.CAN—BS1=CAN—BS1—13tq;
CAN—InitStructure.CAN—BS2=CAN—BS2—2tq;
CAN_InitStructure.CAN_Prescaler=100; break; case 3: //50KCN 1047%222 A i^sdt3/4 H
CANIInitstructure.CANlsjw=CANISJWIltq;
CANIInitstructure.CANIBSl=CANIBSl13tq;
CANIInitstructure.CANIBS2=CANIBS2l2tq;
CANIInitstructure.CANIPrescaler=40;break;case 4: //125K
CANIInitstructure.CANlsjw=CANISJWIltq;
CANIInitstructure.CANIBSl=CANIBSl13tq;
CANIInitstructure.CANIBS2=CANIBS2l2tq;
G>NIInitstructure.G>Nlprescaler=16;break;case 5: //2SK
CANIInitstructure.CANlsjw=CANISJWIltq;
CANIInitstructure.CANIBSl=CANIBSl13tq;
CANIInitstructure.CANIBS2=CANIBS2l2tq;
「AM Tn—l.tstrnrtllrp,「AN prpm?11pr=8.CANIInitstructure.CANlsjw=CANISJWIltq;CANIInitstructure.CANIBSI=CANIBSII5tq;CANIInitstructure.CANIBS2=CANIBS2l2tq;
G>NIInitstructure.G>Nlprescaler=8; break; case 7: //IM
CANIInitstructure.CANlsjw=CANISJWIltq;CANIInitstructure.CANIBSI=CANIBSII5tq;CANIInitstructure.CANIBS2=CANIBS2l2tq;CANIInitstructure.CANIPrescaler=4:;break;default://250K
CANIInitstructure.CANlsjw=CANISJWIltq;CANIInitstructure.CANIBSl=CANIBSl13tq;CANIInitstructure.CANIBS2=CANIBS2l2tq;
G>NIInitstructure.G>Nlprescaler=8;break;
}
#if CANOIENABLEDVOif (POrt==O)
I: CAN_Init(CAN1, &CAN_InitStructure); return;
}
#endif
#if CAN1_ENABLEDif (Port==I)
{
CAN_Init(CAN2, &CAN_InitStructure); return;
}
#endif
}
2.CAN接收中斷并判斷接收的CAN數據是否正確 extern CanRxMsg RxMessage;
void USB_LP_CANl_RXO_IRQHandler(void)
{
CanRxTimeout=O;
CAN—LEC—Cont=O;
if (CANl->BTR&0xc0000000) //接收到正確數據設置CAN為正常模式SetupCAN_Port (O, TryBps, CAN_Mode_Normal);
CAN_Receive(CANl, CAN_FIF00, &RxMessage); if(gllRQService[IRQ_SERVICE_CAN0_RX]!=nil) { gllRQService[IRQ_SERVICE_CANO_RX](); can_fIag=I; } }
3.錯誤處理中斷并使CAN進入監聽模式 void CANl_SCE_IRQHandler(void)
{
CAN_LEC_Cont++;if (CAN_LEC_Cont>10)
{
CAN_LEC_Cont=0; CanRxTimeout=0;
AutoBpsTry(0);
}
CAN_ClearITPendingBit(CAN1, CAN_IT_ERR);
CAN_ClearITPendingBit(CAN1, CAN_IT_LEC); }
4.調整CAN波特率 void AutoBpsTry(unsigned char cPort){ TryBps++; if (TryBps>7) TryBps=2; CANO_Reset();
SetupCAN_Port(0, TryBps, CAN_Mode_Silent); }
【主權項】
1.CAN波特率自動匹配的方法,主從站約定了幾種常用的波特率,可根據需要而改變;主站可根據約定而改變整個總線上的通信波特率,主站更改波特率時,從站自動與主站波特率進行匹配,從而實現主從正確通信; ①.從站上電時設置CAN口的波特率為默認的波特率,等待接收總線上的CAN 口報文,如果連續5次接收到的報文為錯誤報文就重新設置CAN 口波特率為主從站越好的下一個波特率,直到正確接收到CAN 口報文時,就以這波特率與主站通信; ②.在正常通信的情況下,主站更改了波特率,從站會實時檢測接收到的總線上的報文是否正確,如果連續5次接收到錯誤報文,重復波特率匹配過程,直到接收正確報文;從站接收到的報文是否正確判斷依據讀取CPU的CAN通信接口相應寄存即可。
【專利摘要】本發明公開了CAN波特率自動匹配的方法,CAN波特率自動匹配的方法,主從站約定了幾種常用的波特率,可根據需要而改變;主站可根據約定而改變整個總線上的通信波特率,主站更改波特率時,從站自動與主站波特率進行匹配,從而實現主從正確通信,本發明提供的方法可在不影響系統的情況下方便的更改波特率。
【IPC分類】H04L1-00
【公開號】CN104796222
【申請號】CN201410668694
【發明人】周曉峰, 胡炎良, 鄧君
【申請人】湖南先步信息股份有限公司
【公開日】2015年7月22日
【申請日】2014年11月21日