开发日志 170228

这其实都是昨天的内容。主要折腾了MCP2515CAN总线模块,已经可以和杨老师给的CAN总线调试器互发数据帧了。STM32的板子也到了,下午开始做一些动力系统的内容吧xD。

这篇文章主要讲了如何把MCP2515 CAN总线模块开起来,不涉及具体的分析。

 

不得不说,Linux kernel 经过这么多年的发展,变化已经很大了。最开始我看的这篇文章,写的是Kernel 3.x的做法,由于MCP2515的驱动早就进内核了,只要在注册SPI设备的时候把它从spidev改为mcp2515就可以了,关键部分如下:

 static struct spi_board_info bcm2708_spi_devices[] = {
    {
-      .modalias = "spidev",
-      .max_speed_hz = 500000,
+      .modalias = "mcp2515",
+      .max_speed_hz = 10000000,
+      .platform_data = &mcp251x_info,
+      /* .irq = unknown , defined later thru bcm2708_mcp251x_init */
       .bus_num = 0,
       .chip_select = 0,
       .mode = SPI_MODE_0,

我觉得既然3.x可以,那4.x应该也没问题。然而拖下来内核发现,arch/arm/mach-bcm2708/这个目录根本没有,只有一个相似的叫arch/arm/mach-bcm/这样的一个目录,而且里面也没找到类似的文件。没办法,面向Google编程呗,于是又找到了这篇文章(日语)。里面有一段这样说的:

昔は,カーネルにパッチをあてたりする必要があったようですが,2015-05-05 以降の Raspbian であれば,カーネルをアップデートして設定をしてやるだけで動きます.

渣翻:以前,必须要给Kernel打Patch(来实现这一功能),不过如果是2015-05-05以后的Raspbian的话,只要更新内核并适当配置就可以了。

翻了一下以前的新闻,发现2015年4月正好是Kernel 4.0发布(树莓派动作蛮快的),看来是内核改了这方面的内容。现在只需要在内核启动的时候传个参数就去就好了,具体就是在/boot/config.txt里加上下面这几句,就OK了。

dtparam=spi=on
dtoverlay=mcp2515-can0-overlay,oscillator=20000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
dtoverlay=spi-dma-overlay

这样启动后就可以看到,网络设备里面多了个can0,将他上线后就可以开始用can-utils做收发测试了。

需要注意的是,CAN总线需要终端电阻匹配,还需要应答位

一般CAN模块上都会留一个跳线帽,或者是留空了一个120Ω电阻位置。在总线终端的模块应该把它接上,否则可能会在总线端点产生信号反射。似乎也不能使用星形连接。

对于MCP2515这个模块来说,如果没有收到应答位,示波器上可以看到模块不停地尝试重发该帧,这点一定要注意。

发表评论