樹(shù)莓派外掛MCP2515模塊爬坑記錄

最近由于接近放假,協(xié)調(diào)不到調(diào)板哥,于是兼職下調(diào)板的工作。雖然之前也業(yè)余玩過(guò)樹(shù)莓派和arduino,但是由于沒(méi)有stm32的開(kāi)發(fā)經(jīng)驗(yàn)和硬件知識(shí)的匱乏,還是遇到了很多坑。

這個(gè)can總線模塊就卡了我兩三天,由于涉及到樹(shù)莓派的配置知識(shí),覺(jué)得有必要記錄一下。

can驅(qū)動(dòng)配置

目前的這個(gè)項(xiàng)目涉及到了樹(shù)莓派和stm32的通信,使用的是can總線。由于樹(shù)莓派本身不提供can總線功能,需要外掛一個(gè)MCP2515芯片。

網(wǎng)上搜索樹(shù)莓派的can總線配置,可以找到不少的資料,其中感覺(jué)最詳細(xì)的是這一篇。但是里面有個(gè)小bug,我等下再說(shuō)。

首先網(wǎng)上的接線多數(shù)都是這樣的:

RPi Pin    RPi Label     CAN Module
02---------5V------------VCC
06---------GND-----------GND
19---------GPIO10--------MOSI (SI)
21---------GPIO9---------MISO (SO)
22---------GPIO25--------INT
23---------GPIO11--------SCK
24---------GPIO8---------CS

然后修改文件/boot/config.txt激活MCP2515驅(qū)動(dòng):

# 打開(kāi)spi總線,樹(shù)莓派與MCP2515之前通過(guò)spi通信,然后再轉(zhuǎn)成can協(xié)議
dtparam=spi=on

# 在spi0.0上配置MCP2515 CAN控制器,CAN控制器的晶振頻率是16MHz,INT腳接到了gpio25
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25 

# SPI0只使用一個(gè)CS引腳,把spi0.0的cs腳配置到gpio8。實(shí)際上不配置這個(gè)也沒(méi)有影響
dtoverlay=spi0-1cs,cs0_pin=8

這些dtoverlay配置項(xiàng)的說(shuō)明可以查看/boot/overlays/README:

...
Name:   mcp2515-can0
Info:   Configures the MCP2515 CAN controller on spi0.0
Load:   dtoverlay=mcp2515-can0,<param>=<val>
Params: oscillator              Clock frequency for the CAN controller (Hz)

        spimaxfrequency         Maximum SPI frequence (Hz)

        interrupt               GPIO for interrupt signal
        
Name:   mcp2515-can1
Info:   Configures the MCP2515 CAN controller on spi0.1
Load:   dtoverlay=mcp2515-can1,<param>=<val>
Params: oscillator              Clock frequency for the CAN controller (Hz)

        spimaxfrequency         Maximum SPI frequence (Hz)

        interrupt               GPIO for interrupt signal
...

Name:   spi0-1cs
Info:   Only use one CS pin for SPI0
Load:   dtoverlay=spi0-1cs,<param>=<val>
Params: cs0_pin                 GPIO pin for CS0 (default 8)
        no_miso                 Don't claim and use the MISO pin (9), freeing
                                it for other uses.

Name:   spi0-2cs
Info:   Change the CS pins for SPI0
Load:   dtoverlay=spi0-2cs,<param>=<val>
Params: cs0_pin                 GPIO pin for CS0 (default 8)
        cs1_pin                 GPIO pin for CS1 (default 7)
        no_miso                 Don't claim and use the MISO pin (9), freeing
                                it for other uses.
...

所以以后需要打開(kāi)什么功能,都可以到這文檔里面查看配置方法

首先由于我們把MCP2515 CAN控制器配到了spi0.0,所以我們需要配置spi0.0的cs腳(當(dāng)然如果你也可以配置mcp2515-can1將它配置到spi0.1,這樣的話就需要改spi0.1的cs腳)。

這個(gè)cs腳使是用來(lái)選擇設(shè)備的,當(dāng)有多個(gè)設(shè)備掛到spi總線上的時(shí)候可以用這個(gè)腳去選擇指定設(shè)備。由于我們只有一個(gè)設(shè)備,所以可以使用spi0-1cs指定spi0只有一個(gè)cs腳,當(dāng)然你也可以配置兩個(gè)cs腳(spi0-2cs)留空一個(gè)不用。然后無(wú)論是spi0-1cs還是spi0-2cs,cs0默認(rèn)都是gpio8,所以我們配不配都沒(méi)有關(guān)系,下面幾種配置方法都是對(duì)的:

  1. dtoverlay=spi0-1cs,cs0_pin=8
  2. dtoverlay=spi0-1cs
  3. dtoverlay=spi0-2cs,cs0_pin=8
  4. dtoverlay=spi0-2cs
  5. # 不配置,留空

