atmel9260上linux socketcan MCP2515调试笔记

前段时间调试了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/


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值