atmel9260上linux socketcan MCP2515調試筆記即CAN總線調試總結


轉載於 : http://velep.com/archives/348.html

 

前段時間調試了linux下的MCP2515驅動,驅動基本上調試通過,這兩天調試另外幾塊板時又出現了一些問題。

1.  linux啟動的時候probe MCP2515有時候失敗,有時候成功,而有的板則是一直可以probe成功。probe失敗時提示“MCP251x didn’t enter in conf mode after reset”。

調試分析:由於probe的時候,驅動復位MCP2515采用SPI命令復位形式,同時MCP2515復位引腳接了ATMEIL9260的GPIO引腳(驅動中沒用GPIO復位功能),因此,要么MCP2515的SPI復位命令沒有成功,要么復位成功了MCP2515的配置模式檢測不成功。

由於在有的板子可以,因此,把問題鎖定在GPIO復位引腳上。用示波器量了下電平,居然是低電平。這應該就是probe失敗的原因吧。查了下驅動,驅動中確實沒有對這個復位GPIO引腳進行初始化,於是在驅動中加了GPIO的初始化,復位后輸出高電平。但這個GPIO引腳還是低電平。估計問題出在硬件上了。驅動中明明已初始化該GPIO為高電平,而且其它驅動也沒有用到此GPIO,為什么還是低電平呢?

仔細分析了電路,原來該GPIO在后續版的板子上預分配給了按鍵用,並通過244接到CPU上,原來是GPIO引用沖突引起的。割斷按鍵用的通路,再看,啟動時可以正常probe成功了。

2. 同樣一塊板,測試MCP2515收發幀數據的時候,發送一幀且PC機上的測試程序可以正常收到后,接下來發送幀都不能正常收到,且到發送第10次時提示:“write: No buffer space available”。

調試分析:這個提示信息應該是內核打印的而不是測試程序中打印出來的,在驅動上也找不到這種類似相關錯誤。在google上搜索下,有搜索到一些相關信息,如下:

Neal Probert wrote:
> I'm using PCAN-USB 6.7 with latest Socket-CAN from Subversion. >> Can anybody tell me what this means, and how to I get around it? >> "write: No buffer space available" >> I don't get this with vcan0, but I do with can0. Happens with cangen > and my own application. >
Hi Neal,

when you try to write more data than the 'real' CAN hardware can put
onto the bus the tx-queue from the CAN netdevice simply runs over after
some time.

If you have only 'peak' load you may try to pump up the tx_queue_len of
'can0' in the sysfs:

echo 1000 > /sys/class/net/can0/tx_queue_len

But if your idea is to generate maximum load, you could ignore/handle
the -ENOBUF return value, wait an appropriate time (e.g. 500ns?) and
send your next CAN frame.

Regards,
Oliver

我的理解是tx_queue_len的值的問題,在linux上查了下tx_queue_len的值,是10,這似乎可以解釋,收發幀測試程序在發第10幀后出現“write: No buffer space available”提示信息了。但沒有解釋為什么發送的第一幀數據可以收到,接下發送的幀收不到。

查了下驅動也找不出什么問題,而且有個型號的板子是可以正常收發幀數據的。

也查看了/sys/class/net/can0/目錄下的一些統計、狀態等信息,似乎也找不出什么問題。

找了好久沒找到,就在這時,突然想到,會不會又是IO引腳沖突引腳的。於是查看了下MCP2515用到的其它IO,它還用到了中斷GPIO引腳。再次分析電路圖,oh my god,真是又是沖突了。解決方法如第1個問題。解決后,可以正常收發幀數據了。

3. CAN不連接其它節點即CAN總線空懸着,這時候進行幀發送測試,第1次可以發送成功(用示波器量波形可以證明),但后面再次發送就不能正常在PC機上收到幀數據,除非ifconfig can0 down再ifconfig can0 up一下,則可正常收發幀數據。

這個問題目前沒找到原因。后續解決了再補上。

4. CAN收幀數據時,會收到額外數據,如收到正常幀數據“11 22 33 44 55 66 77 88”,會收到“00 10 00 00 00 00 00 00”多余的幀數據。

收到的“00 10 00 00 00 00 00 00”的幀數據,其實是內核MCP2515驅動發上來的,根據驅動源碼,如果MCP2515發生錯誤時,則內核驅動會發送相關錯誤幀給上層,上層應用程序根據收到的錯誤幀的錯誤碼判斷MCP2515發生了什么錯誤!

» 本文地址: http://velep.com/archives/348.html


免責聲明!

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



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