轉載於 : 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發生了什么錯誤!