STM32canopen調試


問題1:用usbcan監測不到can口的報文

屬於接線問題

CANopen程序總使用的是can1 對應的接下口在J1的1和2口,而其接口排序是從外向里排序,故最外面的為1號接口,由於接線時,按照左邊的順序來數的(左右接口排序對稱),把can1H接到了can2L上,can1L接到了can2H上。最后通過用萬用表測can收發器的引腳與接口的通斷找到了對應的接口。

 

問題2:還是收不到報文  

此時注意到用於can收發的定時器TIM4的配置沒更改過來

 

問題3: 當讀數據的時候  while循環可以退出,但當寫數據的時候 while循環不能退出

在解決前兩個問題時,把定時器設置好了,但是在設置定時器時,最后一個還是沒改成TIM4,就是雖然吧TIM4配置好了,但最后還是沒打開,導致TIM4的中斷還是沒開啟 

而讀數據的循環之所以能夠退出是因為他的退出條件是

while (getReadResultNetworkDict (&ObjDict1_Data, 0x04, &rdata, &size,&abortCode) == SDO_UPLOAD_IN_PROGRESS);

而getReadResultNetworkDict函數可以返回值有3種情況

可以返回 SDO_TINISHED 這種情況是SDO處理過程完全正確

            d->transfers[line].state  這個值通常返回的是SDO_UPLOAD_IN_PROGRESS,所以又會返回來循環執行

            SDO_ABORTED_INTERNAL  這個屬於中斷退出  

實際上根據while的條件,退出while循環的可能有兩種,一種是正常處理完畢 一種是中斷退出

后來分析得到的結果是雖然這里退出了  但屬於終斷退出  

而getWriteResultNetworkDict函數可以返回值有2種情況

 SDO_TINISHED 或者非 SDO_TINISHED

因此,當中斷時,寫的while循環會一直等待。

問題4:  可以讀到數據,但在寫的時候從站返回05 04 00 00 錯誤碼,也就是SDO協議超時

最后發現是can口在配置時 沒有配置濾波器參數,打開濾波器參數之后,可以寫數據成功

 

問題5:從上面發現,有些報文后面,主站還是會發出80 00 00 00 的錯誤碼,其屬於通用型的錯誤  而且雖然can口監測到了沖站返回的報文,但是對象字典里面並沒有數據,也就是數據並沒有存到對象字典中,查看while循環退出后的返回值為0x85,表明也是中斷退出。

 嘗試幾次之后發現,如果所讀的對象字典的數據的長度不為4個字節(小於4),則會返回錯誤碼  如果數據長度為4個字節,則不會返回錯誤碼,如果數據長度大於4個字節,則while循環不會退出。推測這個可能是SDO讀取數據沒完成,因為跟蹤readNetworkDict函數發現 里面有件SDO數據的長度固定為8個字節

但后來想了  can在傳輸數據時,每次只能傳輸8個字節。但能否把SDO的數據長度改為可變的,當數據長度小於4個字節時,can口一次性傳完,當數據長度大於4個字節時,分多次連續傳輸。

 

但是后來又發現,即使所讀取的對象字典的數據長度為4個字節,主站不會發送錯誤代碼,但如果數據不是4個NUS8類型的數據,讀完之后,對象字典里面的數據仍然全為0,這說明數據在保存的時候也出了問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM