RaspberryPi 3b с несколькими шинами can (MPC2515))

#raspberry-pi3 #spi #can-bus

#raspberry-pi3 #spi #can-bus

Вопрос:

Я пытаюсь подключить 6 mcp2515 через spi0. Я адаптировал наложение SPI для добавления необходимых строк выбора чипа. Мое новое наложение SPI выглядит следующим образом:

 {
compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";

fragment@0 {
    target = <amp;spi0>;
    frag0: __overlay__ {
        #address-cells = <1>;
        #size-cells = <0>;
        pinctrl-0 = <amp;spi0_pins amp;spi0_cs_pins>;
        status = "okay";
        cs-gpios = <amp;gpio 8 1>, <amp;gpio 7 1>, <amp;gpio 22 1>, <amp;gpio 23 1>, <amp;gpio 24 1>, <amp;gpio 25 1>;

        spidev@0{
            compatible = "spidev";
            reg = <0>;  /* CE0 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };
        spidev@1{
            compatible = "spidev";
            reg = <1>;  /* CE1 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };
        spidev@2{
            compatible = "spidev";
            reg = <2>;  /* CE2 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };

        spidev@3{
            compatible = "spidev";
            reg = <3>;  /* CE3 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };
        spidev@4{
            compatible = "spidev";
            reg = <4>;  /* CE4 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };
        spidev@5{
            compatible = "spidev";
            reg = <5>;  /* CE5 */
            #address-cells = <1>;
            #size-cells = <0>;
            spi-max-frequency = <500000>;
        };
        
                    
    };
};

fragment@1 {
    target = <amp;gpio>;
    __overlay__ {
        spi0_cs_pins: spi0_cs_pins {
            brcm,pins = <7 8 22 23 24 25>;
            brcm,function = <1>; /* out */
        };
    };
};
 

С этим наложением SPI у меня есть 6 spi в / sys/bus/ spi/ devices/

 spi0.0  spi0.1  spi0.2  spi0.3  spi0.4  spi0.5
 

Я также создал новые наложения для mcp2515 (от can0 до can5), чтобы связать их с новыми линиями выбора чипа spi0.

Мой /boot/config.txt выглядит примерно так:

 dtoverlay=spi-gpio-cs-new
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=5
dtoverlay=mcp2515-can4,oscillator=8000000,interrupt=26
dtoverlay=mcp2515-can5,oscillator=8000000,interrupt=27
 

dmesg | grep mcp

 [    7.870207] mcp251x spi0.5 can0: MCP2515 successfully initialized.
[    7.892886] mcp251x spi0.4 can1: MCP2515 successfully initialized.
[    7.908725] mcp251x spi0.0 can2: MCP2515 successfully initialized.
 

ifconfig

 can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

can1: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 36  bytes 180 (180.0 B)
        RX errors 0  dropped 36  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

can2: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 

На данный момент в моем распоряжении только 3 платы mcp2515. Я изменил их в отношении подачи напряжения на приемопередатчик CAN (5 В) и контроллер can (3 В), чтобы не повредить GPIO Raspberry Pi, платы были протестированы индивидуально, и я смог отправлять / получать с ними кадры CAN. Они подключены к малине следующим образом
введите описание изображения здесь

Из этих 3 интерфейсов работает только can1 (spi0.4)! С помощью candump я могу видеть кадры can в сети.

Мой вопрос в том, почему can0 и can2 отключаются при попытке отправки или получения сообщений CAN ( candump и cansend )?

Таблица прерываний ядра

 CPU0       CPU1       CPU2       CPU3       
 17:        217          0          0          0  ARMCTRL-level   1 Edge      3f00b880.mailbox
 18:         47          0          0          0  ARMCTRL-level   2 Edge      VCHIQ doorbell
 40:          0          0          0          0  ARMCTRL-level  48 Edge      bcm2708_fb DMA
 42:        352          0          0          0  ARMCTRL-level  50 Edge      DMA IRQ
 44:       3062          0          0          0  ARMCTRL-level  52 Edge      DMA IRQ
 45:          0          0          0          0  ARMCTRL-level  53 Edge      DMA IRQ
 48:          0          0          0          0  ARMCTRL-level  56 Edge      DMA IRQ
 56:      14104          0          0          0  ARMCTRL-level  64 Edge      dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
 78:          0          0          0          0  ARMCTRL-level  86 Edge      3f204000.spi
 80:        158          0          0          0  ARMCTRL-level  88 Edge      mmc0
 81:       7450          0          0          0  ARMCTRL-level  89 Edge      uart-pl011
 86:       4207          0          0          0  ARMCTRL-level  94 Edge      mmc1
161:          0          0          0          0  bcm2836-timer   0 Edge      arch_timer
162:       1813       1900       2264       1528  bcm2836-timer   1 Edge      arch_timer
165:          0          0          0          0  bcm2836-pmu   9 Edge      arm-pmu
166:          0          0          0          0  lan78xx-irqs  17 Edge      usb-001:004:01
167:          0          0          0          0  pinctrl-bcm2835  26 Edge      spi0.5
168:          6          0          0          0  pinctrl-bcm2835  27 Edge      spi0.4
169:          0          0          0          0  pinctrl-bcm2835   5 Level     spi0.0
FIQ:              usb_fiq
IPI0:          0          0          0          0  CPU wakeup interrupts
IPI1:          0          0          0          0  Timer broadcast interrupts
IPI2:       1469       2966       3711       4460  Rescheduling interrupts
IPI3:        203        798        542        445  Function call interrupts
IPI4:          0          0          0          0  CPU stop interrupts
IPI5:         55         85         41         24  IRQ work interrupts
IPI6:          0          0          0          0  completion interrupts
Err:          0 
 

Из этой таблицы я вижу, что SPI назначаются с прерываниями, но фактически активирован только spi0.4. Как активировать другие 2 прерывания для spi0.0 и spi0.5?

Ответ №1:

Это работает!!! Как я упоминал в своем первом посте, работала только одна плата (can1 spi0.4), после того, как я перепроверил две другие нерабочие платы, я обнаружил, что у одной из них было повреждение оборудования, из-за чего другая плата также не работала. В качестве окончательного вывода мои оверлеи spi и mcp полностью функциональны!

С уважением, Antmar

  [    7.846788] mcp251x spi0.0 can0: MCP2515 successfully initialized.
 [    7.888039] mcp251x spi0.1 can1: MCP2515 successfully initialized.
 [    7.924747] mcp251x spi0.2 can2: MCP2515 successfully initialized.
 [    7.936608] mcp251x spi0.3 can3: MCP2515 successfully initialized.

can0  241   [5]  67 A4 31 F0 C7
can1  2A0   [2]  02 93
can2  241   [5]  67 A4 31 F0 CB
can3  240   [2]  02 6A