mcp2515是spi接入的模块
淘宝买的can小板子,直接通过spi飞线到atlas 200的单板
1、首先需要配置spi复用
2、配置内核
3、配置设备树
调试问题:
第一个问题
重新编译dtb文件、内核镜像和驱动,启动之后mcp2515驱动probe报错
网上有类似的问题 https://www.jianshu.com/p/b056cf35eab9
以上点排除之后,还是有问题,即我们的问题和他们不一样。
反复修改配置设备树也无法解决,伤脑筋!
没办法分析内核报错
通过跟踪日志,发现是主控通过spi发送消息,没有响应失败
没办法必须要抓波形了,以确认
1、主控有发送spi消息,且消息正确
2、板子有回复消息,且回复正确
小公司没有示波器,搞了个小巧的分析仪器,低速的总线还是可以分析的
发送波形是每次通过insmod ko/rmmod ko文件的不常规方式实现的,因为当前can没有通,无法正常工作,无法通过用户程序发波形了
抓到的波形发现mosi和miso反了!!!怪不得mcp2515没有响应,给人家输出发消息,哪里会有响应
调整线序解决了! 坑爹的硬件
通常情况下,我们只需要对上图所描述的四个管脚(pin) 进行编程即可控制整个 SPI 设备之间的数据通信:
- SCK:主要的作用是 Master(主)设备往 Slave(从)设备传输时钟信号, 控制数据交换的时机以及速率;
- SS/CS:用于 Master(主)设备片选 Slave (从)设备,使被选中的 Slave(从)设备能够被 Master(主)设备所访问;
- SDO/MOSI:在 Master(主)上面也被称为 Tx-Channel,作为数据的出口,主要用于 SPI 设备发送数据;
- SDI/MISO:在 Master(主)上面也被称为 Rx-Channel,作为数据的入口,主要用于SPI 设备接收数据;
当时MOSI和MISO在主控引到板子的mcp2515的时候反序了,导致从atlas从接收信号的地方发送信号,实际信号根本不会发出,所以mcp2515没有应答
第二个问题
mcp的open函数,内核can的中断初始化报错:atlas 200 can相关的设备树配置,和内核mcp2515驱动代码修改
初始化的时候,发现中断配置报错
ip link set can0 up type can bitrate 250000会失败,提示中断打不开
报错有两种:
中断类型和原始的不一致:修改mcp251x_open代码里面flags和can dts的中断描述,都改为下降沿触发
中断的dts无法解析正确:中断写法不对,要按照下面的dts截图来写 https://blog.csdn.net/thisway_diy/article/details/105394053
设备树中的interrupts属性解析
interrupts属性会有两种不同的参数:
- 带两个参数的情形
示例:
interrupt-parent = <&gpio2>;
interrupts = <5 1>;
表示中断控制器是GPIO2,使用GPIO2的第5号中断,这里的第5号中断指的是5号引脚,1是指中断触发的方式为上升沿触发,详见内核代码中的头文件include/dt-bindings/interrupt-controller/irq.h
- 带三个参数的情形
示例:
interrupts = <GIC_SPI 66 1>;
2.1 先了解一下中断的类型
IPI:inter-processer interrupt 中断号0~15
PPI:per processor interrupts 中断号16~31
SPI:shared processor interrupts 中断号 32 ~32+224
SGI:software generated interrupts (SGI).
所以上述示例表示中断类型为共享处理器中断(SPI),中断号为SPI中断类型中的第66号中断号,计算出来的实际中断号即为32+66=98号中断,1表示上升沿触发中断
原文地址:https://www.cnblogs.com/dakewei/p/11395426.html
1表示上升沿触发
2表示下降沿
我们是采用下降沿触发中断,
第三个问题
can的回环测试ok,但是无法接收雷达数据(雷达接到mcp251x的can,cpu通过spi1接到mcp251x):最后发现是时钟配置问题,与小板子有关
我们的mcp小板是8M的工作晶振,开始在dts配置了25M的时钟,这个时钟是要和mcp小板的晶振一致才行
解决方案是dts配置8M时钟,参考上图dts的截图里面的配置,有注释说明
https://zhuanlan.zhihu.com/p/376755248
can通问题
1、内核can的中断初始化报错:atlas 200 can相关的设备树配置,和内核mcp2515驱动代码修改
2、can的回环测试ok,但是无法接收雷达数据:最后发现是时钟配置问题,与小板子有关
回环测试指令如下:
ip link set can0 down
ip link set can0 type can bitrate 50000 loopback on
ip link set can0 up
candump can0 &
cansend can0 123#11223344556677
参考
https://blog.csdn.net/thisway_diy/article/details/105394053 很重要的中断设备树写法与spi i2c的源码有关系,代码接口规定好了写法
http://t.zoukankan.com/shulianghe-p-3724131.html mcp2515驱动程序详解
https://blog.csdn.net/liteblue/article/details/123049660 mcp2510的can使用
https://blog.csdn.net/Sangedianzi/article/details/121286102 mcp2515协议解析
https://blog.csdn.net/feidayekuangkuang/article/details/122682586
https://blog.csdn.net/ch122633/article/details/125857730
https://blog.csdn.net/liteblue/article/details/123049660
https://blog.csdn.net/star871016/article/details/108485868?spm=1001.2101.3001.6650.14&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-14-108485868-blog-104152226.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-14-108485868-blog-104152226.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=24
https://blog.csdn.net/qq845699/article/details/104152226
https://blog.csdn.net/lushengchu_luis/article/details/77099239
https://blog.csdn.net/weixin_38387929/article/details/114927127
http://t.zoukankan.com/shulianghe-p-3724131.html
https://blog.csdn.net/weixin_35551678/article/details/116838373
https://blog.csdn.net/jklinux/article/details/78701702
SPI协议详解
https://zhuanlan.zhihu.com/p/150121520?utm_source=wechat_session
https://zhuanlan.zhihu.com/p/503777954