之前我說(shuō)的這一篇博客的小bug就是它配了dtoverlay=spi1-1cs,實(shí)際上是配置了spi1的cs腳,對(duì)我們的配置在spi0的can控制器沒(méi)有影響

我們的接法和網(wǎng)上的不一樣,INT腳接gpio17,CS腳接gpio22。根據(jù)文檔修改下配置就好:

dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=17
dtoverlay=spi0-1cs,cs0_pin=22

can驅(qū)動(dòng)啟動(dòng)失敗

事情到這里其實(shí)還算一帆風(fēng)順,我也沒(méi)有花多少時(shí)間。但是當(dāng)重啟樹(shù)莓派發(fā)現(xiàn)并沒(méi)有/sys/bus/spi/devices/spi0.0/net/can0這個(gè)設(shè)備,使用dmesg命令查看開(kāi)機(jī)日志會(huì)發(fā)現(xiàn)這樣的一個(gè)錯(cuò)誤,mcp2515驅(qū)動(dòng)啟動(dòng)失敗了:

[    7.653601] mcp251x spi0.0: MCP251x didn't enter in conf mode after reset
[    7.653654] mcp251x spi0.0: Probe failed, err=16
[    7.653738] mcp251x: probe of spi0.0 failed with error -16

然后我就懵逼了,網(wǎng)上搜索這個(gè)錯(cuò)誤找到了很多遇到這種情況的人,但是他們的回答都是加上dtoverlay=spi0-1cs配置,讓我一度懷疑自己的英語(yǔ)閱讀水平以為自己文檔看劈叉了(雖然水平的確也不怎樣)。

由于我們的接線和網(wǎng)上的不一樣,所以試了很多種配置都沒(méi)有用。然后我們只能不斷做嘗試

  1. 讓硬件幫忙跳線,跳到和網(wǎng)上的一樣,然后用網(wǎng)上的配置 --- 失敗。

  2. 由于網(wǎng)上的例子都是用4.x的樹(shù)莓派內(nèi)核,而我們用的是5.x的內(nèi)核。所以又猜測(cè)是系統(tǒng)版本原因,網(wǎng)上找了個(gè)舊的樹(shù)莓派鏡像驗(yàn)證 --- 失敗。

  3. 見(jiàn)到這篇博客說(shuō)是電壓?jiǎn)栴},但是我用萬(wàn)用表量電壓是5.17V,接近他所說(shuō)的5.2伏 --- 無(wú)用

  4. 找來(lái)示波器測(cè)量,發(fā)現(xiàn)cs腳在開(kāi)機(jī)的時(shí)候的確有被拉低又拉高 -- 排除樹(shù)莓派gpio引腳的硬件問(wèn)題

解決措施

就這樣卡了兩天,沒(méi)有辦法了在某寶上買(mǎi)了個(gè)用到mcp2515的模塊回來(lái)驗(yàn)證(我們的板子是自己做的),發(fā)現(xiàn)買(mǎi)回來(lái)的是成功的。

那基本定位是硬件問(wèn)題,于是交給硬件對(duì)比差異。經(jīng)過(guò)修改引腳、晶振、最后定位到的確是電壓?jiǎn)栴},但是我們這邊需要將電壓改到3.3v才能用...

最后感慨幾句。這段時(shí)間雖然遇到的大部分問(wèn)題最終都定位到是硬件的問(wèn)題。但是由于芯片都是買(mǎi)的,相當(dāng)于一個(gè)黑盒,硬件修改也比較麻煩,所以需要軟件先調(diào)試分析給出大概的定位。由于嵌入式經(jīng)驗(yàn)不足,i2c、spi、can、i2s等各種硬件協(xié)議都只能現(xiàn)學(xué)現(xiàn)賣(mài)。嵌入式的api又由于需要考慮性能問(wèn)題和應(yīng)用層api側(cè)重易用性的思路不一樣,一堆配置和前置條件比較難用。每天都處于對(duì)自己能力的懷疑當(dāng)中,不確定是否能做好,但所幸大部分問(wèn)題都找到解決或者規(guī)避措施。也算去計(jì)算機(jī)的硬件底層瞄了幾眼,開(kāi)了不少眼界,算是給不平凡的鼠年畫(huà)上了個(gè)特別的句號(hào)。希望明年還能繼續(xù)保持對(duì)學(xué)習(xí)熱情,有趣的東西那么多,為什么不去學(xué)呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容