这其实都是昨天的内容。主要折腾了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这个模块来说,如果没有收到应答位,示波器上可以看到模块不停地尝试重发该帧,这点一定要注意。