前段时间调试了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发生了什么错误!

» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
分享到:

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.

   
© 2012 velep.com | reille blog | 管理| 粤ICP备15065318号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量