海思驱动开发:海思平台移植MCP2515

        海思Hi3519AV100驱动采用设备树方式代替硬件编码,本文主要描述在移植MCP2515时遇到的问题,作为后续移植参考。

一、设备树配置

由于开发板上没有可用的SPI,所以采用GPIO模拟。

Hi3519av100.dtsi中GPIO的设备树配置如下:

相应的产品型号dts配置如下:

             

        要注意的晶振时钟配置要与MCP2515一致,以及复位引脚跟中断引脚的配置,SPI的最大频率根据MCP2515接收端的承受能力来配置,驱动中会默认设置好传输速率。

二、调试MCP2515

当配置好设备树后启动,发现probe失败,然后进行下面排查。

1.经过追踪linux中Mcp251x.c的源码发现mcp251x_hw_probe中会调用mcp251x_hw_reset发送复位命令给MCP251x,编写读写MCP251x寄存器都没反应怀疑reset引脚是否拉高了、信号是否有输出。

2.经过示波器抓取信号,确认reset有拉高并且所有引脚信号都有相应的信号,但是SCLK的引脚电平输出有问题,不能完全拉低,需要配置一下IO驱动输出能力。

3.在Hi3519AV100R001C02SPC010-user\ReleaseDoc\zh\00.hardware\chip中Hi3519AV100_PINOUT_CN.xlsx查找相应的管脚配置寄存器说明,发现目前的驱动能力为0档,经过从0-15档的调整发现只有在15档时SCLK才能拉低至输出180mv左右,经过电路放大后输入到MCP2515在400-450mv之间。

4.配置好驱动后发现一个问题,就可以probe成功了,IO的配置暂时放在Mcp251x.c源码中。

5.但是出现了一个问题就是前天可以probe成功的在隔天就不行了,经过查找MCP2515手册发现SCLK的低电压输入的最高域值是0.4v,我们的SCLK信号超过了MCP2515的信号域值所以会出现MCP2515信号读取错误的情况,经过将电阻加大,使SCLK的拉高拉低输出在MCP2515域值内后可以probe成功。

6.但存在失败的情况,添加超时重传机制后就能每次都probe成功了,修改mcp251x_hw_reset函数内容。

执行ifconfig -a可以看到can0设备。

三、iproute2与canutils移植

3.1 iproute移植

iproute的移植按网上说明就可以,这里我用的版本是iproute2-5.3.0,生成makefile后修改CC改为海思交叉编译器。

        这里遇到一个问题,在执行ip link set can0 up type can bitrate 250000会失败,提示中断打不开,定位到驱动源码spi.c以及到irq.c中发现spi.irq申请失败所以导致中断失败,中断的分配自然跟设备树配置有关,将gpio2设置为中断控制器并配置到中断的记录数目后就可以注册成功,具体设备树配置如下:

3.2 canutils移植

移植canutils前需要移植libsocketcan,libsocketcan移植的步骤如下:

Canutils移植步骤如下:

将相应的CC改为海思交叉编译器即可。

这里编译时会提示libsocketcan不是0.9以上版本,将GNUmakefile文件中将相应的处理删除后即可正常编译。

四、运行CAN命令

        配置完成后,运行Socket Can调用的命令,能够正常执行,并且数据收发正确。

发布了36 篇原创文章 · 获赞 4 · 访问量 2800

猜你喜欢

转载自blog.csdn.net/qq845699/article/details/104152226